Press "Enter" to skip to content

如何使用文本转语音AI模型Bark生成音频

介绍

Bark是由Suno.ai创建的开源、完全生成的文本到音频模型,可以生成非常逼真的、多语言的语音,包括背景噪声、音乐和简单的音效。它采用了GPT风格的架构,能够以意外的方式偏离给定的脚本。典型的文本到语音(TTS)引擎产生机器人和机器生成的单调声音。Bark使用GPT风格的模型生成非常逼真和自然的声音,给人一种像听实际人的经历的奇妙体验。

学习目标

  • 了解Bark模型的基本用法和功能,以及其限制和应用。
  • 学会使用Python代码从文本生成音频文件。
  • 使用Python中的NLTK和Bark库创建大规模语音。

本文是数据科学博文马拉松的一部分。

安装Bark

让我们使用Google Colab笔记本来了解Bark的功能和应用。

要安装Bark,请使用以下命令:pip install git+https://github.com/suno-ai/bark.git。

pip install git+https://github.com/suno-ai/bark.git

注意:不要使用’pip install bark’,因为它会安装Suno.ai管理的不同软件包。

使用Bark生成音频

Bark支持多种语言,如英语、中文、法语、印地语、德语等。它还支持Bark说话人库,其中包含支持的语言的多个语音提示。请在这里检查说话人库列表。

Bark提供了一些预定义的标签/注释,如背景噪声、礼堂、开头的沉默等,可以帮助理解说话者的使用方式。您可以根据用户的需求在Python代码中使用这些标签设置合适的提示。

下面的Python代码根据所选的说话者生成音频文件。

from bark import SAMPLE_RATE, generate_audio, preload_models# 在笔记本中导入音频以便听取生成的音频数组.from IPython.display import Audio

对于给定的文本输入,generate_audio函数将返回一个以24khz采样频率的numpy音频数组作为输出。历史提示从说话人库列表中选择所选的说话者。然后,模型使用Scipy将.wav类型的声音文件保存到所需位置以供进一步使用。

# 需要转换为语音的文本text_prompt1 = """一架载有八人的Learjet 45飞机在星期四偏离了航线"""# 为给定的文本生成音频numpy数组speech_array1 = generate_audio(text_prompt1,                history_prompt="en_speaker_6")# 在笔记本中播放音频Audio(speech_array1, rate=SAMPLE_RATE)import scipyscipy.io.wavfile.write("bark_out1.wav", rate=SAMPLE_RATE,data=speech_array1)

Bark会自动检测给定文本中的脚本,并在未指定时生成带有适当语言说话者的音频。可以为生成特定音频演讲给定特定的说话者提示,如旁白、男人、女人等。然而,这些并不总是被尊重,特别是如果给定了冲突的音频历史提示。

text_prompt2 = """女人:嗨,Shakira,你好吗?"""speech_array2 = generate_audio(text_prompt2)# 在笔记本中播放音频Audio(speech_array2, rate=SAMPLE_RATE)

使用Bark生成非语言性言语

Bark是一个完全生成的文本到语音模型,用于研究和演示目的。与先前的方法不同,输入的文本提示直接转换为音频,而不是中间使用音素。因此,它可以泛化到超出语音的任意指令,如音乐歌词、音效或其他非语音声音。用户还可以使用Bark生成非语言性交流,如笑声、歌唱、犹豫等。下面是一些已知的可使用Bark生成的非语音声音的列表。

  • [笑声]
  • [笑]
  • [叹气]
  • [音乐]
  • [喘气]
  • [清嗓子]
  • – 或 … 表示犹豫
  • ♪ 表示歌词
  • 大写表示强调某个词
  • [男人] 和 [女人] 表示偏向于男性和女性说话者

树皮可以生成各种类型的音频,在原则上,它并不区分语音和音乐之间的区别。有时,树皮选择将文本生成为音乐,但您可以通过在歌词周围添加音符来帮助它。

检查下面的Python代码,了解关于生成言语和音乐中的犹豫的操作。

text_prompt3 = """我喜欢印度食物但是...有时候太辣了"""                 #...在语音中添加犹豫speech_array3 = generate_audio(text_prompt3,history_prompt="en_speaker_4")# 在笔记本中播放音频Audio(speech_array3, rate=SAMPLE_RATE)

text_prompt4 = """    ♪ 5只小鸭子一天下湖游 ♪"""speech_array4 = generate_audio(text_prompt4)# 在笔记本中播放音频Audio(speech_array4, rate=SAMPLE_RATE)

树皮具有完全克隆声音的能力,包括音调、音高、情感等。它可以被滥用,使用已知的、着名的声音并生成欺诈性的、恶意的内容。由于这个伦理问题,原始的Bark库将音频历史提示限制为一组由Suno.ai为每种支持的语言提供的完全合成的选项。这些发言人提示的列表在Bark发言人库中提到。

