news 2026/4/8 19:12:17

语音合成 - 用 Python 合成藏语三大方言语音

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
语音合成 - 用 Python 合成藏语三大方言语音

通过使用藏语语音合成技术,可以把一段藏文文字,快速变成可用的音频,用在短视频、朗读、课件或字幕配音里。本文介绍一套 Python 脚本,可以直接合成藏语三大方言的语音:

  • 卫藏方言:facebook/mms-tts-bod([Hugging Face][1])
  • 康巴方言:facebook/mms-tts-khg([Hugging Face][2])
  • 安多方言:facebook/mms-tts-adx([Hugging Face][3])

它们都属于 Meta 的 MMS-TTS 系列,并且在 Transformers4.33+就能直接调用。([Hugging Face][3])


语音合成技术可以用来干什么?

  1. 语言学习短视频配音
    每行一句藏文文字,批量合成音频;导入剪映等视频编辑工具,配字幕、配画面,快速出片。

  2. 课件/朗读材料配音
    把教材段落放进文本文件,生成“逐句音频 + 合并后的整段音频”,课堂或自学都方便。

  3. 多方言对比
    同一段藏文,用卫藏/康巴/安多方言各合成一版,做对比学习或演示。


准备工作

1)安装依赖

在命令行里执行:

pipinstall-U transformers accelerate torch soundfile numpy

可选(推荐,但没有也能跑):

pipinstall-U scipy

2)准备一个文本文件(每行一句)

例如:sentences_tbt.txt

  • 每行写一条藏文句子
  • 空行会自动跳过
  • 也可以写代码来把文本分割为句子

最简单的用法:改 3 行就能跑

新建文件:tibetan_tts_easy.py,复制下面全部代码。你只需要改最上面的三行:方言、输入文件名、输出目录。

这份脚本会同时生成:

  • 逐句 wav:adx_0001.wavadx_0002.wav
  • 合并后的整段 wav:adx_full.wav
    并且强制输出PCM_16,避免“播放器能播但剪映无声”的问题。
fromtransformersimportVitsModel,AutoTokenizerimporttorchimportsoundfileassfimportnumpyasnpimportosfrommathimportgcd# ========== 你只需要改这 3 行 ==========DIALECT="adx"# "bod"(卫藏方言) / "khg"(康巴方言) / "adx"(安多方言)INPUT_FILE="sentences_tbt.txt"OUTPUT_DIR="wavs_adx"# ===================================# 句子之间停顿(秒)GAP_SECONDS=0.2# 为了剪映/剪辑软件兼容:强制写 PCM16WAV_SUBTYPE="PCM_16"# 可选:统一采样率到 48000(更适合剪映/PR)TARGET_SR=48000# 不想重采样可改成 NoneDIALECT_MODELS={"bod":"facebook/mms-tts-bod",# :contentReference[oaicite:4]{index=4}"khg":"facebook/mms-tts-khg",# :contentReference[oaicite:5]{index=5}"adx":"facebook/mms-tts-adx",# :contentReference[oaicite:6]{index=6}}DEVICE="cuda"iftorch.cuda.is_available()else"cpu"defread_sentences(path):out=[]withopen(path,"r",encoding="utf-8")asf:forlineinf:t=line.strip()ift:out.append(t)returnoutdefnormalize(audio,target_peak=0.95):audio=audio.astype(np.float32,copy=False)peak=float(np.max(np.abs(audio))+1e-12)ifpeak>0:audio=np.clip(audio/peak*target_peak,-1.0,1.0)returnaudiodefresample_if_needed(audio,orig_sr,target_sr):iftarget_srisNoneortarget_sr==orig_sr:returnaudio,orig_srtry:importscipy.signalexceptImportError:print("[WARN] 未安装 scipy,跳过重采样,使用原采样率输出。")returnaudio,orig_sr g=gcd(orig_sr,target_sr)up=target_sr//g down=orig_sr//g audio2=scipy.signal.resample_poly(audio,up,down).astype(np.float32)returnaudio2,target_srdefmain():model_name=DIALECT_MODELS[DIALECT]print(f"Loading{model_name}on{DEVICE}...")model=VitsModel.from_pretrained(model_name).to(DEVICE)tokenizer=AutoTokenizer.from_pretrained(model_name)os.makedirs(OUTPUT_DIR,exist_ok=True)sents=read_sentences(INPUT_FILE)print(f"Loaded{len(sents)}lines from{INPUT_FILE}")ifnotsents:returnfull_path=os.path.join(OUTPUT_DIR,f"{DIALECT}_full.wav")full_writer=Nonefull_sr=Nonefori,textinenumerate(sents,start=1):inputs=tokenizer(text,return_tensors="pt").to(DEVICE)withtorch.no_grad():wav=model(**inputs).waveform.squeeze().cpu().numpy()wav=wav.reshape(-1)# 保证一维wav=normalize(wav)sr=int(model.config.sampling_rate)wav,sr=resample_if_needed(wav,sr,TARGET_SR)iffull_writerisNone:full_sr=sr gap=np.zeros(int(full_sr*GAP_SECONDS),dtype=np.float32)full_writer=sf.SoundFile(full_path,mode="w",samplerate=full_sr,channels=1,subtype=WAV_SUBTYPE,format="WAV")print("FULL:",full_path)seg_path=os.path.join(OUTPUT_DIR,f"{DIALECT}_{i:04d}.wav")sf.write(seg_path,wav,full_sr,subtype=WAV_SUBTYPE)full_writer.write(wav)ifGAP_SECONDS>0:full_writer.write(gap)print(f"[{i}/{len(sents)}]{seg_path}")full_writer.close()print("Done.")if__name__=="__main__":main()

