我正在执行一些文本到语音转换,我想在词典文件中指定一些特殊的发音。我已经逐字运行了MSDN 的 AddLexicon 示例,它说出了这个句子,但它没有使用给定的词典,似乎有些东西被破坏了。
这是提供的示例:
using System;
using Microsoft.Speech.Synthesis;
namespace SampleSynthesis
{
class Program
{
static void Main(string[] args)
{
// Initialize a new instance of the SpeechSynthesizer.
using (SpeechSynthesizer synth = new SpeechSynthesizer())
{
// Configure the audio output.
synth.SetOutputToDefaultAudioDevice();
PromptBuilder builder = new PromptBuilder();
builder.AppendText("Gimme the whatchamacallit.");
// Append the lexicon file.
synth.AddLexicon(new Uri("c:\\test\\whatchamacallit.pls"), "application/pls+xml");
// Speak the prompt and play back the output file.
synth.Speak(builder);
}
Console.WriteLine();
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
和词典文件:
<lexicon version="1.0"
xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon
http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd"
alphabet="x-microsoft-ups" xml:lang="en-US">
<lexeme>
<grapheme> whatchamacallit </grapheme>
<phoneme> W S1 AX T CH AX M AX K S2 AA L IH T </phoneme>
</lexeme>
</lexicon>
控制台打开,说出文本,但不使用新的发音。我当然已经将文件保存到c:\test\whatchamacallit.pls
指定的位置。
我尝试了 Uri 和文件位置(例如@"C:\Temp\whatchamacallit.pls"
, @"file:///c:\test\whatchamacallit.pls"
)、绝对路径和相对路径、将其复制到构建文件夹等的变体。
我运行了Process Monitor并且没有访问该文件。如果是目录/文件权限问题(不是),我仍然会看到拒绝访问消息,但是除了偶尔来自我的文本编辑器的参考之外,我根本没有记录任何参考。我在尝试时确实看到了访问的文件File.OpenRead
。
不幸的是,使用垃圾 Uri 时没有错误消息。
经过进一步调查,我意识到这个例子来自Microsoft.Speech.Synthesis,而我在这里使用System.Speech.Synthesis。但是据我所知,除了一些额外的信息和示例之外,它们是相同的,并且都指向相同的规范。这仍然是问题吗?
我确认该项目已设置为使用正确的 .NET Framework 4。
我将 MSDN 中的示例与引用规范中的示例进行了比较,并直接尝试了这些示例,但没有帮助。考虑到该文件似乎没有被访问,我并不感到惊讶。
(我可以PromptBuilder.AppendTextWithPronunciation
很好地使用,但对于我的用例来说这是一个糟糕的选择。)
MSDN上的例子坏了吗?如何在 SpeechSynthesizer 中使用词典?