我目前正在研究一种需要传输语音编码为特定音频格式的应用程序。
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实例;但是,当我从每秒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的文档中找不到任何有用的东西,为什么它以每秒11025个样本而不是8000成功。我有一个涉及wav的解决方法我使用一些声音编辑工具生成并转换为正确采样率的文件,但如果可以,我想从应用程序中生成音频。
一个特别的兴趣点是SpeechRecognitionEngine接受了这种音频格式并成功识别出我的合成波形文件中的语音......
更新:最近发现这种音频格式对某些已安装的声音成功,但对其他声音失败。它专门针对LH Michael和LH Michelle而失败,并且PromptBuilder中定义的某些语音设置的失败会有所不同。
答案 0 :(得分:3)
LH Michael和LH Michelle声音完全有可能不支持8000 Hz采样率(因为它们本身生成的样本> 8000 Hz)。 SAPI允许引擎拒绝不支持的费率。
答案 1 :(得分:1)
我已经在我的NAudio库中创建了一些类,以便您可以将音频数据转换为不同的采样率,如果您遇到合成器中的11025。查看WaveFormatConversionStream
(使用ACM)或ResamplerDMO
(使用DirectX媒体对象)
答案 2 :(得分:1)
我遇到了类似的问题,并希望发布回复以防万一。这个主题让我找到答案。我的问题是,我将SpeechSynthesizer输出到WAV文件,然后用NAudio播放该WAV文件。当输出到文件时,它无需修改即可工作。但是,在尝试使用MemoryStream时,它会播放,但是你听到的声音太快了。
这个输出SpeechSynthesizer的代码解决了这个问题,NAudio方面不需要修改:
SpeechAudioFormatInfo synthFormat = new SpeechAudioFormatInfo(EncodingFormat.Pcm, 88200, 16, 1, 16000, 2, null);
synth.SetOutputToAudioStream(streamAudio, synthFormat);
88200是关键。默认情况下,这是11025.只需创建SpeechAudioFormatInfo并将其设置为88200即可。