15

テキスト読み上げを実行していますが、レキシコンファイルでいくつかの特別な発音を指定したいと思います。私は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もちろん、指定どおりにファイルを保存しました。

@"C:\Temp\whatchamacallit.pls"URIとファイルの場所(たとえば、@"file:///c:\test\whatchamacallit.pls")、絶対パスと相対パスのバリエーション、ビルドフォルダーへのコピーなどを試しました。

Process Monitorを実行しましたが、ファイルにアクセスできません。それがディレクトリ/ファイルのアクセス許可の問題である場合(そうではありません)、アクセス拒否のメッセージが表示されますが、テキストエディタからの時折の参照を除いて、参照はまったく記録されません。試してみると、アクセスされたファイルが表示されますFile.OpenRead

残念ながら、ガベージウリを使用してもエラーメッセージは表示されません。

さらに調査したところ、この例はMicrosoft.Speech.Synthesisからのものであることがわかりましたが、ここではSystem.Speech.Synthesisを使用しています。しかし、私が知る限り、いくつかの追加情報と例を除いてそれらは同一であり、両方とも同じ仕様を指しています。これはまだ問題でしょうか?

プロジェクトが適切な.NETFramework4を使用するように設定されていることを確認しました。

私はMSDNの例を参照されている仕様の例と比較し、それらを完全に試しましたが、役に立ちませんでした。ファイルがアクセスされていないように思われることを考えると、私は驚かない。

(私はPromptBuilder.AppendTextWithPronunciation問題なく使用できますが、私のユースケースには適していません。)

MSDNの例は壊れていますか?SpeechSynthesizerでレキシコンを使用するにはどうすればよいですか?

4

3 に答える 3

10

多くの調査と落とし穴の後で、私はあなたの仮定がまったく間違っていることをあなたに保証することができます。何らかの理由System.Speech.Synthesis.SpeechSynthesizer.AddLexicon()で、レキシコンを内部リストに追加しますが、まったく使用しません。これまで誰も使ってみなかったようで、このバグは見過ごされていました。

Microsoft.Speech.Synthesis.SpeechSynthesizer.AddLexicon()一方、(Microsoft Speech SDKに属します)は期待どおりに機能します(レキシコンをCOMオブジェクトに渡し、アドバタイズされたものとして解釈します)。

SDKのインストール方法については、次のガイドを参照してください:http: //msdn.microsoft.com/en-us/library/hh362873%28v=office.14%29.aspx

ノート:

  • 人々は64ビットバージョンがCOM例外を引き起こすと報告しました(ライブラリが正しくインストールされないため)、私は64ビットWindows7マシンでこれを確認しました
    • x86バージョンを使用すると、問題を回避できます
  • SDKの前にランタイムをインストールしてください
  • SDKはデフォルトのシステム音声エンジンを使用しないため、(リンク先のページでアドバイスされているように)ランタイム言語もインストールしてください。
于 2012-11-22T00:21:28.020 に答える
2

System.Speech.Synthesis.SpeechSynthesizer.SpeakSsml()レキシコンの代わりに使用できます。

このコードは、「青」の発音を「黄色」に、「犬」の発音を「魚」に変更します。

SpeechSynthesizer synth = new SpeechSynthesizer();
string text = "This is a blue dog";
Dictionary<string, string> phonemeDictionary = new Dictionary<string, string> { { "blue", "jelow" }, { "dog", "fyʃ" } };
foreach (var element in phonemeDictionary)
{
   text = text.Replace(element.Key, "<phoneme ph=\"" + element.Value + "\">" + element.Key + "</phoneme>");
}
text = "<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"en-US\">" + text + "</speak>";
synth.SpeakSsml(text);

于 2019-11-25T15:58:47.347 に答える
1

私は最近、Windows10でこれを調べています。

で発見したことが2つありますSystem.Speech.Synthesis

使用する音声はすべて、レキシコンファイルの言語と照合する必要があります。レキシコン内には次の言語があります。

<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");

私が発見したもう1つのことは、「Microsoft Zira Desktop-英語(米国)」ではまったく機能しないことです。どうしてか分かりません。これは、Windows10のデフォルトの音声のようです。

ここからデフォルトの音声にアクセスして変更します:%windir%\ system32 \ Speech \ SpeechUX \ SAPI.cpl

それ以外の場合は、コードを介して設定できるはずです。

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

私にはDavid(米国)とHazel(英国)がいますが、どちらでも問題なく動作します。SpLexiconこれは、レジストリ内の音声トークンにキー値があるかどうかに直接関係しているようです。Microsoft Zira Desktopの音声には、このレジストリ値はありません。Microsoft David Desktopの音声には次のものがあります: Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_EN-US_DAVID_11.0\Attributes\SpLexicon={0655E396-25D0-11D3-9C26-00C04F8EF87C}

于 2019-03-25T04:50:48.840 に答える