运行:

python tibetan_tts_easy.py

导入剪映的最稳设置(避免“无声”)

你只要用上面脚本输出的 WAV(PCM_16),一般直接导入就会有波形和声音。原因是模型页本身给的是波形输出示例,但很多人保存时会写成 float WAV,剪辑软件兼容性不稳定;而 MMS 模型在 Transformers 4.33+ 可直接推理,这点在模型页也写得很清楚。([Hugging Face][3])


常见问题

1)能不能选“男声/女声/不同音色”?

就这三个 MMS 藏语方言 checkpoint 来说,你可以理解为:每个方言模型基本就是一个固定声音风格。它们主要提供“能把文本读出来”的能力,而不是“内置很多音色可选”的商业 TTS 音色库。([Hugging Face][3])

2)能不能控制语速?

对非技术用户,最稳的方式是:合成完再变速(不会影响能不能合成)。例如把音频加速 1.15 倍:

ffmpeg -y -i input.wav -filter:a"atempo=1.15"output.wav

3)同一句话每次合成略有差别,正常吗?

正常。VITS 合成本身有非确定性;如果你希望“每次一样”,可以固定随机种子(Transformers 的 VITS 文档也专门提醒了这点)。([Hugging Face][4])


使用许可提醒(建议写在文末,避免踩坑)

这几个模型页面都标注了许可证为CC BY-NC 4.0(非商业)。如果你用于商业用途(付费课程、付费 App、广告变现等),务必先确认许可范围。([Hugging Face][3])

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/30 12:45:15

马达驱动芯片核心逻辑:从信号到动力的“功率放大密码”

马达驱动芯片的核心作用是接收控制信号,并输出足够的电压 / 电流来驱动电机运转,同时集成保护、调速、换向等功能,本质是一个功率放大与控制的专用集成电路(IC)。它能解决单片机、MCU 等控制芯片输出功率不足的问题&am…

作者头像 李华
网站建设 2026/3/21 16:52:24

OpenCore Legacy Patcher终极指南:让老Mac免费升级最新macOS

OpenCore Legacy Patcher终极指南:让老Mac免费升级最新macOS 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为2012年之前的Mac无法安装最新macOS系统而苦…

作者头像 李华
网站建设 2026/4/5 22:57:44

jQuery 尺寸

jQuery 尺寸 引言 jQuery 是一个广泛使用的 JavaScript 库,它极大地简化了 HTML 文档遍历、事件处理、动画和 Ajax 操作等操作。在开发中,有时我们需要获取元素的大小,jQuery 提供了一系列方法来实现这一功能。本文将详细介绍 jQuery 中与尺寸相关的方法,帮助开发者更好地…

作者头像 李华
网站建设 2026/4/2 8:28:54

从SP到BP战略规划与解码全流程(华为案例)

华为公司能持续穿越产业周期、在多个领域取得全球领先地位,其核心引擎之一是一套严谨、闭环、动态迭代的战略管理体系。 这套体系的核心,即是从3-5年战略规划(SP)向年度业务计划(BP)的高质量解码与落地过程…

作者头像 李华
网站建设 2026/4/3 21:53:42

XML Schema 元素

XML Schema 元素 XML Schema 是一种用来定义 XML 文档结构的语言。它是 XML 文档类型定义(DTD)的替代品,提供了更强大和灵活的机制来描述 XML 文档的结构和内容。本文将详细探讨 XML Schema 中的元素,并解释它们在构建 XML 文档中的作用。 1. XML Schema 基础 在深入讨论…

作者头像 李华
网站建设 2026/4/5 16:33:52

MobaXterm:运维高手的终极利器

MobaXterm:高效运维实战指南 - 技术文章大纲一、 引言运维工程师的痛点:远程管理、多协议支持、文件传输、效率工具MobaXterm 简介:一体化网络工具集All-in-One 解决方案 (SSH, X11, RDP, VNC, Telnet, FTP, SFTP, ...)开源免费版与专业版的区…

作者头像 李华