質問

現在、特定のオーディオ形式にエンコードされた音声の送信を必要とするアプリケーションに取り組んでいます。

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に設定するだけで十分です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top