# Qwen3-TTS-12Hz-1.7B-Base代码实例:Python API调用与批量语音合成脚本
> **声音克隆**:Qwen3-TTS-12Hz-1.7B-Base支持通过上传声音样本进行音色克隆,只需几秒钟的音频即可生成相似音色的语音内容。
## 1. 环境准备与快速安装
在开始使用Qwen3-TTS模型之前,我们需要先准备好Python环境并安装必要的依赖包。
### 1.1 安装必要的Python包
```bash
pip install torch transformers soundfile numpy tqdm
```
### 1.2 验证安装是否成功
```python
import torch
import transformers
print(f"PyTorch版本: {torch.__version__}")
print(f"Transformers版本: {transformers.__version__}")
```
## 2. 基础API调用示例
让我们从最简单的单次语音合成开始,了解如何用Python代码调用Qwen3-TTS模型。
### 2.1 最简单的文本转语音
```python
from transformers import AutoModel, AutoTokenizer
import torch
import soundfile as sf
# 加载模型和分词器
model_name = "Qwen/Qwen3-TTS-12Hz-1.7B-Base"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name, trust_remote_code=True)
# 要转换的文本
text = "欢迎使用Qwen3-TTS语音合成模型,这是一个强大的多语言语音生成工具。"
# 生成语音
with torch.no_grad():
audio = model.generate(text, tokenizer=tokenizer)
# 保存音频文件
sf.write("output.wav", audio.numpy(), samplerate=24000)
print("语音生成完成,已保存为output.wav")
```
### 2.2 支持多语言合成
```python
def generate_speech(text, language="zh", output_file="output.wav"):
"""
生成指定语言的语音
"""
# 根据语言添加相应的提示词
if language == "zh":
prompt_text = f"[中文]{text}"
elif language == "en":
prompt_text = f"[英文]{text}"
elif language == "ja":
prompt_text = f"[日文]{text}"
else:
prompt_text = text
# 生成语音
with torch.no_grad():
audio = model.generate(prompt_text, tokenizer=tokenizer)
# 保存文件
sf.write(output_file, audio.numpy(), samplerate=24000)
return output_file
# 生成中文语音
generate_speech("你好,世界!", "zh", "chinese.wav")
# 生成英文语音
generate_speech("Hello, world!", "en", "english.wav")
# 生成日文语音
generate_speech("こんにちは、世界!", "ja", "japanese.wav")
```
## 3. 批量语音合成脚本
在实际应用中,我们经常需要批量处理大量的文本内容。下面是一个完整的批量语音合成脚本。
### 3.1 批量处理CSV文件
首先准备一个CSV文件(texts.csv),内容如下:
```csv
id,text,language
1,欢迎使用语音合成系统,zh
2,Hello, this is a test.,en
3,今日は良い天気ですね,ja
4,这是一段较长的文本,用于测试模型处理长文本的能力。,zh
```
批量处理脚本:
```python
import pandas as pd
import os
from tqdm import tqdm
def batch_tts_from_csv(csv_file, output_dir="output_audio"):
"""
从CSV文件批量生成语音
"""
# 创建输出目录
os.makedirs(output_dir, exist_ok=True)
# 读取CSV文件
df = pd.read_csv(csv_file)
results = []
for index, row in tqdm(df.iterrows(), total=len(df), desc="生成语音"):
try:
text = row['text']
language = row.get('language', 'zh')
output_file = os.path.join(output_dir, f"audio_{row['id']}.wav")
# 生成语音
generate_speech(text, language, output_file)
results.append({
'id': row['id'],
'status': 'success',
'output_file': output_file
})
except Exception as e:
results.append({
'id': row['id'],
'status': 'error',
'error': str(e)
})
# 保存处理结果
result_df = pd.DataFrame(results)
result_df.to_csv(os.path.join(output_dir, "processing_results.csv"), index=False)
return result_df
# 使用示例
batch_tts_from_csv("texts.csv")
```
### 3.2 批量处理文本文件
如果你有多个文本文件需要处理:
```python
import glob
def batch_tts_from_txt_files(txt_pattern, output_dir="txt_audio_output"):
"""
批量处理多个文本文件
"""
os.makedirs(output_dir, exist_ok=True)
txt_files = glob.glob(txt_pattern)
results = []
for txt_file in tqdm(txt_files, desc="处理文本文件"):
try:
# 读取文本内容
with open(txt_file, 'r', encoding='utf-8') as f:
text = f.read().strip()
if not text:
continue
# 生成输出文件名
base_name = os.path.splitext(os.path.basename(txt_file))[0]
output_file = os.path.join(output_dir, f"{base_name}.wav")
# 生成语音
generate_speech(text, "zh", output_file)
results.append({
'input_file': txt_file,
'output_file': output_file,
'status': 'success'
})
except Exception as e:
results.append({
'input_file': txt_file,
'status': 'error',
'error': str(e)
})
return results
# 使用示例:处理所有txt文件
batch_tts_from_txt_files("*.txt")
```
## 4. 高级功能与实用技巧
### 4.1 控制语音风格和情感
Qwen3-TTS支持通过提示词控制语音的风格和情感:
```python
def generate_emotional_speech(text, emotion="happy", output_file="emotional.wav"):
"""
生成带有情感的语音
"""
# 添加情感提示词
emotional_text = f"[{emotion}]{text}"
with torch.no_grad():
audio = model.generate(emotional_text, tokenizer=tokenizer)
sf.write(output_file, audio.numpy(), samplerate=24000)
return output_file
# 生成不同情感的语音
generate_emotional_speech("今天真是美好的一天!", "happy", "happy.wav")
generate_emotional_speech("听到这个消息很难过", "sad", "sad.wav")
generate_emotional_speech("小心!有危险!", "angry", "angry.wav")
```
### 4.2 流式生成实现
对于实时应用,可以使用流式生成功能:
```python
def stream_generation(text, chunk_callback=None):
"""
流式生成语音,支持实时播放
"""
# 这里简化实现,实际使用时需要根据模型的具体流式接口调整
with torch.no_grad():
# 模拟流式生成
audio_chunks = []
for i in range(0, len(text), 10):
chunk_text = text[i:i+10]
if chunk_text.strip():
chunk_audio = model.generate(chunk_text, tokenizer=tokenizer)
audio_chunks.append(chunk_audio)
if chunk_callback:
chunk_callback(chunk_audio.numpy())
# 合并所有音频块
full_audio = torch.cat(audio_chunks, dim=0)
return full_audio
# 使用示例
def play_chunk(audio_data):
"""模拟播放音频块"""
print(f"收到音频块,长度: {len(audio_data)}")
audio = stream_generation("这是一段用于流式生成的测试文本", play_chunk)
sf.write("streamed.wav", audio.numpy(), samplerate=24000)
```
## 5. 实际应用案例
### 5.1 集成到Web应用
```python
from flask import Flask, request, send_file
import tempfile
import os
app = Flask(__name__)
@app.route('/generate_speech', methods=['POST'])
def generate_speech_api():
"""
Web API接口,接收文本返回语音文件
"""
data = request.json
text = data.get('text', '')
language = data.get('language', 'zh')
if not text:
return {"error": "文本内容不能为空"}, 400
try:
# 创建临时文件
with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as tmp_file:
output_path = tmp_file.name
# 生成语音
generate_speech(text, language, output_path)
return send_file(output_path, as_attachment=True, download_name='speech.wav')
except Exception as e:
return {"error": str(e)}, 500
finally:
# 清理临时文件
if os.path.exists(output_path):
os.unlink(output_path)
if __name__ == '__main__':
app.run(debug=True)
```
### 5.2 自动化播客生成
```python
def generate_podcast_from_script(script_file, output_file="podcast.wav"):
"""
从剧本文件生成完整播客
"""
with open(script_file, 'r', encoding='utf-8') as f:
lines = f.readlines()
audio_chunks = []
for line in tqdm(lines, desc="生成播客段落"):
line = line.strip()
if line and not line.startswith('#'): # 跳过空行和注释
try:
with torch.no_grad():
chunk_audio = model.generate(line, tokenizer=tokenizer)
audio_chunks.append(chunk_audio)
# 添加短暂静音作为段落间隔
silence = torch.zeros(24000 // 2) # 0.5秒静音
audio_chunks.append(silence)
except Exception as e:
print(f"处理行失败: {line}, 错误: {e}")
# 合并所有音频
if audio_chunks:
full_audio = torch.cat(audio_chunks, dim=0)
sf.write(output_file, full_audio.numpy(), samplerate=24000)
print(f"播客生成完成: {output_file}")
else:
print("没有生成任何音频内容")
# 使用示例
generate_podcast_from_script("podcast_script.txt")
```
## 6. 常见问题与解决方案
### 6.1 内存优化技巧
当处理长文本时,可能会遇到内存不足的问题:
```python
def memory_efficient_generate(text, max_chunk_length=100):
"""
内存优化的长文本生成
"""
# 将长文本分割成块
chunks = [text[i:i+max_chunk_length] for i in range(0, len(text), max_chunk_length)]
audio_chunks = []
for chunk in tqdm(chunks, desc="处理文本块"):
with torch.no_grad():
chunk_audio = model.generate(chunk, tokenizer=tokenizer)
audio_chunks.append(chunk_audio)
# 合并音频
full_audio = torch.cat(audio_chunks, dim=0)
return full_audio
# 使用示例
long_text = "这是一段非常长的文本..." * 10 # 模拟长文本
audio = memory_efficient_generate(long_text, max_chunk_length=50)
sf.write("long_audio.wav", audio.numpy(), samplerate=24000)
```
### 6.2 处理特殊字符和标点
```python
def preprocess_text(text):
"""
预处理文本,处理特殊字符和标点
"""
# 替换或移除可能影响合成的特殊字符
import re
text = re.sub(r'[^\w\s\u4e00-\u9fff\u3040-\u309f\u30a0-\u30ff\uac00-\ud7af,.;!?]', '', text)
return text
def safe_generate(text, output_file):
"""
安全的文本生成,包含预处理
"""
processed_text = preprocess_text(text)
try:
generate_speech(processed_text, "zh", output_file)
return True
except Exception as e:
print(f"生成失败: {e}")
return False
```
## 7. 总结
通过本文的代码示例,你应该已经掌握了如何使用Python调用Qwen3-TTS-12Hz-1.7B-Base模型进行语音合成。这个模型支持10种主要语言和多种方言,具备强大的语音生成能力。
**关键要点回顾**:
- 基础API调用简单直接,几行代码就能生成语音
- 批量处理功能可以高效处理大量文本内容
- 高级功能支持情感控制和流式生成
- 实际应用案例展示了如何集成到Web应用和自动化工作流中
**使用建议**:
1. 对于短文本,直接使用单次生成即可
2. 对于长文本,使用分块处理避免内存问题
3. 批量处理时添加适当的错误处理和进度显示
4. 根据实际需求调整生成参数和语音风格
Qwen3-TTS模型的低延迟和高保真特性使其非常适合实时应用场景,如语音助手、有声读物生成、多语言播客制作等。
---
> **获取更多AI镜像**
>
> 想探索更多AI镜像和应用场景?访问 [CSDN星图镜像广场](https://ai.csdn.net/?utm_source=mirror_blog_end),提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。