Bark是一个能够生成逼真、多语言语音的模型,包括背景噪音、音乐和简单音效。它遵循GPT风格的架构,能够从任何给定的脚本中意外地偏离。传统的文本到语音(TTS)引擎产生的声音机械且单调,而Bark使用GPT风格的模型生成逼真自然的声音,给人一种听真人说话的绝佳体验。
了解Bark模型的基本使用和功能,包括其限制和应用。学习如何使用Python代码从文本生成音频文件。
本文是作为数据科学博客马拉松的一部分发布的。
让使用Google Colab笔记本来理解Bark的功能和应用。要安装Bark,请使用命令pip install git+https://github.com/suno-ai/bark.git
。注意不要使用pip install bark
,因为它会安装一个不同的包,不是由Suno.ai管理的。
Bark支持多种语言,如英语、中文、法语、印地语、德语等。它还支持Bark扬声器库,其中包含支持语言的多个语音提示。请检查扬声器库列表。Bark带有一些预定义的标签/注释,如背景噪音、礼堂、开头的沉默等,这些有助于理解扬声器的使用。可以根据用户的需求在Python代码中使用这些标签设置合适的提示。
以下Python代码根据选定的扬声器生成音频文件。
from bark import SAMPLE_RATE, generate_audio, preload_models
# 导入Audio以在笔记本中播放生成的音频数组。
from IPython.display import Audio
for a given text input, the generate_audio function will return a numpy audio array at the output with a sample frequency of 24khz. The history prompt picks the selected speaker from the speaker library list. The model then uses Scipy to save a .wav type sound file to the desired location for further usage.
# Text which needs to be converted into Speech
text_prompt1 = """
A Learjet 45 aircraft with eight people on board
veered off on thursday"""
# generate audio numpy array for given text
speech_array1 = generate_audio(text_prompt1,
history_prompt="en_speaker_6")
# play text in notebook
Audio(speech_array1, rate=SAMPLE_RATE)
import scipy
scipy.io.wavfile.write("bark_out1.wav", rate=SAMPLE_RATE,data=speech_array1)
Bark能够自动检测给定文本中的脚本,并在未指定的情况下生成适当语言的扬声器音频。可以给出某些扬声器提示,如旁白、男人、女人等,以生成特定的音频演讲。然而,这些并不总是被尊重,特别是如果给出了冲突的音频历史提示。
Bark是一个完全生成性的文本到语音模型,用于研究和演示目的。与以前的方法不同,输入文本提示直接转换为音频,而不需要使用音素作为中间步骤。因此,它可以推广到任意指令之外的语音,如音乐歌词、音效或其他非语音声音。用户也可以使用Bark产生非语言交流,如笑、唱歌、添加犹豫等。以下是一些已知可以使用Bark生成的非语音声音列表。
Bark可以生成所有类型的音频,并且在原则上不区分语音和音乐。有时,Bark选择将文本作为音乐生成,但可以通过在歌词周围添加音乐符号来帮助它。
检查以下Python代码,用于生成语音中的犹豫和音乐。
text_prompt3 = """
I like Indian food but ... sometimes its very SPICY
""" #... adds hesitation in speech.
speech_array3 = generate_audio(text_prompt3,history_prompt="en_speaker_4")
# play text in notebook
Audio(speech_array3, rate=SAMPLE_RATE)
text_prompt4 = """
♪ 5 little ducks went swimming one day ♪
"""
speech_array4 = generate_audio(text_prompt4)
# play text in notebook
Audio(speech_array4, rate=SAMPLE_RATE)
Bark有能力完全克隆声音,包括音调、音高、情感等,从输入音频中。它可能被滥用,通过使用已知的、著名的语音生成欺诈性、恶意内容。由于这个伦理问题,原始的Bark库限制了音频历史提示到Suno.ai为每种支持的语言提供的有限的完全合成选项。这些扬声器提示的列表在Bark扬声器库中提到。
Bark将其输出语音长度限制在13-14秒。所以,如果给它一个非常大的输入文本,它将只产生14秒的输出。由于Bark是一个GPT风格的模型,其优化的架构只能产生大约这个长度的语音。对于生成更长的音频,需要将所需的文本分成更小的句子。然后,为它们各自生成音频并将所有这样的音频文件组合起来,以产生整体音频。
按照以下步骤使用Bark生成短篇故事音频语音。
story_1 = """
There was once a hare who was friends with a tortoise. One day,
he challenged the tortoise to a race.Seeing how slow the tortoise was going,
the hare thought he’ll win this easily. So he took a nap while the tortoise
kept on going.When the hare woke up, he saw that the tortoise was already at
the finish line. Much to his chagrin, the tortoise won the race while he was
busy sleeping.""".replace("\n", " ")
sentences = nltk.sent_tokenize(story_1)
SPEAKER = "v2/en_speaker_6"
# quarter second of silence
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()]
Audio(np.concatenate(pieces), rate=SAMPLE_RATE)
最终组合的音频文件生成了一个好的声音剪辑,讲述了整个故事的叙述。
如果给定的文本太短,Bark会在提示的末尾自行添加一些额外的音频。这导致生成的音频输出不佳。这是一个例子。
text_prompt5 = """
what happened my friend?
"""
speech_array5 = generate_audio(text_prompt5,history_prompt="v2/en_speaker_6")
# play text in notebook
Audio(speech_array5, rate=SAMPLE_RATE)
上述代码的输出:上述代码为一个简单的语音行生成了5秒的音频,最后3秒是空白。为了克服这个问题并为这种情况生成高质量的音频,尝试使用参数min_eos_p。这个参数在generate_text_semantic函数中调整Bark生成文本的阈值。通过降低这个概率阈值,可以停止文本生成并解决额外添加音频的问题。
以下是改进生成音频的步骤。
from bark.api import semantic_to_waveform
from 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) # this controls how likely the generation is to end
speech_array6 = semantic_to_waveform(semantic_token5, history_prompt="v2/en_speaker_6")
# play text in notebook
Audio(speech_array6, rate=SAMPLE_RATE)