2009-02-12 13 views
10

Qual è la differenza tra questi due metodi in C# utilizzando l'API discorso o SAPI?qual è la differenza tra lo SpVoice e SpeechSynthesizer

using SpeechLib; 
SpVoice speech = new SpVoice(); 
speech.Speak(text, SpeechVoiceSpeakFlags.SVSFlagsAsync); 

restituisce il Apacela voices, e

SpeechSynthesizer ss = new SpeechSynthesizer(); 
ss.SpeakAsync ("Hello, world"); 

non funziona con Apacela voices.

La prima di ritorno tutte le voci, ma la seconda restituiscono solo poche voci. Questo è qualcosa correlato a SAPI 5.1 e SAPI 5.3?

Il comportamento è lo stesso su Vista e XP, su entrambi SpVoice è stato in grado di rilevare la voce Apacela ma utilizzando SpeechSynthesizer, le voci non vengono rilevate su XP e Vista.

Immagino che XP utilizzi SAPI 5.1 e Vista utilizzi SAPI 5.3 quindi perché lo stesso comportamento su tutto il sistema operativo, ma un comportamento diverso con l'API?

anche che API è più potente e quali sono le differenza tra i due modi/API?

+0

2017 riassunto qui: https://www.webbie.org.uk/blog/microsoft-speech/ –

risposta

3

SpeechLib è una DLL interop e quindi esegue il mapping a qualsiasi versione di SpeechLib per cui è stata creata (è possibile controllarne le proprietà).

System.Speech. * È il supporto "ufficiale" per il discorso nel framework .NET. SpeechSynthesizer sceglie quale libreria vocale usare al runtime (proprio come facevano le classi System.Web.Mail).

Non sono sicuro del motivo per cui restituiscono un numero diverso di voci, ma è probabile che siano correlate alla versione SAPI utilizzata.

+0

curato la questione con più descrizione, spero che si desidera condividere più informazioni, come il problema non è legato alla runtime, ma le differenze API. –

+0

La mia ipotesi è che la voce Apacela non supporti le nuove API in SAPI 5.3, quindi System.Speech (con 5.3 in Vista) non può accedervi. Ovviamente 5.3 rappresenta ciò che Microsoft supporterà andando avanti, ma se hai bisogno di quella voce forse dovresti usare SpeechLib. –

+0

Come ho scritto che XP usa SAPI 5.1 e anche lì non è in grado di rilevare la voce. –

6

SpeechLib è un DLL di interoperabilità che fa uso del classico SAPI COM-based sotto le coperte. System.Speech è stato sviluppato da Microsoft per interagire con Text-to-speech (e riconoscimento vocale) direttamente dal codice gestito.

In generale, è più pulito attenersi alla libreria gestita (System.Speech) quando si scrive un'applicazione gestita.

Non è sicuramente correlato alla versione SAPI - il problema più probabile è che un fornitore vocale (in questo caso Acapela) deve implementare esplicitamente il supporto per alcune funzionalità di System.Speech. È possibile che le voci di Acapela supportino tutto ciò che è richiesto, ma è anche possibile che non lo siano. La tua migliore scommessa sarebbe a ask the Acapela Group directly.

Le voci sono registrate in HKLM \ SOFTWARE \ Microsoft \ Speech \ Tokens, e dovresti vedere le voci integrate di Windows, così come le voci Acapela che hai aggiunto elencate qui. Se noti differenze evidenti nel modo in cui sono registrati, puoi essere in grado di far funzionare le voci di Acapela facendo corrispondere la loro registrazione, ad esempio, a MS-Anna.

Ma direi che la possibilità più probabile è che le voci di Acapela non siano state aggiornate per supportare tutte le interfacce richieste da System.Speech.

+0

Grazie per la risposta, il supporto Acapela è spazzatura e non ha risposto alle mie domande che ho chiesto loro più di 10 giorni indietro. La risposta che ho ottenuto è: È un problema noto con .NET 3.5 che non è collegato al nostro prodotto. Stiamo aspettando un aggiornamento da Microsoft (bug collegato a TokenEnums non supportato) –

+0

La modifica del registro rileva le voci ma provoca un arresto anomalo quando si seleziona quella voce. Quindi, sto assumendo che questo sia un errore del fornitore solo Microsoft o Acapela (molto probabilmente). –

Problemi correlati