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

Definición

Presenta la matriz TextFragment indicada en el formato de salida 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[]

Una matriz de instancias de TextFragment que contienen el texto que se convertirá en voz.

waveHeader
IntPtr

nativeint

IntPtr que señala a una estructura que contiene formato de salida de audio.

site
ITtsEngineSite

Una referencia a una interfaz ITtsEngineSite pasada por la infraestructura de la plataforma para permitir el acceso a los recursos de la infraestructura.

Ejemplos

El ejemplo siguiente forma parte de una implementación de síntesis de voz personalizada que hereda de TtsEngineSsmly mediante el uso de TextFragment, SpeechEventInfo, FragmentStatey TtsEventId

La implementación de Speak

  1. Recibe una matriz de TextFragment instancias y crea una nueva matriz de TextFragment instancias que se pasarán al Speak método en un motor de síntesis subyacente.

  2. Si el TtsEngineAction valor de enumeración encontrado de la Action propiedad en la FragmentState propiedad devuelta por la State propiedad de cada TextFragment instancia es Speak, la implementación

    • Traduce el americanismo a los britishismos en el texto que se va a decir.

    • Si la EventInterest propiedad de las ITtsEngineSite interfaces proporcionadas a la implementación admite el WordBoundary tipo de evento, se usa una SpeechEventInfo instancia para crear un evento para controlar un medidor de progreso del sintetizador.

  3. A continuación, se llama a un motor de representación de voz con la 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);  

}  

Comentarios

La estructura utilizada como waveHeader y devuelta por el método debe ser compatible con la WAVEFORMATEX disponible en SAPI.

struct debe proporcionar una funcionalidad 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 a los implementadores

El sintetizador de voz personalizado implementa el uso TtsEngineSsml y Speak(TextFragment[], IntPtr, ITtsEngineSite) el trabajo como filtros o intermediarios entre aplicaciones de sintetizador construidas mediante la infraestructura de la plataforma a través de los miembros del System.Speech.Synthesis espacio de nombres y los motores de síntesis de voz del sistema subyacentes.

Una Speak(TextFragment[], IntPtr, ITtsEngineSite) implementación:

  1. Capturas o modifica aspectos de los objetos entrantes TextFragment

  2. Genera los eventos necesarios mediante la referencia de sitio a una instancia de .ITtsEngineSite

  3. Genera la voz sintetizada real.

La generación de voz se realiza normalmente mediante una llamada a Speak en uno de los motores de representación de voz proporcionados por el sistema operativo.

Si no se usa uno de los motores de representación de voz disponibles, un objeto heredado de TtsEngineSsml debe crear su propio motor de representación de voz.

Acceso al Speak método en obtenido mediante el Registro y la reflexión. .

Cuando hereda de TtsEngineSsml, debe invalidar los miembros siguientes: TtsEngineSsml(String), AddLexicon(Uri, String, ITtsEngineSite), RemoveLexicon(Uri, ITtsEngineSite), GetOutputFormat(SpeakOutputFormat, IntPtr)y Speak(TextFragment[], IntPtr, ITtsEngineSite).

Se aplica a