如何使用与SpeechSynthesizer词库?(How do I use a lexicon w

2019-06-26 08:52发布

我进行一些文本到语音,我想在词库文件中指定一些特殊的发音。 我已经跑了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"绝对和相对路径,复制它到生成文件夹,等等。

我跑进程监视器 ,而不是访问的文件。 如果它是一个目录/文件权限的问题(这是不是),我仍然会看到访问被拒绝的消息,但是我不记录在参考以外的所有从我的文字编辑器偶尔之一。 我确实看到访问的文件,当我尝试File.OpenRead

不幸的是有使用垃圾乌里时没有错误消息。

在进一步的调查,我意识到这个例子来自Microsoft.Speech.Synthesis ,而我使用System.Speech.Synthesis在这里。 但是从我可以告诉他们,除了一些额外的信息和实例都指向同规格相同。 难道这仍然是问题?

我验证了项目设置为使用正确的.NET Framework 4。

我比较了MSDN的例子从引用的规范的例子 ,以及那些试图彻底,但它并没有帮助。 考虑到文件似乎并没有被访问,我并不感到惊讶。

(我可以用PromptBuilder.AppendTextWithPronunciation得很好,但它是我的使用情况较差的替代方案。)

是MSDN上的例子坏了吗? 如何使用与SpeechSynthesizer词库?

Answer 1:

大量的研究和陷阱后,我可以向你保证,你的假设是完全错误的。 出于某种原因, System.Speech.Synthesis.SpeechSynthesizer.AddLexicon()添加词库到内部列表中,但不会在所有使用它。 好像没人使用前它试图和这个bug置若罔闻。

Microsoft.Speech.Synthesis.SpeechSynthesizer.AddLexicon()属于微软的语音SDK),另一方面按预期工作(它传递给其解释为发布的COM对象的词汇)。

请参阅本指南对如何安装SDK: http://msdn.microsoft.com/en-us/library/hh362873%28v=office.14%29.aspx

笔记:

  • 群众举报的64位版本,以使COM异常(因为该库不能正确安装),我证实了这一点在64位的Windows 7机器
    • 使用x86版本规避问题
  • 可以肯定的SDK之前安装运行时
  • 一定要同时安装运行时的语言(如劝链接的页面上)作为SDK不使用系统默认的语音引擎


Answer 2:

我已经在Windows 10寻找到这一点最近。

有两件事情我发现。

你使用任何声音,必须针对词汇文件中的语言相匹配。 词库里面你的语言:

 <lexicon version="1.0" xmlns="http://www.w3.org/2005/01/pronunciation-lexicon" alphabet="x-microsoft-ups" xml:lang="en-US"> 

我发现我可以说出我的词汇为“blue.en-US.pls”,然后复印一份以“blue.en-GB.pls”。 它里面都会有XML:LANG = “EN-GB”

在代码中你会使用:

 string langFile = Path.Combine(_appPath, $"blue.{synth.Voice.Culture.IetfLanguageTag}.pls"); synth.AddLexicon(new Uri(langFile), "application/pls+xml"); 

我发现另一件事是,它不与“微软桌面济拉 - 英语(美国)”在所有的工作。 我不知道为什么。 这似乎是在Windows 10的默认声音。

访问和更改您的默认语音:%WINDIR%\ SYSTEM32 \语音\ SpeechUX \ SAPI.cpl

否则,你应该能够通过代码来设置它:

 var voices = synth.GetInstalledVoices(); var voice = voices.First(v => v.VoiceInfo.Name.Contains("David")); // US. David, Hazel, Zira synth.SelectVoice(voice.VoiceInfo.Name); 

我有大卫(美国)和黑兹尔(英国),和正常工作和这两个的。



文章来源: How do I use a lexicon with SpeechSynthesizer?