首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >问题SpeechSynthesizer.SetOutputToAudioStream音频格式问题

问题SpeechSynthesizer.SetOutputToAudioStream音频格式问题
EN

Stack Overflow用户
提问于 2008-10-31 20:55:28
回答 3查看 7.4K关注 0票数 5

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

代码语言:javascript
复制
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个样本时,音频数据被成功写入。

代码语言:javascript
复制
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接受这种音频格式,并成功地识别出我合成的wave文件中的语音……

更新:最近发现,此音频格式对某些已安装的语音成功,但对其他语音则失败。它特别针对LH Michael和LH Michelle失败,并且失败因PromptBuilder中定义的某些语音设置而异。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-08 22:36:10

LH、Michael和LH米歇尔的声音完全有可能不支持8000 Hz的采样率(因为它们本身就会产生大于8000 Hz的采样)。SAPI允许引擎拒绝不支持的速率。

票数 3
EN

Stack Overflow用户

发布于 2008-12-03 12:16:58

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

票数 1
EN

Stack Overflow用户

发布于 2012-12-24 12:09:47

我也有类似的问题,我想发表一个回复,以防对任何人有帮助。这个帖子让我找到了答案。我的问题是,我将SpeechSynthesizer输出到WAV文件,然后用NAudio播放该WAV文件。当输出到文件时,它无需修改即可工作。然而,当尝试使用MemoryStream时,它会回放,但速度如此之快,你听到的只是一声尖叫。

这个输出SpeechSynthesizer的代码修复了这个问题,不需要在NAudio端进行任何修改:

代码语言:javascript
复制
SpeechAudioFormatInfo synthFormat = new SpeechAudioFormatInfo(EncodingFormat.Pcm, 88200, 16, 1, 16000, 2, null);
synth.SetOutputToAudioStream(streamAudio, synthFormat);

88200是关键。默认情况下,该值为11025。只需创建SpeechAudioFormatInfo并将其设置为88200即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/254930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档