用XTTS-V2制作有声读物

APPLICATION Nov 2, 2024

我必须承认,现在我更喜欢有声读物/播客。由于我大部分的混合/办公时间都在班加罗尔的交通中度过,所以在路上听书比找时间坐下来读书要容易得多。但有一件事一直困扰着我,那就是我感兴趣的一些书没有有声读物版本,尤其是古腾堡计划的旧书。因此,我开始研究使用 TTS(文本转语音)技术制作有声读物的方法。这就是我遇到 Coqui 的 XTTS-v2 等开源 TTS 模型的原因。

TTS 已经从早期听起来像机器人一样,而且有点尴尬的时代走了很长一段路。当时,它依赖于将预先录制的音频片段串在一起,或者使用无法真正“理解”人类语音工作原理的基本模型。但现在,有了神经网络和深度学习,TTS 听起来可以更自然。想想谷歌的 WaveNet——它是第一批让语音听起来几乎像人类的模型之一,而现在,神经网络 TTS 无处不在。

1、闭源 vs. 开源

因此,我开始深入研究 TTS 模型,并且有很多选择。有些是闭源的;你不能真正定制它们或修改它们,因为它们被锁定在付费墙后面。谷歌、亚马逊和微软等公司都有自己的 TTS 服务,这些服务确实很好,但如果你考虑长期使用或定制,它们也很昂贵。

然后是开源方面,这是我真正感兴趣的。使用开源模型,你可以试验、自定义,基本上可以不受限制地做任何你想做的事情。

2、发现 XTTS-v2

这让我想到了 Coqui 及其 XTTS-v2 模型。这个开源模型似乎是我的有声读物项目的完美解决方案。它功能强大、灵活且免费使用——如果你想创建自定义有声读物或其他任何长文本转音频之类的东西,那么它是理想的选择,否则需要付费选项。一些亮点:

  • 情感和风格转移:XTTS-v2 的突出功能之一是它能够处理情感和风格转移。这意味着您可以克隆声音,不仅可以捕捉声音的声音,还可以捕捉其独特的风格和语调。这使得它非常适合为有声读物创建一致、个性化的声音。想象一下,用你克隆和定制的相同声音讲述一整套书籍,听起来完全符合你的要求。
  • 多语言支持:XTTS-v2 支持多种语言(17 种),因此如果你有不同语言的文本,可以在它们之间无缝切换。
  • 低延迟:它足够快,可以用于实时应用程序,这意味着它不仅可用于创建有声读物,还可用于语音助手等实时应用程序。该模型也很容易在 CPU 上运行。

3、我的实现过程

我从设置模型以使用 GPU 开始。这也很容易通过 CPU 实现,但 GPU 当然更快。

!pip -q install TTS soundfile

from huggingface_hub import snapshot_download
!git clone https://huggingface.co/coqui/XTTS-v2

from TTS.tts.configs.xtts_config import XttsConfig
from TTS.tts.models.xtts import Xtts
import soundfile as sf
import os

config = XttsConfig()
config.load_json("/content/XTTS-v2/config.json")
model = Xtts.init_from_config(config)
model.load_checkpoint(config, checkpoint_dir="/content/XTTS-v2/", eval=True)
model.cuda()

def process_tts(input_text, speaker_audio, lang, output_file):
    outputs = model.synthesize(
      input_text,
      config,
      speaker_wav=speaker_audio,
      gpt_cond_len=3,
      language=lang,
    )
    audio_data = outputs["wav"]
    sample_rate = 24000
    sf.write(output_file, audio_data, sample_rate)
    print("Audio saved successfully!")

然后我可以使用参考音频文件和示例文本进行测试:

text_en = """The quick brown fox jumps over the lazy dog near the idyllic riverbank, causing ripples in the water's mirrored surface.
In the silence of the ancient library, amidst the scent of old books, a whisper echoed: "Preserve the knowledge, for it holds the key to the future."""

reference_audio = "/content/XTTS-v2/samples/female_en.wav"
process_tts(text_en, reference_audio, "en", "audio_output.wav")

这是我使用的参考音频 ,这是文本生成的音频

对于免费解决方案来说,这是极好的质量。我测试了另外 2 个参考音频文件:一个男声英语语音和一个男声印地语语音。

男声英语语音的采样音频文本生成的音频

现在是时候实现我的目标了,那就是看看这个模型对于创建有声读物(换句话说,转换较长的文本)有多好。我的下一个测试是将这本书 ——查尔斯·狄更斯的《大卫·科波菲尔》—— 转换成音频。我选择了第一章进行测试。

我提前并批量处理块以适应模型的标记限制:

import os
from pydub import AudioSegment
import nltk
nltk.download('punkt')
from nltk.tokenize import sent_tokenize

with open('chapter_1.txt', 'r', encoding="utf-8") as file:
    text = file.read()
    sentences = sent_tokenize(text)

audio_files = []
for i, sentence in enumerate(sentences):
    output_file = f"audio_sentence_{i}.wav"
    process_tts(sentence, reference_audio, "en", output_file)
    audio_files.append(output_file)


combined = AudioSegment.empty()
silence = AudioSegment.silent(duration=500)  

for audio_file in audio_files:
    audio = AudioSegment.from_wav(audio_file)
    combined += audio + silence

combined.export("combined_audio.wav", format="wav")

for audio_file in audio_files:
    os.remove(audio_file)

这是音频的第一章。我对音频的质量印象深刻😊

4、结束语

我对 XTTS-v2 的这些可能性感到非常兴奋。我还认为,如果你正在开发语音助手等更复杂的项目,这可能是一个绝佳的选择。

最好的部分是什么?你不必局限于僵化、昂贵的闭源系统——你可以对其进行调整以满足你的确切需求。而且音频质量应该会随着模型的微调而提高。


原文链接:Building audiobooks using the open-source XTTS-V2 model

汇智网翻译整理,转载请标明出处

Tags