TtsEngineSsml.Speak(TextFragment[], IntPtr, ITtsEngineSite) 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
在指定的输出格式呈现指定的 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 实例数组。
- site
- ITtsEngineSite
对由平台基础结构传入以允许访问基础结构资源的 ITtsEngineSite 接口的引用。
示例
下面的示例是继承自的自定义语音合成实现的一部分 TtsEngineSsml ,并使用 TextFragment 、 SpeechEventInfo 、 FragmentState 和 TtsEventId
的实现 Speak
接收实例的数组 TextFragment ,并创建 TextFragment 要
Speak
在基础合成引擎上传递给方法的新的实例数组。如果在 TtsEngineAction Action FragmentState 每个实例的属性返回的的属性中找到枚举值 State ,则 TextFragment Speak 实现
将 Americanism 转换为要口述的文本中的 Britishisms。
如果 EventInterest ITtsEngineSite 提供给实现的接口上的属性支持 WordBoundary 事件类型,则 SpeechEventInfo 使用实例创建事件来驱动合成器进度计量。
然后,将使用修改后的数组调用语音呈现引擎 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)实现:
- 捕获或修改传入对象的各个方面 TextFragment
- 使用对实例的站点引用生成任何必需事件 ITtsEngineSite
- 生成实际合成语音。
通常,生成语音是通过在操作系统提供的一种语音呈现引擎上调用 讲话
来完成的。
如果未使用某个可用的语音呈现引擎,则从继承的对象 TtsEngineSsml 必须创建其自己的语音呈现引擎。
使用注册表和反射获得的对 讲话
方法的访问。 .
当从继承时 TtsEngineSsml ,必须重写以下成员: TtsEngineSsml(String) 、 AddLexicon(Uri, String, ITtsEngineSite) 、 RemoveLexicon(Uri, ITtsEngineSite) 、 GetOutputFormat(SpeakOutputFormat, IntPtr) 和 Speak(TextFragment[], IntPtr, ITtsEngineSite) 。