环境
- 操作系统:Windows 11
- Python:3.11.9
安装
bash
# 安装 PyTorch(CPU 版)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
# 安装 Qwen-TTS 库
pip install -U qwen-tts
# 安装 ModelScope 并下载模型
pip install -U modelscope
modelscope download --model Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice --local_dir ./Qwen3-TTS-12Hz-0.6B-CustomVoice
代码实例
python
import time
import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel
# 加载 0.6B 模型,使用 CPU + float32
# (GPU 上缺 flash-attn 会退化到手动注意力,触发 CUDA 内核断言,故用 CPU)
model = Qwen3TTSModel.from_pretrained(
r"C:\Users\admin\Qwen3-TTS-12Hz-0.6B-CustomVoice",
device_map="cpu",
dtype=torch.float32,
)
# 生成语音测试
text = "就像股票一样,每个人也存在一个市场给你的"估值"和真实的"价值",通过简单的类比你就能知道,外人很难准确知道你的价值。市场只能对你有个估值,与你的真实价值相比,有时高估,有时极度高估,有时低估,有时极度低估。估值与价值偶有交点,那也不是故意的,是极少的瞬间。对于自己的价值和估值,桥水资本的老大达里奥是这样建议的:不要让自己的估值过分超过自己的实际价值。这是有道理的。如果交易只有一次,那么,估值越高越好。可若是注定要交易多次,那么情况就不同了。人们过分在意,甚至有意抬高估值的根源是"终点式思维",误以为可以"一锤定音"。可实际上,路很长,交易(选择)很多,甚至,大多数交易干脆算不上是里程碑,只不过是漫漫长路上的鸡毛蒜皮,于是,每次都想以大于价值的估值交易实际上是完全不可能的。更为重要的,是另外一方面。因为当你在意估值的时候,你就会忘记你的价值,你就会不由自主做那些提高你估值的事,而不是去想办法提高你的价值。长期来看,估值是虚幻的,虽有波动,却实际上锚定在价值上,价值不增长,长期来看估值一定长不上去,而且既然有极度高估,那么就不但随时有低估,还随时会有极度低估。我们不用道德层面的词语去形容这种选择,比如"踏实"等,仅从冰冷的经济学角度出发,我们就能知道:忘记价值,追求估值------这肯定是极度愚蠢的。从另外一个层面来看,我还有个理解:只有这样,你才真正有尊严。因为不顾价值地追求估值,本质上就是选择做骗子。做那些不顾价值地追求估值的事情,比如,通过频繁跳槽获得短期内的更高工资,既是骗了别人也是骗了自己。做一次事,骗起码两次人,后果很严重啊。骗别人倒也罢了,不知不觉把自己也骗了,那就真的太傻了。但还是有很多人忍不住这么做,成了一种习惯,因为欺骗的短期收益总是很高。长久以后,这个习惯几乎无法根除,你看坚守铁律之所以难,是因为违背铁律的诱惑实在太大了。可是反过来看,所有的欺骗都不长久,都有水落石出的一天,这样来看,桥水的达里奥给出的建议实在很睿智。"
t_start = time.perf_counter()
wavs, sr = model.generate_custom_voice(
text=text,
speaker="serena", # 内置说话人:serena/vivian/uncle_fu/ryan/aiden/ono_anna/sohee/eric/dylan
language="chinese", # 中文;可选 english/german/japanese 等
)
gen_seconds = time.perf_counter() - t_start
# 保存为 wav 文件(wavs[0] 已是 numpy.ndarray,无需 .cpu())
sf.write("output_test.wav", wavs[0], sr)
duration_sec = len(wavs[0]) / sr # 生成音频的实际时长(秒)
print("语音生成完毕,已保存为 output_test.wav")
print(f"文字转语音耗时: {gen_seconds / 60:.4f} 分钟 ({gen_seconds:.2f} 秒)")
print(f"生成音频时长: {duration_sec:.2f} 秒,实时率 RTF = {gen_seconds / duration_sec:.3f}")