【问题标题】:Question SpeechSynthesizer.SetOutputToAudioStream audio format problemQuestion SpeechSynthesizer.SetOutputToAudioStream 音频格式问题
【发布时间】:2010-09-20 06:35:51
【问题描述】:

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

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

【问题讨论】:

    标签: c# audio speech-recognition text-to-speech


    【解决方案1】:

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

    【讨论】:

    • 对不起,打扰你了,看来你是音频方面的专家,我有this question这让我很困惑,你能帮我吗?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,想发表回复,以防它对任何人有所帮助。这个线程让我找到了答案。我的问题是,我将 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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-21
        • 1970-01-01
        • 2010-09-05
        • 2011-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多