netease-youdao / EmotiVoice

EmotiVoice 😊: a Multi-Voice and Prompt-Controlled TTS Engine
Apache License 2.0
7.3k stars 624 forks source link

英文合成时,句子开头会出现爆响及解决方案 #88

Open lingyu123-su opened 9 months ago

lingyu123-su commented 9 months ago

我使用的python版本为3.11,torch为2.1.2,transformers为4.36.2 api设置如下 image 生成的英文音频在刚开始时会有一声轻微的爆响,类似“噗”的一声。该问题在生成的音频中大概率会出现。 我的解决办法如下:

    # 将字节数据转换为音频段
    audio_segment = AudioSegment.from_file(io.BytesIO(audio_data), format="mp3")
    # 将前100毫秒设置为静音,-144 dBFS 是pydub中的静音水平
    silent_segment = AudioSegment.silent(duration=100)  # 创建一个静音片段
    audio_segment = silent_segment + audio_segment[100:]  # 替换音频

思路是用空白覆盖掉爆响,在这里我使用的静音音频长度为100ms,当音频长度为40ms时,不起作用 当生成中文时,基本没有遇到这个问题。

syq163 commented 9 months ago

Hello, I encountered the same problem while using the 'OpenAI-compatible-TTS API'. Have you found a solution to this issue?

lingyu123-su commented 9 months ago

Hello, I encountered the same problem while using the 'OpenAI-compatible-TTS API'. Have you found a solution to this issue?

你好。我现有的代码也是在此api的基础上实现的。 通过保存数据并播放,我确定这是音频本身的问题而不是硬件问题。 我不确定这是模型本身的问题或者是api代码的问题。 我暂时的解决方法是用静音替代掉爆响声,这需要对音频数据进行后处理,具体流程如下:

  1. 收到来自api的音频数据后,使用pydub库中的AudioSegment读入数据。此时音频数据被转换成类似数组的形式。
    # 将字节数据转换为音频段
    audio_segment = AudioSegment.from_file(io.BytesIO(audio_data), format="mp3")
  2. 使用AudioSegment,制造出100ms的静音。
    # -144 dBFS 是pydub中的静音水平
    silent_segment = AudioSegment.silent(duration=100)  # 创建一个静音片段
  3. 用静音数据代替音频数据的前100ms。
    audio_segment = silent_segment + audio_segment[100:]  # 替换音频

这里返回的audio_segment就是处理之后的数据。 如果觉得此处过于繁琐,也可以直接删除掉前100ms的数据。取决于你的需要。

syq163 commented 9 months ago

Thank you for providing this solution! We have merged a pull request (PR) regarding the 'OpenAI-compatible-TTS API', and it appears that @john9405 has resolved this issue. Can you please update and verify it?

lingyu123-su commented 9 months ago

我尝试了他提供的方法,是可行的。