Condividi tramite


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

Definizione

Esegue il rendering della matrice specificata 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 TextFragment istanze che contengono il testo di cui eseguire il rendering in voce.

waveHeader
IntPtr

nativeint

Oggetto 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 personalizzata della sintesi vocale che eredita da TtsEngineSsmle usando l'uso di TextFragment, SpeechEventInfoFragmentState, eTtsEventId

Implementazione di Speak

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

  2. Se il TtsEngineAction valore di enumerazione trovato dalla Action proprietà nell'oggetto FragmentState restituito dalla State proprietà di ogni TextFragment istanza è Speak, l'implementazione

    • Traduce l'americanismo in britishismi nel testo da pronunciare.

    • Se la EventInterest proprietà nelle ITtsEngineSite interfacce fornite all'implementazione supporta il WordBoundary tipo di evento, viene usata un'istanza SpeechEventInfo di per creare un evento per l'unità di un contatore dello stato di avanzamento 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 usata come waveHeader e restituita dal metodo deve essere compatibile con l'oggetto WAVEFORMATEX disponibile in SAPI.

Deve struct 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) funzionano come filtri o intermediari tra le applicazioni di sintetizzatore costruite usando l'infrastruttura della piattaforma tramite i membri dello System.Speech.Synthesis spazio dei nomi e i motori di sintesi vocale di sistema sottostanti.

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

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

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

  3. Genera il riconoscimento vocale sintetizzato effettivo.

La generazione del parlato viene in genere eseguita chiamando Speak su 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 un 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