想要一段"自己念的"音频,又实在不想对着麦克风念半小时。做完发现这套东西的构成其实很朴素:手机上的一个终端工具 + 一套自己写的 Python 脚本 + 一个在线的语音合成模型。给它一段 8~20 秒的人声,之后任意文字都能用这个音色读出来。
先把三个词说白,后面就不再解释了:
- 语音合成(TTS):把文字读成语音的技术。手机导航、有声书用的都是它
- 音色克隆:不只是"读出来",而是照着某个人的嗓音来读——只给一小段录音就能学个大概(学的是音色,不是说话的语气性格)
- 样本 / 参考音频:喂给模型"听"的那一小段本人录音,8~20 秒、干净、无背景音乐最好
先说清楚用了什么
| 环节 | 用的东西 | 这玩意是干嘛的 |
|---|---|---|
| 运行环境 | 手机上的终端工具 + Python 3.12 | 终端工具 ≈ 手机里的命令行窗口;Python 是写脚本的语言 |
| 音频处理 | ffmpeg | 开源的音视频处理工具,切音频、转格式、拼时间轴都靠它 |
| 音色克隆模型 | mimo-v2.5-tts-voiceclone |
在线模型:把"你的样本 + 要读的文字"合成成语音 |
| 官方音色 / 唱歌 | mimo-v2.5-tts |
同一系列,自带 9 套现成音色,还支持唱歌模式 |
| 凭空造音色 | mimo-v2.5-tts-voicedesign |
你写一段描述(年龄、口音、气质),它生成一个全新音色 |
| Python 依赖 | requests、numpy(必需);scipy、imageio-ffmpeg(可选) |
requests 负责发网络请求;numpy / scipy 做音频的数值计算 |
这些模型都通过"OpenAI 兼容接口"调用——意思是请求格式跟主流服务写的一样,哪天想换别家的模型,改一下地址和模型名就行,脚本不用重写。
脚本分工(一共 16 支,先挑 9 支主线说)
mimo_tts_clone.py—— 主力:文字 → 你的音色narrate.py—— 长文有声化:整篇文章 → 一条完整音频,逐句生成、逐句存盘dub_video.py—— 给视频重新配音:把新录的语音贴回画面make_refs.py—— 从一段长录音里自动剪出候选样本(不用自己找 8 秒)score_refs.py—— 给样本打分:信噪比、停顿、削波、基频(后面小抄里有解释)ab_test.py—— A/B 试听:同一句话用两个样本各合成一遍,比着听voice_similarity.py—— 相似度对比:合成结果跟真人录音比,"像不像"变成数字audio_compat.py—— 兼容层:手机上装不了某些计算库时,自动换一套办法顶上paths.py—— 路径总管:所有文件夹位置统一从它推导,整个包没有写死的路径,拷到哪都能跑
剩下 7 支是配套件:mimo_tts_presets.py(官方预置音色)、mimo_tts_design.py(文字造音色)、doctor.py(环境自检)、index.py(刷新清单)、transcribe.py(本地转写)、ocr_frames.py(关键帧 OCR)、analyze_voice.py(音频体检)。
三步跑起来
- 把素材放对地方:要克隆的嗓音丢进
参考音频/(8~20 秒干净人声,wav 或 mp3),要重新配音的视频、要抽样本的录音丢进源素材/,API Key 单独一行写进key.txt。放进去就生效,不用改代码、不用改路径 - 自检:
bash 自检.sh(Windows 上双击自检.bat,也可以python3 脚本/doctor.py),它会报目录位置、Python 版本、依赖、ffmpeg、Key、样本情况,缺什么补什么 - 开跑:
python3 脚本/mimo_tts_clone.py --text "大家好,我是兰维华。" --out "产出/你好.wav"
产出落在 产出/ 里。命令里写 python3 是因为 Termux 上没有 python 这个别名;Windows 上把 python3 换成 python 就行。
六个最常用动作
① 一段文字 → 我的声音
python3 脚本/mimo_tts_clone.py --text "要读的内容" --out "产出/结果.wav"
python3 脚本/mimo_tts_clone.py --text "要读的内容" --style "轻快、语速稍快" --out "产出/结果.wav"
python3 脚本/mimo_tts_clone.py --text-file "示例/原文稿_微观经济学.txt" --outdir "产出/批量"
② 整篇文章 → 一条完整音频(长文有声化)
朗读稿就是"一行一句"的纯文本,# 开头的是小节标题(大标题停 1.2 秒,## 小节标题停 1.0 秒)。
python3 脚本/narrate.py --script "示例/朗读稿_模板.txt" --name 试听 --limit 5 # 先试 5 段
python3 脚本/narrate.py --script "示例/朗读稿_模板.txt" --name 我的有声书 # 全量
成品是 产出/我的有声书.mp3,逐句分段存在 产出/有声稿/我的有声书/——哪句不满意删掉重跑那一句就行。
③ 给视频重新配音
--mode fit:每句贴回原来的时间点,句子太长会自动加速一点(上限 1.35 倍)--mode natural:一句接一句顺读、句间停 0.35 秒,画面基本不动时用这个最自然- "时间轴"是一个记录"哪句话在第几秒到第几秒"的结构化文件,写法看
示例/时间轴_完整示例_微观经济学.json
④ 从素材里抽样本并择优
python3 脚本/make_refs.py --list # 先看 源素材/ 里有什么
python3 脚本/make_refs.py --num 4 # 自动剪出 4 段候选样本 → 参考音频/
python3 脚本/score_refs.py # 客观打分:信噪比、停顿、削波、基频
python3 脚本/ab_test.py # 主观:生成带语音播报的 A/B 合集,用耳朵定夺
⑤ 不克隆也能用官方预置音色
python3 脚本/mimo_tts_presets.py --list # 音色表
python3 脚本/mimo_tts_presets.py --demo-all # 9 个音色各一段
python3 脚本/mimo_tts_presets.py --voice 冰糖 苏打 --text "同一句话" # 换音色听差别
python3 脚本/mimo_tts_presets.py --voice 白桦 --text "(唱歌)啦—啦啦—啦" # 唱歌模式
中文音色是 mimo_default、冰糖、茉莉、苏打、白桦,英文有 Mia、Chloe、Milo、Dean;唱歌模式只有这些预置音色支持。
语气还能用行内标签写进文本:[叹气]、[笑]、[哽咽]、[语速加快]。
⑥ 用一句话造一个全新音色
python3 脚本/mimo_tts_design.py --desc "一位年迈的老先生,带北方口音的普通话,语速缓慢沉稳,嗓音略沙哑" \
--text "话说那一年,关外的雪下得格外早。" --out "产出/音色设计/说书人.wav"
描述里写清年龄、性别、口音、音质、发声方式;别写混响、EQ 这类后期词。
真踩过的六个坑
- 两段内容放反了就没声音:接口用"谁在说话"来区分——要朗读的正文要放在 assistant(助手)位置,语气要求放在 user(用户)位置,放反了合成出来是静音
- 样本每次都要重新发一遍:它是随请求一起上传的(编码成一段文本格式传输),单次不能超过 10MB
- 样本质量比调参数重要:8~20 秒干净人声就决定了上限;先给样本打分选出最好的那段,比反复改参数有用
- 手机上有些计算库装不上:脚本里有兼容层会自动换一套算法顶上,效果一样——所以"手机算力不够"在这类任务上不成立(重活是在线模型干的,手机只负责切音频、拼时间轴、发请求)
- 请求太密会被限流:服务端会返回一个"过载"错误码,脚本会自动等一会儿重试;重跑同一条命令能把失败的句子补齐
- 长文必须分段:逐句生成、逐句保存,哪句不满意删掉重跑那一句,不用整篇推倒重来
效果如实说
- 能用的:念稿、旁白、文章有声化、教学音频、视频重新配音;语速和语气能给指令,长文能整篇跑完,手机上也能出成品
- 差在哪:跟真人说话的语气细节、情绪起伏还有明显差距;唱歌模式只有官方内置音色支持,克隆出来的音色唱不了
- 定位:一个省时间的配音嗓子,不是真人替代品
名词小抄(读不懂就翻这里)
| 词 | 一句话解释 |
|---|---|
| 终端工具 | 手机里的命令行窗口,敲命令让它干活 |
| Python / 脚本 | 一种编程语言;"脚本"就是写好的一小段程序,跑一次干一件事 |
| ffmpeg | 开源音视频处理工具,剪、转、拼都靠它 |
| 模型 / 在线模型 | 部署在远端服务器上的 AI 程序,通过接口调用,不用在自己手机里跑 |
| 接口(API) | 程序之间约定好的"怎么问、怎么答",脚本靠它跟模型通话 |
| OpenAI 兼容接口 | 一种被广泛沿用的请求格式,换服务商时脚本不用改 |
| 样本 / 参考音频 | 给模型听的一小段录音,决定合成出来像谁 |
| 编码成文本传输 | 音频是二进制文件,接口只收文本,所以要先"翻译"成一段字符再发 |
| assistant / user 位置 | 接口用这个区分"谁在说话":朗读内容归助手位、语气要求归用户位 |
| 信噪比 / 削波 / 基频 | 样本的三个体检指标:人声比噪声清楚多少、有没有录爆、声音的基础音高 |
| 重采样 | 把音频换成另一种采样率,方便拼接与加处理 |
| 时间轴 | 记录"每句话在第几秒开始、第几秒结束"的文件 |
| A/B 试听 | 同一句话用两个样本各合成一遍,比着听哪个更像 |
边界(这条最重要)
只能克隆你本人、或者已经取得明确授权的声音。不拿别人的声音去做冒充,也不做用途不明的合成。技术本身是中性的,用在哪一边,是使用它的人自己选的。
▍本文由自建 Agent 调度内容流水线自动完成:写稿 → 模型 API 生图 → R2 图床 → 排版 → MCP 落站。
▍配图由模型 API 生成、托管在对象存储上;内容仅供参考。