Fish Speech 1.5开源模型贡献指南:微调中文语音+提交PR全流程
1. 为什么你要关注Fish Speech 1.5的开源协作
你可能已经用过Fish Speech 1.5的Web界面,输入几句话就生成了自然流畅的中文语音——但你有没有想过,那个让你眼前一亮的“小红书风格女声”、那个精准还原方言语调的粤语合成效果、甚至那个能读出古诗韵律起伏的朗读模型,背后其实是成百上千开发者共同打磨的结果?
Fish Speech 1.5不是闭源黑盒,而是一个真正开放、可参与、可进化的开源项目。它由Fish Audio团队发起,但成长靠的是全球开发者的每一次微调、每一行文档修正、每一个问题复现和每一份Pull Request。尤其在中文语音领域,官方虽提供了超30万小时训练数据,但真实场景中的口音差异、行业术语、新媒体语感、儿童/老年声线等长尾需求,恰恰需要一线使用者来填补。
这不是“教你怎么用”,而是“带你一起造轮子”。本文将全程手把手带你完成:从本地环境准备、中文数据集清洗、轻量级LoRA微调,到代码修改、测试验证,最后成功提交一份被上游合并的PR。整个过程不依赖GPU服务器,笔记本显卡即可跑通;不堆砌理论,每一步都对应一个可验证的结果。
你不需要是语音算法专家,只需要会运行命令、看懂Python基础语法、愿意为中文TTS生态添一块砖。
2. 理解Fish Speech 1.5的工程结构与中文适配点
2.1 架构本质:VQ-GAN + Llama,但不止于此
Fish Speech 1.5表面看是“VQ-GAN做声码器 + Llama做文本编码器”的组合,但它的实际工程设计更务实:
- VQ-GAN部分负责把连续频谱压缩成离散token序列(类似“语音乐高积木”),对中文尤为重要——因为中文声调变化剧烈,传统梅尔频谱建模易失真,而VQ量化后能更好保留音高跃迁特征;
- Llama部分并非直接套用原始LLM,而是精简后的因果语言模型,专为“文本→语音token”映射优化,支持中英混合tokenization(如
<zh>、<en>标记自动切分); - 关键隐藏层:
fish_speech/models/vqgan/modules/quantize.py中的VectorQuantize类,控制着中文音节边界对齐精度;fish_speech/models/text2semantic/modules/llama.py中的LlamaForCausalLM则决定多音字消歧能力(比如“行长”读zhǎng还是háng)。
这些不是抽象概念,而是你后续微调时真正要动的代码位置。
2.2 中文数据的特殊性:不只是“加数据”,而是“改流程”
官方文档说“中文训练数据>300k小时”,但这300k小时包含大量ASR转录文本+播客音频,存在三类典型问题:
- 标点缺失:新闻播报音频常无标点,导致模型无法学习停顿节奏;
- 口语冗余:“呃”、“啊”、“这个那个”等填充词未清洗,影响正式场景输出;
- 声学偏差:多数数据来自年轻女性主播,儿童、老年、带口音语音覆盖不足。
因此,单纯增加新数据不如先优化数据处理链路。Fish Speech 1.5的data/目录下,preprocess.py脚本就是突破口——它默认使用pypinyin做拼音标注,但对粤语、闽南语等方言支持弱;text_normalization.py对中文数字读法(如“123”该读“一百二十三”还是“一二三”)规则固定,无法按场景切换。
这些,正是你提交PR最有价值的切入点:不追求大模型重训,而聚焦让中文处理链路更鲁棒、更灵活。
3. 本地微调实战:30分钟搞定中文声音定制
3.1 环境准备:避开90%新手踩坑点
不要直接pip install fish-speech——那只是推理包。你需要克隆开发版仓库:
git clone https://github.com/fishaudio/fish-speech.git cd fish-speech # 创建干净环境(推荐conda) conda create -n fish15 python=3.10 conda activate fish15 # 安装核心依赖(跳过torch,我们手动指定CUDA版本) pip install -e ".[dev]" # 手动安装匹配你显卡的PyTorch(示例:RTX 4090 + CUDA 12.1) pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121关键避坑提示:
- 必须用Python 3.10(3.11+会导致
llama_cpp兼容问题); pip install -e ".[dev]"中的-e代表“开发模式”,修改代码后无需重新安装;- 不要运行
setup.py,新版已迁移到pyproject.toml。
3.2 数据准备:用你的手机录音打造专属数据集
你不需要收集海量数据。一个高质量的5分钟录音(含不同句式:陈述、疑问、感叹、数字、专有名词)+ 对应文本,足够微调出有辨识度的声音。
操作步骤:
- 用手机录音APP录一段清晰语音(避免回声、空调噪音);
- 用Whisper.cpp本地转录(无需联网,10秒音频2秒出结果):
# 下载tiny.bin模型(仅75MB) wget https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-tiny.bin # 转录 ./main -m ggml-tiny.bin -f your_audio.wav -otxt- 人工校对文本,重点修正:
- 多音字(“重庆”不能写成“重qing”);
- 数字读法(“2024年”应为“二零二四年”,非“两千零二十四年”);
- 添加标点(根据语义断句,非机械加逗号)。
最终得到一个.csv文件,三列:audio_path,text,language(language填zh)。
3.3 LoRA微调:只训练0.3%参数,效果立竿见影
Fish Speech 1.5原生支持LoRA(Low-Rank Adaptation),无需改动主干网络。我们只微调Llama部分的注意力层,目标:让模型更懂你的发音习惯。
修改配置文件(configs/t2s/lora_finetune_zh.yaml):
model: name: "t2s" args: lora_rank: 8 # 秩越小,参数越少,适合笔记本 lora_alpha: 16 # 缩放系数,平衡原模型与新知识 lora_dropout: 0.1 # 防止过拟合 target_modules: ["q_proj", "v_proj"] # 只微调Q/V矩阵,省显存启动训练(单卡3060显存足够):
python tools/train.py \ --config configs/t2s/lora_finetune_zh.yaml \ --dataset your_dataset.csv \ --output_dir ./outputs/zh_custom_voice \ --max_steps 2000 \ --batch_size 2训练完成后,你会得到:
adapter_model.bin(仅12MB,可单独分享);merged_model.pth(合并后的完整模型,约3.2GB)。
验证效果:
python tools/inference/t2s_inference.py \ --checkpoint ./outputs/zh_custom_voice/merged_model.pth \ --text "今天天气真好,我们去公园散步吧" \ --output output.wav听到自己声音的语调、停顿、甚至轻微鼻音被复现出来时,那种“亲手造出声音”的实感,远超任何教程演示。
4. 提交PR:从代码修改到被官方合并的完整路径
4.1 选题策略:什么样的PR更容易被接受?
Fish Audio团队明确表示欢迎三类PR:
- 修复类(最高优):解决中文场景下的bug,如
pypinyin对“厦门”读音错误(应为Xiàmén,非Xiàmén); - 增强类(次高优):新增实用功能,如支持
<zh-tone>标签控制声调强度; - 文档类(快速通过):补充中文数据预处理指南、常见报错解决方案。
避免提交:
- 大模型架构修改(需先提Issue讨论);
- 未经测试的实验性功能;
- 仅修改注释或格式的“无意义PR”。
4.2 实战案例:为中文数字读法添加可配置选项
问题定位:
当前fish_speech/utils/text_normalization.py中,数字转换逻辑硬编码:
def normalize_number(text): # 所有数字统一转为“阿拉伯数字读法” return re.sub(r'\d+', lambda m: num_to_chinese(m.group()), text)但新媒体场景需要“123”读作“一二三”(短视频字幕),教育场景需“一百二十三”(课文朗读)。
修改方案:
- 在
config.yaml中新增配置项:
text_normalization: number_style: "chinese" # or "arabic", "mixed"- 修改
normalize_number函数,读取配置动态选择策略; - 在
tools/preprocess.py中加入参数透传逻辑。
提交前必做三件事:
- 运行
pytest tests/test_normalization.py确保原有测试通过; - 新增一个测试用例
test_number_style_arabic()验证新功能; - 更新
docs/zh/data_preprocessing.md文档,说明新配置项用法。
PR标题规范(直接影响审核速度):feat(text-normalization): add configurable number reading style for Chinese
(格式:类型(模块): 简明描述,类型用feat/fix/docs)
4.3 PR审查要点:让维护者一眼看懂你的价值
Fish Audio团队每天处理数十个PR,你的描述必须在10秒内传达核心信息。参考这个结构:
## 描述 解决中文数字读法单一问题,支持三种模式:`chinese`(一百二十三)、`arabic`(一二三)、`mixed`(数字+单位组合,如“第123名”读作“第一二三名”) ## 动机 - 当前硬编码逻辑无法满足新媒体/教育等差异化场景 - 用户反馈:小红书配音需短促数字读法,语文课件需标准读法 ## 更改内容 - `utils/text_normalization.py`: 新增`NumberNormalizer`类,支持配置驱动 - `configs/base.yaml`: 添加`text_normalization.number_style`配置项 - `docs/zh/data_preprocessing.md`: 补充使用示例(含截图) ## 测试 - 新增3个单元测试覆盖全部模式 - 所有现有测试100%通过 - 手动验证100+条中文数字样本没有长篇技术原理,只有“问题-方案-验证”铁三角。这才是开源协作的高效语言。
5. 进阶建议:让贡献可持续、有价值
5.1 建立个人中文语音工具箱
微调只是起点。你可以基于Fish Speech 1.5构建自己的中文语音增强工具:
- 方言转换器:用粤语数据微调,再用LoRA适配器叠加到普通话模型上,实现“普通话输入→粤语输出”;
- 情感注入模块:在VQ-GAN解码前插入轻量CNN层,根据文本情感词典(如
happy/sad标签)动态调整基频曲线; - 实时校对插件:开发VS Code扩展,在编辑文本时实时提示“此处‘长’字建议读zhǎng(如‘生长’)”。
这些不必提交到主库,但可作为独立GitHub项目,形成你的技术品牌。
5.2 参与社区:从PR作者到问题协作者
真正的开源影响力不在代码量,而在连接力:
- 主动回复中文相关Issue下的提问(哪怕只是提供调试命令);
- 将你踩过的坑整理成
TROUBLESHOOTING_ZH.md,提交文档PR; - 在CSDN、知乎等平台写“Fish Speech 1.5中文微调避坑指南”,附上你的GitHub链接。
Fish Audio团队在Discord中明确表示:“最活跃的10位中文贡献者,将获得定制语音模型部署支持。”——这比任何证书都实在。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。