使用Bark进行大篇幅音频处理

树皮将输出的语音长度限制在13-14秒。因此,如果您提供给它一个非常大的输入文本,它将破坏文本并仅为14秒生成输出。由于Bark是一个GPT风格的模型,其优化的架构只能生成大致这么长的语音。如果要生成更长的音频长度,您需要将所需的文本拆分成较小的句子。然后,为每个句子生成音频,并将所有这些音频文件合并为整体音频生成。

按照以下逐步过程生成使用Bark的短篇故事音频语音。

步骤1: 使用NLTK库将较长的文本拆分为句子,并生成句子列表。

story_1 = """曾经有一只和乌龟交朋友的兔子。一天,他向乌龟挑战赛跑。看到乌龟跑得多慢,兔子认为他很容易赢。所以他躺下打盹,而乌龟继续前进。当兔子醒来时,他发现乌龟已经到达了终点。令他非常气馁的是,乌龟在他忙着睡觉的时候赢得了比赛。""".replace("\n", " ")sentences = nltk.sent_tokenize(story_1)

步骤2: 使用Bark生成音频函数为每个句子生成音频文件,并在每个句子后添加四分之一秒的静音。创建一个用于为句子生成音频的for循环,然后将静音添加到其中。

SPEAKER = "v2/en_speaker_6"# 四分之一秒的静音silence = np.zeros(int(0.25 * SAMPLE_RATE))pieces = []for sentence in sentences:    audio_array = generate_audio(sentence,history_prompt=SPEAKER)    pieces += [audio_array, silence.copy()]

步骤3: 连接所生成的音频文件序列,然后检查合并的音频文件以聆听完整的语音。

Audio(np.concatenate(pieces), rate=SAMPLE_RATE)

最终合并的音频文件生成了整个故事的整体叙述的良好语音片段。

改善生成的语音

如果给定的文本太短,Bark会自行在提示的末尾添加一些额外的音频。这会导致生成的音频输出质量不佳。以下是一个例子。

text_prompt5 = """   发生什么了,我的朋友?"""speech_array5 = generate_audio(text_prompt5,history_prompt="v2/en_speaker_6")# 在笔记本中播放音频Audio(speech_array5, rate=SAMPLE_RATE)

上述代码的输出:

在上述代码中,生成的简单语音行的5秒音频在最后3秒是空白的。为了克服这个问题并为此类情况生成良好质量的音频,尝试使用参数min_eos_p。生成文本语义函数中的这个参数可以调整Bark生成文本的阈值。通过降低这个概率阈值,我们可以停止文本生成并解决额外添加音频的问题。

以下是改善生成音频的步骤:

  1. 使用generate_text_semantic函数,从给定的文本生成语义标记。
  2. 将min_eos_p参数的值减小到0.05(默认值为0.2)。
  3. 使用semantic_to_waveform函数生成一个numpy音频数组。

由于降低了概率阈值min_eos_p,文本生成会提前停止,生成一个持续2秒的小音频剪辑。请参考下面的参考代码了解更多细节。

from bark.api import semantic_to_waveformfrom bark.generation import (generate_text_semantic,preload_models)semantic_token5 = generate_text_semantic(text_prompt5,history_prompt="v2/en_speaker_6",                  min_eos_p=0.05) # 这控制生成结束的可能性speech_array6 = semantic_to_waveform(semantic_token5, history_prompt="v2/en_speaker_6")# 在notebook中播放文本Audio(speech_array6, rate=SAMPLE_RATE)

传统的文本转语音模型生成的是机械化、机器生成的单调声音,使用范围有限。通过深度学习算法,最新的TTS模型可以模仿人类的语音模式和语调。由于技术的进步,可以创建更有吸引力、更自然的人类语音应用,如情感TTS、唱歌TTS、多语种TTS、语音克隆等。

结论

Bark是一种开源的GPT风格的生成式文本转语音模型,具有多种应用。Bark的用例包括创建多语种的有声书和播客,以及为电视节目、视频游戏等生成音效。它在需要生成自然语音输出、多说话人对话或音乐创作的情况下非常有帮助。由于Bark专注于生成高度逼真的类人声音,有时会在音频中生成额外的背景音乐/噪音。如果对所需的用例来说不需要这些噪音,可以使用一些外部编辑工具和软件去除它们。

主要要点

  • Bark是一种高度逼真的生成模型,可以生成听起来像人类的、自然的声音输出。
  • 它是一种独特的模型,可以制造笑声、哭声和音乐等音效。
  • 您可以使用Bark使用音频格式化技术和调整阈值参数来生成高质量的语音。

常见问题

本文中显示的媒体不被Analytics Vidhya所拥有,而是根据作者的决定使用。

Leave a Reply

Your email address will not be published. Required fields are marked *