Question SpeechSynthesizer.SetOutputToAudioStreamオーディオ形式の問題
-
05-07-2019 - |
質問
現在、特定のオーディオ形式にエンコードされた音声の送信を必要とするアプリケーションに取り組んでいます。
System.Speech.AudioFormat.SpeechAudioFormatInfo synthFormat =
new System.Speech.AudioFormat.SpeechAudioFormatInfo(System.Speech.AudioFormat.EncodingFormat.Pcm,
8000, 16, 1, 16000, 2, null);
これは、音声がPCM形式、8000サンプル/秒、16ビット/サンプル、モノラル、16000平均バイト/秒、ブロックアライメントが2であることを示します。
次のコードを実行しようとすると、MemoryStreamインスタンスに何も書き込まれません。ただし、1秒あたり8000サンプルから11025まで変更すると、オーディオデータは正常に書き込まれます。
SpeechSynthesizer synthesizer = new SpeechSynthesizer();
waveStream = new MemoryStream();
PromptBuilder pbuilder = new PromptBuilder();
PromptStyle pStyle = new PromptStyle();
pStyle.Emphasis = PromptEmphasis.None;
pStyle.Rate = PromptRate.Fast;
pStyle.Volume = PromptVolume.ExtraLoud;
pbuilder.StartStyle(pStyle);
pbuilder.StartParagraph();
pbuilder.StartVoice(VoiceGender.Male, VoiceAge.Teen, 2);
pbuilder.StartSentence();
pbuilder.AppendText("This is some text.");
pbuilder.EndSentence();
pbuilder.EndVoice();
pbuilder.EndParagraph();
pbuilder.EndStyle();
synthesizer.SetOutputToAudioStream(waveStream, synthFormat);
synthesizer.Speak(pbuilder);
synthesizer.SetOutputToNull();
8000のサンプルレートを使用しても例外やエラーは記録されず、SetOutputToAudioStreamに関するドキュメントで有用なものが見つかりませんでした。なぜ8000ではなく11025サンプル/秒で成功するのですか。いくつかのサウンド編集ツールを使用して生成し、正しいサンプルレートに変換したファイルですが、可能であればアプリケーション内からオーディオを生成したいです。
特定の興味深い点は、SpeechRecognitionEngineがそのオーディオ形式を受け入れ、合成されたwaveファイルで音声を正常に認識したことです...
更新:最近、このオーディオ形式はインストールされた特定の音声では成功するが、他の音声では失敗することが発見されました。 LH MichaelとLH Michelleに特に失敗し、PromptBuilderで定義された特定の音声設定によって失敗が異なります。
解決
LH MichaelとLH Michelleの音声が8000 Hzのサンプルレートをサポートしていない可能性は完全にあります(本質的に8000 Hzのサンプルを生成するため)。 SAPIにより、エンジンはサポートされていないレートを拒否できます。
他のヒント
NAudio ライブラリにいくつかのクラスを作成して、オーディオデータをシンセサイザーから11025でスタックしている場合、異なるサンプルレート。 WaveFormatConversionStream
(ACMを使用)または ResamplerDMO
(DirectX Mediaオブジェクトを使用)をご覧ください
私は同様の問題を抱えていましたが、だれでも助けになる場合に備えて返信を投稿したいと思いました。このスレッドは答えを見つけることに私を導いた。私の問題は、SpeechSynthesizerをWAVファイルに出力し、そのWAVファイルをNAudioで再生していたことでした。ファイルに出力すると、修正なしで機能しました。ただし、MemoryStreamを使用しようとすると再生されますが、聞こえるのはきしみ音だけでした。
SpeechSynthesizerを出力するための次のコードは問題を修正し、NAudio側での修正は不要です。
SpeechAudioFormatInfo synthFormat = new SpeechAudioFormatInfo(EncodingFormat.Pcm, 88200, 16, 1, 16000, 2, null);
synth.SetOutputToAudioStream(streamAudio, synthFormat);
88200がキーです。デフォルトでは、これは11025です。SpeechAudioFormatInfoを作成して88200に設定するだけで十分です。