TtsEngineSsml.Speak(TextFragment[], IntPtr, ITtsEngineSite) Metodo

Definizione

Esegue il rendering della matrice TextFragment nel formato di output specificato.

public:
 abstract void Speak(cli::array <System::Speech::Synthesis::TtsEngine::TextFragment ^> ^ fragment, IntPtr waveHeader, System::Speech::Synthesis::TtsEngine::ITtsEngineSite ^ site);
public abstract void Speak (System.Speech.Synthesis.TtsEngine.TextFragment[] fragment, IntPtr waveHeader, System.Speech.Synthesis.TtsEngine.ITtsEngineSite site);
abstract member Speak : System.Speech.Synthesis.TtsEngine.TextFragment[] * nativeint * System.Speech.Synthesis.TtsEngine.ITtsEngineSite -> unit
Public MustOverride Sub Speak (fragment As TextFragment(), waveHeader As IntPtr, site As ITtsEngineSite)

Parametri

fragment
TextFragment[]

Matrice di istanze di TextFragment che contengono il testo di cui eseguire il rendering come input vocale.

waveHeader
IntPtr

nativeint

IntPtr che punta a una struttura contenente il formato di output audio.

site
ITtsEngineSite

Riferimento a un'interfaccia ITtsEngineSite passata dall'infrastruttura della piattaforma per consentire l'accesso alle risorse dell'infrastruttura.

Esempio

L'esempio seguente fa parte di un'implementazione di sintesi vocale personalizzata che eredita da TtsEngineSsmle usando l'uso di TextFragment, SpeechEventInfoFragmentState, eTtsEventId

Implementazione di Speak

  1. Riceve una matrice di istanze e crea una nuova matrice di TextFragmentTextFragment istanze da passare al Speak metodo in un motore di sintesi sottostante.

  2. Se il TtsEngineAction valore di enumerazione trovato dalla proprietà sulla proprietà restituita dalla ActionState proprietà FragmentState di ogni TextFragment istanza è Speak, l'implementazione

    • Traduce l'americanismo nei britishismi nel testo da parlare.

    • Se la EventInterest proprietà nelle ITtsEngineSite interfacce fornite all'implementazione supporta il WordBoundary tipo di evento, SpeechEventInfo viene usata un'istanza per creare un evento per guidare un contatore di stato del sintetizzatore.

  3. Viene quindi chiamato un motore di rendering vocale con la matrice modificata TextFragment .

private const int WordBoundaryFlag = 1 << (int)TtsEventId.WordBoundary;  
private readonly char[] spaces = new char[] { ' ', '\t', '\r', '\n' };  
internal struct UsVsUk  
{  
  internal string UK;  
  internal string US;  
}  

override public void Speak (TextFragment [] frags, IntPtr wfx, ITtsEngineSite site)  
{  
  TextFragment [] newFrags=new TextFragment[frags.Length];  

  for (int i=0;i<frags.Length;i++){  
    newFrags[i].State=frags[i].State;  
    //truncate  
    newFrags[i].TextToSpeak = frags[i].TextToSpeak.Substring(frags[i].TextOffset,  
                               frags[i].TextLength);  
    newFrags[i].TextLength = newFrags[i].TextToSpeak.Length;  
    newFrags[i].TextOffset = 0;  
    if (newFrags[i].State.Action == TtsEngineAction.Speak) {  
      //Us to UK conversion  
      foreach (UsVsUk term in TransList) {  
      newFrags[i].TextToSpeak.Replace(term.US, term.UK);  
      }  
      //Generate progress meter events if supported  
      if ((site.EventInterest & WordBoundaryFlag) != 0) {  
      string[] subs = newFrags[i].TextToSpeak.Split(spaces);  

      foreach (string s in subs) {  
        int offset = newFrags[i].TextOffset;  
        SpeechEventInfo spEvent = new SpeechEventInfo((Int16)TtsEventId.WordBoundary,   
                (Int16)EventParameterType.Undefined,   
                 s.Length, new IntPtr(offset));  
        offset += s.Length;  
        if (s.Trim().Length > 0) {  
          SpeechEventInfo[] events = new SpeechEventInfo[1];  
          events[0] = spEvent;  
          site.AddEvents(events, 1);  
        }  
      }  
      }  
    }  
  }  
    _baseSynthesize.Speak(newFrags, wfx, site);  

}  

Commenti

La struttura utilizzata come waveHeader e restituita dal metodo deve essere compatibile con l'oggetto WAVEFORMATEX disponibile in SAPI.

L'oggetto struct deve fornire funzionalità equivalenti a:

internal struct WaveFormat  
{  
    public Int16 FormatTag;  
    public Int16 Channels;  
    public int SamplesPerSec;  
    public int AvgBytesPerSec;  
    public Int16 BlockAlign;  
    public Int16 BitsPerSample;  
    public Int16 Size;  
}  

Note per gli implementatori

Il sintetizzatore vocale personalizzato implementa l'uso TtsEngineSsml e Speak(TextFragment[], IntPtr, ITtsEngineSite) il funzionamento come filtri o intermediari tra applicazioni di sintetizzatore costruite usando l'infrastruttura System.Speech.Synthesis della piattaforma tramite i membri dello spazio dei nomi e i motori di sintesi vocale sottostanti.

Implementazione Speak(TextFragment[], IntPtr, ITtsEngineSite) :

  1. Trap o modificare gli aspetti degli oggetti in ingresso TextFragment

  2. Genera eventuali eventi necessari usando il riferimento al sito a un'istanza ITtsEngineSite

  3. Genera il riconoscimento vocale sintetizzato effettivo.

La generazione del riconoscimento vocale viene in genere eseguita chiamando Speak uno dei motori di rendering vocale forniti dal sistema operativo.

Se uno dei motori di rendering vocale disponibili non viene usato, un oggetto che eredita da TtsEngineSsml deve creare il proprio motore di rendering vocale.

Accesso al Speak metodo ottenuto usando il Registro di sistema e la reflection. .

Quando si eredita da TtsEngineSsml, è necessario eseguire l'override dei membri seguenti: TtsEngineSsml(String), AddLexicon(Uri, String, ITtsEngineSite)RemoveLexicon(Uri, ITtsEngineSite), , GetOutputFormat(SpeakOutputFormat, IntPtr)e Speak(TextFragment[], IntPtr, ITtsEngineSite).

Si applica a