TtsEngineSsml.Speak(TextFragment[], IntPtr, ITtsEngineSite) 方法

定义

在指定的输出格式呈现指定的 TextFragment 数组。

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)

参数

fragment
TextFragment[]

包含呈现在语音中的文本的 TextFragment 实例数组。

waveHeader
IntPtr

nativeint

指向包含音频输出格式结构的 IntPtr

site
ITtsEngineSite

对由平台基础结构传入以允许访问基础结构资源的 ITtsEngineSite 接口的引用。

示例

下面的示例是继承自的自定义语音合成实现的一部分 TtsEngineSsml ,并使用 TextFragmentSpeechEventInfoFragmentStateTtsEventId

的实现 Speak

  1. 接收实例的数组 TextFragment ,并创建 TextFragmentSpeak 在基础合成引擎上传递给方法的新的实例数组。

  2. 如果在 TtsEngineAction Action FragmentState 每个实例的属性返回的的属性中找到枚举值 State ,则 TextFragment Speak 实现

  3. 然后,将使用修改后的数组调用语音呈现引擎 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);  

}  

注解

作为方法使用的 waveHeader 和返回的结构应与 WAVEFORMATEX 在 SAPI 下可用的结构兼容。

struct必须提供与相同的功能:

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

实施者说明

自定义语音合成器使用来实现 TtsEngineSsml ,并在 Speak(TextFragment[], IntPtr, ITtsEngineSite) 通过 System.Speech.Synthesis 命名空间和基础系统语音合成引擎的成员使用平台基础结构构造的合成器应用程序之间起到筛选器或中介的作用。

Speak(TextFragment[], IntPtr, ITtsEngineSite)实现:

  1. 捕获或修改传入对象的各个方面 TextFragment
  2. 使用对实例的站点引用生成任何必需事件 ITtsEngineSite
  3. 生成实际合成语音。

通常,生成语音是通过在操作系统提供的一种语音呈现引擎上调用 讲话 来完成的。

如果未使用某个可用的语音呈现引擎,则从继承的对象 TtsEngineSsml 必须创建其自己的语音呈现引擎。

使用注册表和反射获得的对 讲话 方法的访问。 .

当从继承时 TtsEngineSsml ,必须重写以下成员: TtsEngineSsml(String)AddLexicon(Uri, String, ITtsEngineSite)RemoveLexicon(Uri, ITtsEngineSite)GetOutputFormat(SpeakOutputFormat, IntPtr)Speak(TextFragment[], IntPtr, ITtsEngineSite)

适用于