C# 如何将词典与SpeechSynthesizer结合使用?

C# 如何将词典与SpeechSynthesizer结合使用?,c#,text-to-speech,C#,Text To Speech,我正在执行一些文本到语音转换,我想在词典文件中指定一些特殊的发音。我已经逐字逐句地运行了,它说出了句子,但它没有使用给定的词汇,有些东西似乎被破坏了 下面是提供的示例: using System; using Microsoft.Speech.Synthesis; namespace SampleSynthesis { class Program { static void Main(string[] args) { // Initialize a new

我正在执行一些文本到语音转换,我想在词典文件中指定一些特殊的发音。我已经逐字逐句地运行了,它说出了句子,但它没有使用给定的词汇,有些东西似乎被破坏了

下面是提供的示例:

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>

什么名字
W S1 AX T CH AX M AX K S2 AA L IH T
控制台打开,文本被说出,但新的发音不被使用。我当然已经按照规定将文件保存到
c:\test\whatchamacallit.pls

我尝试过Uri和文件位置的变化(例如
@“C:\Temp\whatchamacallit.pls”
@)file:///c:\测试\whatchamacallit.pls“
),绝对和相对路径,将其复制到构建文件夹中,等等

我已运行,但文件未被访问。如果是目录/文件权限问题(事实并非如此),我仍然会看到拒绝访问的消息,但是除了偶尔从文本编辑器中看到的消息外,我根本没有记录任何引用。当我尝试
file.OpenRead
时,确实看到访问的文件

不幸的是,使用垃圾Uri时没有错误消息

在进一步的调查中,我意识到这个例子来自,而我在这里使用的是。然而,从我能告诉他们的是相同的,除了一些额外的信息和例子,都指向相同的规范。这还会是问题吗

我验证了项目是否设置为使用正确的.NETFramework 4

我将MSDN中的示例与进行了比较,并直接尝试了这些示例,但没有任何帮助。考虑到文件似乎没有被访问,我并不感到惊讶

(我可以使用
PromptBuilder.AppendTextWithReposition
很好,但对于我的用例来说,这是一个糟糕的选择。)


MSDN上的示例是否已损坏?如何将词典与SpeechSynthesizer结合使用?

经过大量研究和陷阱,我可以向您保证,您的假设完全是错误的。 出于某种原因,
System.Speech.Synthesis.SpeechSynthesizer.AddLexicon()
将词典添加到内部列表中,但根本不使用它。 似乎以前没有人尝试过使用它,而这个bug却没有被注意到

另一方面,Microsoft.Speech.Synthesis.SpeechSynthesizer.AddLexicon()(属于Microsoft Speech SDK)工作正常(它将词典传递给COM对象,COM对象将其解释为广告)

有关如何安装SDK,请参阅本指南:

注:

  • 有人报告说64位版本会导致COM异常(因为库没有正确安装),我在64位Windows 7计算机上确认了这一点
    • 使用x86版本可以避免这个问题
  • 请确保在安装SDK之前安装运行时
  • 由于SDK不使用默认的系统语音引擎,请确保安装运行时语言(如链接页面上的建议)

我最近在Windows 10上对此进行了一些研究

我在
System.Speech.Synthesis
中发现了两件事

您使用的任何语音都必须与词典文件中的语言相匹配。 在词典中,您可以使用以下语言:
您可以使用
System.Speech.Synthesis.SpeechSynthesizer.SpeakSsml()
而不是词典

该代码将“蓝色”的发音改为“黄色”,将“狗”的发音改为“鱼”

SpeechSynthesizer synth=新的SpeechSynthesizer();
string text=“这是一只蓝色的狗”;
Dictionary phonemeDictionary=新字典{{“blue”、“jelow”}、{“dog”、“fyʃ”};
foreach(phonemeDictionary中的var元素)
{
text=text.Replace(element.Key,“+element.Key+”);
}
text=”“+text+”;

synth.SpeakSsml(文本)我的意思是,从我可以看出,文档是相同的。终于有答案了!谢谢文档是完全相同的,这在任何地方都没有作为一个已知的bug被提及,这很奇怪。无论如何,不客气,希望有帮助:)