Compartilhar via


TtsEngineSsml.Speak(TextFragment[], IntPtr, ITtsEngineSite) Método

Definição

Renderiza a matriz TextFragment especificada no formato de saída especificado.

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)

Parâmetros

fragment
TextFragment[]

Uma matriz de instâncias TextFragment contendo o texto a ser renderizado em fala.

waveHeader
IntPtr

nativeint

Um IntPtr apontando para uma estrutura que contém o formato de saída de áudio.

site
ITtsEngineSite

Uma referência a uma interface ITtsEngineSite passada pela infraestrutura de plataforma para permitir o acesso aos recursos de infraestrutura.

Exemplos

O exemplo a seguir faz parte de uma implementação de síntese de fala personalizada herdando de TtsEngineSsmle usando o uso de TextFragment, SpeechEventInfo, FragmentStatee TtsEventId

A implementação de Speak

  1. Recebe uma matriz de TextFragment instâncias e cria uma nova matriz de TextFragment instâncias a serem passadas para o Speak método em um mecanismo de síntese subjacente.

  2. Se o TtsEngineAction valor de enumeração encontrado na Action propriedade no FragmentState retornado pela State propriedade de cada TextFragment instância for Speak, a implementação

    • Traduz o americanismo para os britânicos no texto a ser falado.

    • Se a EventInterest propriedade nas ITtsEngineSite interfaces fornecidas à implementação der suporte ao WordBoundary tipo de evento, uma SpeechEventInfo instância será usada para criar um evento para conduzir um medidor de progresso do sintetizador.

  3. Em seguida, um mecanismo de renderização de fala é chamado com a matriz modificada 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);  

}  

Comentários

A estrutura usada como waveHeader e retornada pelo método deve ser compatível com a WAVEFORMATEX disponível em SAPI.

O struct deve fornecer funcionalidade equivalente 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;  
}  

Notas aos Implementadores

O sintetizador de fala personalizado implementa o uso TtsEngineSsml e Speak(TextFragment[], IntPtr, ITtsEngineSite) o trabalho como filtros ou intermediários entre aplicativos sintetizadores construídos usando a infraestrutura de plataforma por meio dos membros do namespace e dos System.Speech.Synthesis mecanismos de síntese de fala do sistema subjacente.

Uma Speak(TextFragment[], IntPtr, ITtsEngineSite) implementação:

  1. Intercepta ou modifica aspectos dos objetos de entrada TextFragment

  2. Gera todos os eventos necessários usando a referência do site para uma ITtsEngineSite instância

  3. Gera a fala sintetizada real.

A geração de fala normalmente é feita chamando Speak um dos mecanismos de renderização de fala fornecidos pelo sistema operacional.

Se um dos mecanismos de renderização de fala disponíveis não for usado, um objeto herdado de TtsEngineSsml deverá criar seu próprio mecanismo de renderização de fala.

Acesso ao Speak método obtido usando o registro e a reflexão. .

Ao herdar de TtsEngineSsml, você deve substituir os seguintes membros: TtsEngineSsml(String), AddLexicon(Uri, String, ITtsEngineSite), RemoveLexicon(Uri, ITtsEngineSite), GetOutputFormat(SpeakOutputFormat, IntPtr)e Speak(TextFragment[], IntPtr, ITtsEngineSite).

Aplica-se a