用 Meta MMS-TTS + Python在本地把藏文文本变成藏语语音

关键词:藏语、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 文件)

我们要做的事情就是:

  1. 把文本从文件中读出来;
  2. 交给这个模型;
  3. 把模型输出的语音保存为一个 .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:模型推理;
  • scipynumpy:处理音频、写 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. 代码解析

  1. Transformers + MMS-TTS 模型

    • VitsModel.from_pretrained("facebook/mms-tts-khg") 把一个"会说藏语的模型"加载到内存。
  2. Tokenizer 把藏文变成模型能理解的数字序列

    • tokenizer(text, return_tensors="pt") 负责把 Unicode 藏文编码成一串 ID。
  3. 模型输出一串"音波",我们把它写进 wav 文件

    • model(**inputs).waveform 得到的是浮点数波形;
    • scipy.io.wavfile.write 写成标准的 16-bit PCM wav 文件。

所以,本质工作流就是:

文本文件 → 字符串 → 数字序列 → 语音波形 → .wav


7. 如何使用

7.1 适合用在这些场景:

  • 个人藏语学习工具:自动给例句、单词配音;
  • 藏语教学课件/视频:批量生成朗读音频,再配字幕、配数字人;
  • 藏语语料标注辅助:给文本语料加一个"机器朗读版本",用来对比、辅助校对。

最大的特点是:本地运行,不依赖云 API,只要能下载模型,就可以离线使用。

注意:MMS-TTS 的 License 是「非商业」方向,科研、学习没问题,如果要做收费产品,要额外考虑版权和合规问题。


7.2 可以很容易扩展的几个方向

  1. 一行文本 → 一个 wav 文件

    把文件按行读入,每一行调用一次模型,保存为 sentence_01.wavsentence_02.wav......

    适合给教材里的每个例句单独配音。

  2. 封装成命令行工具

    做成:

    bash 复制代码
    python tib_tts_cli.py input.txt output.wav

    或者支持多个参数,如 --device cpu/gpu--chunk-size 等。

  3. 做成简单的 Web API

    用 Flask / FastAPI 包一层:

    • 前端传藏文文本;
    • 后端调用这段逻辑,返回 wav/mp3 字节流;
    • 可以变成你藏语教学网站、小程序的后端服务。

8. 小结

这篇文章尽量少讲复杂理论,只讲清楚一件事:

如何在本地,从藏文文本文件出发,一步步获得一段藏语语音 wav 文件。

关键点回顾:

  • facebook/mms-tts-khg 这个针对藏语 Khams 的 TTS 模型;
  • 用 Transformers 加载模型、Tokenizer 处理文本;
  • 用 SciPy 写 wav 文件;
  • 整个流程只需要一个 tibetan_text.txt + 一份 Python 脚本。
相关推荐
摸爬滚打李上进1 小时前
Pycharm编辑HTML文件注释问题
python·pycharm·django·bootstrap·html5
二川bro1 小时前
内存泄漏检测:Python内存管理深度解析
java·开发语言·python
武子康2 小时前
AI研究-133 Java vs Kotlin/Go/Rust/Python/Node:2025 详细对比分析 定位与取舍指南
java·javascript·python·golang·rust·kotlin·node
执笔论英雄2 小时前
【RL]expand_requests干啥的
服务器·开发语言·python
kesifan2 小时前
JAVA线程的建立方法
java·开发语言·python
TechMasterPlus2 小时前
调用千问大模型服务
人工智能·python
apocelipes2 小时前
Linux的binfmt_misc机制
linux·c语言·c++·python·golang·linux编程·开发工具和环境
中工钱袋2 小时前
Java Stream 流详解
java·windows·python
z***3352 小时前
SpringBoot项目中读取resource目录下的文件(六种方法)
spring boot·python·pycharm