Linguagem

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

Definição

Renderiza o array especificado TextFragment 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[]

Um conjunto de TextFragment instâncias contendo o texto a ser transformado em fala.

waveHeader
IntPtr

nativeint

Um apontar para uma estrutura contendo IntPtr formato de saída de áudio.

site
ITtsEngineSite

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

Exemplos

O exemplo abaixo faz parte de uma implementação personalizada de síntese de voz que herda de TtsEngineSsml, e utiliza o uso de TextFragment, SpeechEventInfo, FragmentState, e TtsEventId

A implementação de Speak

  1. Recebe um array de TextFragment instâncias e cria um novo array de TextFragment instâncias para serem passados ao Speak método num motor de síntese subjacente.

  2. Se o TtsEngineAction valor de enumeração por encontrado a partir da Action propriedade em o FragmentState devolvido pela State propriedade de cada TextFragment instância for Speak, a implementação

    • Traduz o americanismo para os britishismos no texto a ser falado.

    • Se a EventInterest propriedade nas ITtsEngineSite interfaces fornecidas à implementação suportar o WordBoundary tipo de evento, uma SpeechEventInfo instância é usada para criar um evento que impulsione um medidor de progresso do sintetizador.

  3. É então chamado um motor de renderização de fala com o array modificado 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);

}

Observações

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

Deve struct fornecer funcionalidades equivalentes 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 para Implementadores

Sintetizadores de voz personalizados implementam e TtsEngineSsmlSpeak(TextFragment[], IntPtr, ITtsEngineSite) funcionam como filtros ou intermediários entre aplicações de sintetizador construídas usando a infraestrutura da plataforma através dos membros do System.Speech.Synthesis namespace e dos motores de síntese de voz do sistema subjacente.

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

  1. Aprisionar ou modificar aspetos dos objetos que TextFragment entram

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

  3. Gera a fala sintetizada realmente.

A geração de fala é mais tipicamente feita apelando Speak a um dos motores de renderização de fala fornecidos pelo sistema operativo.

Se um dos motores de renderização de fala disponíveis não for utilizado, um objeto que herda de TtsEngineSsml terá de criar o seu próprio motor de renderização de voz.

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

Quando herdas de TtsEngineSsml, deves sobrepor os seguintes membros: TtsEngineSsml(String), AddLexicon(Uri, String, ITtsEngineSite), RemoveLexicon(Uri, ITtsEngineSite), GetOutputFormat(SpeakOutputFormat, IntPtr), e Speak(TextFragment[], IntPtr, ITtsEngineSite).

Aplica-se a