tools 工具 Bark 文字转语音 一句话概述:Bark 是 Suno AI 开发的开源文字转语音模型,能够生成高度自然的多语言语音,并支持笑声、叹息、音乐等非语言声音。
核心知识点速查表 知识点 说明 为什么要学 Bark 见对应章节 核心概念 见对应章节 安装配置 见对应章节 快速上手 见对应章节 进阶用法 见对应章节 常见问题 见对应章节 参考资源 见对应章节
为什么要学 Bark Bark 是 Suno AI 开发的开源文字转语音模型,能够生成高度自然的多语言语音,并支持笑声、叹息、音乐等非语言声音。与传统 TTS 不同,Bark 基于 Transformer 架构,生成的语音具有丰富的情感和韵律变化。对于创建播客、有声书、AI 助手语音、视频配音等场景,Bark 提供了免费且表现力极强的语音合成能力。
核心概念 概念 白话解释 用途 Voice Preset 语音预设 预定义的说话风格和音色 Semantic Tokens 语义标记 捕获语义和韵律信息 Coarse Tokens 粗粒度声学标记 生成基本音频特征 Fine Tokens 细粒度声学标记 精细化音频质量 EnCodec 音频编解码器 Meta 的神经音频编码器 Non-speech 非语言声音 笑声、音乐、停顿等
安装配置 安装 pip install git+https://github.com/suno-ai/bark.git
# 或通过 pip
pip install bark
# 环境变量配置
export SUNO_USE_SMALL_MODELS = True # 使用小模型(节省显存)
export SUNO_OFFLOAD_CPU = True # GPU 不足时卸载到 CPU
硬件要求 设备 小模型 大模型 GPU 显存 ~4GB ~12GB 生成速度 快 中等 音质 良好 最佳
快速上手 基本语音生成 from bark import SAMPLE_RATE , generate_audio , preload_models
from scipy.io.wavfile import write as write_wav
# 预加载模型
preload_models ()
# 生成语音
audio_array = generate_audio ( "Hello, this is a test of Bark text to speech." )
# 保存为 WAV
write_wav ( "output.wav" , SAMPLE_RATE , audio_array )
中文语音 # 中文语音预设
audio = generate_audio (
"你好,我是一个人工智能语音助手。今天天气很好。" ,
history_prompt = "v2/zh_speaker_1"
)
write_wav ( "chinese_output.wav" , SAMPLE_RATE , audio )
使用不同语音预设 # 英文预设
audio = generate_audio ( "Hello world!" , history_prompt = "v2/en_speaker_3" )
# 中文预设
audio = generate_audio ( "你好世界!" , history_prompt = "v2/zh_speaker_5" )
# 日文预设
audio = generate_audio ( "こんにちは世界!" , history_prompt = "v2/ja_speaker_1" )
# 可用语音预设:
# v2/en_speaker_0 ~ v2/en_speaker_9
# v2/zh_speaker_0 ~ v2/zh_speaker_9
# v2/ja_speaker_0 ~ v2/ja_speaker_9
# v2/de_speaker_0 ~ v2/de_speaker_9
# v2/fr_speaker_0 ~ v2/fr_speaker_9
# 等等...
非语言声音 # Bark 支持的特殊标记
texts = [
"有时候... [laughs] 事情就是这么搞笑。" ,
"[clears throat] 好了,我们开始正题。" ,
"这是 [sighs] 很难的决定。" ,
"♪ Do re mi fa sol la ti do ♪" , # 唱歌
"— 等一下 —" , # 停顿
]
for i , text in enumerate ( texts ):
audio = generate_audio ( text )
write_wav ( f "special_ { i } .wav" , SAMPLE_RATE , audio )
进阶用法 长文本处理 import numpy as np
from bark import generate_audio , SAMPLE_RATE
from scipy.io.wavfile import write as write_wav
def generate_long_audio ( text , voice = "v2/zh_speaker_3" ):
"""将长文本分段生成然后拼接"""
# 按句子分割
sentences = text . replace ( "。" , "。 \n " ) . replace ( "!" , "! \n " ) . replace ( "?" , "? \n " ) . split ( " \n " )
sentences = [ s . strip () for s in sentences if s . strip ()]
audio_segments = []
silence = np . zeros ( int ( 0.3 * SAMPLE_RATE )) # 句间停顿
for sentence in sentences :
if len ( sentence ) > 200 : # 太长的句子再切分
parts = [ sentence [ i : i + 200 ] for i in range ( 0 , len ( sentence ), 200 )]
else :
parts = [ sentence ]
for part in parts :
audio = generate_audio ( part , history_prompt = voice )
audio_segments . append ( audio )
audio_segments . append ( silence )
# 拼接所有片段
full_audio = np . concatenate ( audio_segments )
return full_audio
text = """
人工智能正在改变我们的生活。从自动驾驶到医疗诊断,AI的应用无处不在。
然而,我们也需要关注AI带来的伦理问题。隐私保护和算法公平性是重要的课题。
"""
audio = generate_long_audio ( text )
write_wav ( "long_speech.wav" , SAMPLE_RATE , audio )
语音克隆(自定义音色) from bark.generation import load_codec_model , generate_text_semantic
from bark.api import semantic_to_waveform
import numpy as np
# 注意:Bark 的语音克隆能力有限
# 需要用参考音频生成 history prompt
# 方法1:使用 generate_audio 的输出作为 prompt
from bark import generate_audio
# 先用特定语音生成一段参考
reference_audio = generate_audio (
"This is my reference voice sample." ,
history_prompt = "v2/en_speaker_6"
)
# 保存为自定义 prompt(高级用法需要深入源码)
流式生成 from bark.generation import (
generate_text_semantic ,
preload_models ,
)
from bark.api import semantic_to_waveform
from bark import SAMPLE_RATE
import sounddevice as sd
preload_models ()
def stream_speech ( text , voice = "v2/zh_speaker_3" ):
"""逐句流式播放"""
sentences = [ s . strip () for s in text . split ( "。" ) if s . strip ()]
for sentence in sentences :
sentence = sentence + "。"
audio = generate_audio ( sentence , history_prompt = voice )
sd . play ( audio , SAMPLE_RATE )
sd . wait ()
stream_speech ( "今天我们来讨论人工智能。机器学习是其中一个重要分支。深度学习推动了近年来的技术突破。" )
部署为 API from fastapi import FastAPI
from bark import generate_audio , SAMPLE_RATE , preload_models
from scipy.io.wavfile import write as write_wav
from fastapi.responses import FileResponse
import tempfile
import os
app = FastAPI ()
preload_models ()
@app . post ( "/tts" )
async def text_to_speech ( text : str , voice : str = "v2/zh_speaker_3" ):
audio = generate_audio ( text , history_prompt = voice )
tmp = tempfile . NamedTemporaryFile ( suffix = ".wav" , delete = False )
write_wav ( tmp . name , SAMPLE_RATE , audio )
return FileResponse (
tmp . name ,
media_type = "audio/wav" ,
filename = "speech.wav"
)
批量生成 import json
from bark import generate_audio , SAMPLE_RATE
from scipy.io.wavfile import write as write_wav
from pathlib import Path
# 批量配置
tasks = [
{ "text" : "第一章:引言" , "voice" : "v2/zh_speaker_1" , "output" : "ch1_intro.wav" },
{ "text" : "第二章:方法" , "voice" : "v2/zh_speaker_1" , "output" : "ch2_method.wav" },
{ "text" : "第三章:结论" , "voice" : "v2/zh_speaker_1" , "output" : "ch3_conclusion.wav" },
]
output_dir = Path ( "./audiobook" )
output_dir . mkdir ( exist_ok = True )
for task in tasks :
print ( f "Generating: { task [ 'output' ] } " )
audio = generate_audio ( task [ "text" ], history_prompt = task [ "voice" ])
write_wav ( str ( output_dir / task [ "output" ]), SAMPLE_RATE , audio )
常见问题 Q: 生成速度很慢? 设置 SUNO_USE_SMALL_MODELS=True 使用小模型 使用 GPU 加速 每次生成的文本控制在 1-2 句话 考虑使用 bark.cpp C++ 加速版本 Q: 生成的语音有杂音? 多生成几次,Bark 有随机性 使用不同的 voice preset 确保文本不超过 200 字符 添加标点符号帮助断句 Q: 与其他 TTS 的区别? Bark :最自然、支持非语言声音,但不可控(随机性)Coqui TTS :更可控、支持微调、部署更灵活Edge TTS :免费在线服务、延迟低、但需网络piper :最轻量、离线、实时,但表现力有限Q: 如何保证每次生成一致? # 设置随机种子
import torch
torch . manual_seed ( 42 )
audio = generate_audio ( "固定语音" , history_prompt = "v2/zh_speaker_3" )
参考资源 GitHub:https://github.com/suno-ai/bark Hugging Face:https://huggingface.co/suno/bark bark.cpp:https://github.com/PABannier/bark.cpp Suno AI:https://www.suno.ai/ 语音预设列表:https://suno-ai.notion.site/8b8e8749ed514b0cbf3f699013548683