5

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

System.Speech.AudioFormat.SpeechAudioFormatInfo synthFormat = 
                        new System.Speech.AudioFormat.SpeechAudioFormatInfo(System.Speech.AudioFormat.EncodingFormat.Pcm, 
                            8000, 16, 1, 16000, 2, null); 

これは、オーディオがPCM形式、1秒あたり8000サンプル、1サンプルあたり16ビット、モノラル、1秒あたり平均16000バイト、2のブロックアライメントであることを示しています。

次のコードを実行しようとすると、MemoryStreamインスタンスに何も書き込まれません。ただし、毎秒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サンプル/秒で成功する理由があります。wavファイルを含む回避策があります。いくつかのサウンド編集ツールを使用して生成され、正しいサンプルレートに変換されましたが、可能であれば、アプリケーション内からオーディオを生成したいと思います。

特に興味深い点の1つは、SpeechRecognitionEngineがそのオーディオ形式を受け入れ、合成されたWaveファイル内の音声を正常に認識したことです...

更新:最近、このオーディオ形式はインストールされている特定の音声では成功しますが、他の音声では失敗することがわかりました。特にLHMichaelとLHMichelleで失敗し、PromptBuilderで定義された特定の音声設定で失敗が異なります。

4

3 に答える 3

3

LH Michael と LH Michelle の声が 8000 Hz のサンプル レートをサポートしていない可能性は十分にあります (これらは本質的に 8000 Hz を超えるサンプルを生成するため)。SAPI により、エンジンはサポートされていないレートを拒否できます。

于 2009-10-08T22:36:09.560 に答える
1

私も同様の問題を抱えていたので、誰かに役立つ場合に備えて返信を投稿したいと思いました。このスレッドは私を答えを見つけることに向けさせました。私の問題は、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に設定することだけです。

于 2012-12-24T04:09:47.300 に答える
1

シンセサイザーからの 11025 で立ち往生している場合に、オーディオ データを別のサンプル レートに変換できるように、 NAudioライブラリにいくつかのクラスを作成しました。WaveFormatConversionStream(ACMを使用)またはResamplerDMO(DirectXメディアオブジェクトを使用)をご覧ください

于 2008-12-03T12:16:57.647 に答える