关键词:藏语、TTS、本地运行、MMS、VITS、Python
0. 这篇文章要解决什么问题?
这篇文章的目标是:
在本地,用 Python + 开源模型,把藏文文本文件合成一段藏语语音(wav 文件)。
读完后,你能做到这件事:
- 有一个
tibetan_text.txt,里面写着几行藏文; - 运行一个 Python 脚本;
- 得到一个
tibetan_from_file.wav,可以直接播放,听到藏语朗读。
1. 方案概览:用什么?
我们选用的是 Meta 开源的 MMS-TTS 模型中的一个子模型:
- 模型名:
facebook/mms-tts-khg - 作用:针对 藏语康方言(Khams) 的文本转语音(TTS)模型
- 接口:已经集成进 Hugging Face 的 Transformers 库
你可以简单把它理解为一个"会说藏语康方言的 TTS 小盒子":
- 输入:藏文文本(Unicode 藏文字)
- 输出:语音波形(可以保存为 wav 文件)
我们要做的事情就是:
- 把文本从文件中读出来;
- 交给这个模型;
- 把模型输出的语音保存为一个
.wav文件。
2. 环境准备
2.1 创建虚拟环境(可选但推荐)
bash
python -m venv venv
# macOS / Linux
source venv/bin/activate
# Windows
# venv\Scripts\activate
2.2 安装依赖
bash
pip install --upgrade transformers accelerate
pip install torch scipy numpy
说明:
transformers:加载 MMS-TTS 模型;torch:模型推理;scipy、numpy:处理音频、写 wav 文件。
第一次运行时,会自动从 Hugging Face 下载模型文件,可能几百 MB。
3. 准备藏文文本文件
在你准备放脚本的目录下,新建一个文本文件:
文件名 :tibetan_text.txt
编码:UTF-8
示例内容(你可以换成自己的):
text
ངའི་མིང་ལ་བཀྲ་ཤིས་ཟེར།
ང་སློབ་མ་ཡིན།
脚本会把整个文件内容合成成一段连续语音。
4. 完整代码:从文件读入 → 合成 → 输出 wav
在和 tibetan_text.txt 同一个目录下,新建 Python 文件,比如 mms_tts_from_file.py,内容如下:
python
from transformers import VitsModel, AutoTokenizer
import torch
import scipy.io.wavfile as wavfile
from pathlib import Path
import os
import numpy as np
def main():
# 1. 打印当前工作目录,方便排查路径问题
print("当前工作目录:", os.getcwd())
# 脚本所在目录(绝对路径,避免跑丢)
script_dir = Path(__file__).resolve().parent
# 要读取的文本文件路径(和脚本放一起)
input_path = script_dir / "tibetan_text.txt"
if not input_path.exists():
print(f"找不到文本文件: {input_path}")
print("请在脚本同目录下创建 tibetan_text.txt,并写入藏文文本。")
return
# 2. 读取文件内容(UTF-8)
with open(input_path, "r", encoding="utf-8") as f:
text = f.read().strip()
if not text:
print("文本文件为空,不进行合成。")
return
print("将要合成的文本如下:")
print(text)
print("-" * 40)
# 3. 加载 MMS TTS 模型和分词器(Tibetan, Khams)
model_name = "facebook/mms-tts-khg"
print(f"正在加载模型: {model_name} ...")
model = VitsModel.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
model.eval()
# 如果你有 GPU,可以启用这一段:
# device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# model.to(device)
# 4. 文本 -> token
inputs = tokenizer(text, return_tensors="pt")
# 如果用了 GPU,需要把 inputs 也 .to(device)
# inputs = {k: v.to(device) for k, v in inputs.items()}
# 5. 推理生成语音(波形)
print("正在合成语音...")
with torch.no_grad():
output = model(**inputs).waveform # 形状: [1, N]
# 6. 转为 numpy,并归一化到 int16(标准 wav 格式)
audio = output.squeeze().cpu().numpy()
max_val = np.max(np.abs(audio))
if max_val > 0:
audio = audio / max_val
audio = (audio * 32767).astype("int16")
# 采样率:从模型配置里取
sr = model.config.sampling_rate
# 7. 输出 wav 文件到脚本同目录
out_path = script_dir / "tibetan_from_file.wav"
wavfile.write(str(out_path), rate=sr, data=audio)
print("已生成 wav 文件:")
print(out_path)
print("文件是否存在:", out_path.exists())
if __name__ == "__main__":
main()
5. 运行脚本、检查结果
在终端进入这个目录,确保虚拟环境已激活,然后运行:
bash
python mms_tts_from_file.py
你会看到类似输出:
text
当前工作目录: /Users/xxx/Projects/tibetan-tts
将要合成的文本如下:
ངའི་མིང་ལ་བཀྲ་ཤིས་ཟེར།
ང་སློབ་མ་ཡིན།
...
----------------------------------------
正在加载模型: facebook/mms-tts-khg ...
正在合成语音...
已生成 wav 文件:
/Users/xxx/Projects/tibetan-tts/tibetan_from_file.wav
文件是否存在: True
然后就可以用任意播放器(系统自带、VLC、Audacity 等)打开 tibetan_from_file.wav,听听效果。
6. 代码解析
-
Transformers + MMS-TTS 模型
VitsModel.from_pretrained("facebook/mms-tts-khg")把一个"会说藏语的模型"加载到内存。
-
Tokenizer 把藏文变成模型能理解的数字序列
tokenizer(text, return_tensors="pt")负责把 Unicode 藏文编码成一串 ID。
-
模型输出一串"音波",我们把它写进 wav 文件
model(**inputs).waveform得到的是浮点数波形;- 用
scipy.io.wavfile.write写成标准的 16-bit PCM wav 文件。
所以,本质工作流就是:
文本文件 → 字符串 → 数字序列 → 语音波形 →
.wav
7. 如何使用
7.1 适合用在这些场景:
- 个人藏语学习工具:自动给例句、单词配音;
- 藏语教学课件/视频:批量生成朗读音频,再配字幕、配数字人;
- 藏语语料标注辅助:给文本语料加一个"机器朗读版本",用来对比、辅助校对。
最大的特点是:本地运行,不依赖云 API,只要能下载模型,就可以离线使用。
注意:MMS-TTS 的 License 是「非商业」方向,科研、学习没问题,如果要做收费产品,要额外考虑版权和合规问题。
7.2 可以很容易扩展的几个方向
-
一行文本 → 一个 wav 文件
把文件按行读入,每一行调用一次模型,保存为
sentence_01.wav、sentence_02.wav......适合给教材里的每个例句单独配音。
-
封装成命令行工具
做成:
bashpython tib_tts_cli.py input.txt output.wav或者支持多个参数,如
--device cpu/gpu、--chunk-size等。 -
做成简单的 Web API
用 Flask / FastAPI 包一层:
- 前端传藏文文本;
- 后端调用这段逻辑,返回 wav/mp3 字节流;
- 可以变成你藏语教学网站、小程序的后端服务。
8. 小结
这篇文章尽量少讲复杂理论,只讲清楚一件事:
如何在本地,从藏文文本文件出发,一步步获得一段藏语语音 wav 文件。
关键点回顾:
- 用
facebook/mms-tts-khg这个针对藏语 Khams 的 TTS 模型; - 用 Transformers 加载模型、Tokenizer 处理文本;
- 用 SciPy 写 wav 文件;
- 整个流程只需要一个
tibetan_text.txt+ 一份 Python 脚本。