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 陣列,並建立新的實例陣列 TextFragment ,以傳遞至 Speak 基礎合成引擎上的 方法。

  2. TtsEngineAction如果從 Action 每個 TextFragment 實例的 屬性所傳回 State 之 屬性 FragmentState 找到的列舉值為 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;  
}  

給實施者的注意事項

自訂語音合成器會使用 實作 , TtsEngineSsmlSpeak(TextFragment[], IntPtr, ITtsEngineSite) 透過命名空間和基礎系統語音合成引擎的成員 System.Speech.Synthesis ,在使用平臺基礎結構所建構的合成器應用程式之間進行篩選或中繼。

實作 Speak(TextFragment[], IntPtr, ITtsEngineSite)

  1. 擷設或修改傳入 TextFragment 物件的層面

  2. 使用實例的月臺參考 ITtsEngineSite 產生任何必要事件

  3. 產生實際的合成語音。

產生語音通常是藉由呼叫 Speak 作業系統所提供的其中一個語音轉譯引擎來完成。

如果未使用其中一個可用的語音轉譯引擎,繼承自 TtsEngineSsml 的物件必須建立自己的語音轉譯引擎。

Speak使用登錄和反映取得之 方法的存取權。 .

當您繼承自 TtsEngineSsml 時,必須覆寫下列成員: TtsEngineSsml(String)AddLexicon(Uri, String, ITtsEngineSite)RemoveLexicon(Uri, ITtsEngineSite)GetOutputFormat(SpeakOutputFormat, IntPtr) 、 和 Speak(TextFragment[], IntPtr, ITtsEngineSite)

適用於