5

我目前正在开发一个应用程序,该应用程序需要传输编码为特定音频格式的语音。

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 中定义的某些语音设置而异。

4

3 回答 3

3

LH Michael 和 LH Michelle 声音完全有可能根本不支持 8000 Hz 采样率(因为它们固有地生成 > 8000 Hz 的采样)。SAPI 允许引擎拒绝不受支持的速率。

于 2009-10-08T22:36:09.560 回答
1

我在我的NAudio库中创建了一些类,以允许您将音频数据转换为不同的采样率,如果您被合成器中的 11025 卡住了。看看WaveFormatConversionStream(使用 ACM)或ResamplerDMO(使用 DirectX 媒体对象)

于 2008-12-03T12:16:57.647 回答
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。

于 2012-12-24T04:09:47.300 回答