3. 语速与音调调节
任务说明
为语音合成模块增加语速(speed)与音调(pitch)两个可调参数,使同一段文本能够以不同语速和音调朗读,并输出可播放的音频文件。本案例基于 pyttsx3 引擎实现,聚焦于参数设置与音频生成的最小闭环。
实现方案
使用 pyttsx3 的 setProperty() 方法分别设置语速(words per minute)与音调(pitch百分比)。语速默认值为200,音调默认值为50(引擎内部范围通常为0~100)。通过命令行参数接收用户输入,生成对应音频并保存为WAV文件。
代码实现
import pyttsx3
import sys
def synthesize(text: str, speed: int = 200, pitch: int = 50, output: str = "output.wav"):
"""
根据指定语速和音调合成语音并保存为音频文件。
参数:
text: 要朗读的文本
speed: 语速(词/分钟),默认200
pitch: 音调(0~100),默认50
output: 输出音频文件名
"""
engine = pyttsx3.init()
# 设置语速与音调
engine.setProperty('rate', speed)
engine.setProperty('pitch', pitch)
# 保存到文件
engine.save_to_file(text, output)
engine.runAndWait()
print(f"已生成音频: {output} (语速={speed}, 音调={pitch})")
if __name__ == "__main__":
# 命令行参数: python tts_control.py "文本" [语速] [音调] [输出文件名]
if len(sys.argv) < 2:
print("用法: python tts_control.py \"文本\" [语速] [音调] [输出文件名]")
sys.exit(1)
text = sys.argv[1]
speed = int(sys.argv[2]) if len(sys.argv) > 2 else 200
pitch = int(sys.argv[3]) if len(sys.argv) > 3 else 50
output = sys.argv[4] if len(sys.argv) > 4 else "output.wav"
synthesize(text, speed, pitch, output)
依赖安装
pip install pyttsx3
# Linux 系统还需安装 espeak 与 libespeak1
sudo apt-get install espeak libespeak1 # Ubuntu/Debian
运行与验证
执行以下命令生成不同语速和音调的音频文件:
# 默认语速200,音调50
python tts_control.py "你好,欢迎学习AI数字人课程"
# 慢速(120词/分钟),低音调(30)
python tts_control.py "这是一段慢速低音朗读" 120 30 slow_low.wav
# 快速(300词/分钟),高音调(80)
python tts_control.py "这是一段快速高音朗读" 300 80 fast_high.wav
验证方法:
- 运行上述三条命令,确认终端输出“已生成音频”且无异常报错;
- 检查当前目录下是否生成
output.wav、slow_low.wav、fast_high.wav三个文件; - 使用任意音频播放器(如
ffplay、VLC)播放三个文件,主观听感应满足:slow_low.wav明显比output.wav语速慢且音调低,fast_high.wav明显比output.wav语速快且音调高。
判定标准:三个音频文件均能正常播放,且语速与音调差异符合参数设定方向,即视为功能通过。
参数说明
| 参数 | 范围 | 默认值 | 效果 |
|---|---|---|---|
| 语速 (rate) | 50~400 词/分钟 | 200 | 数值越大朗读越快 |
| 音调 (pitch) | 0~100 | 50 | 数值越大声音越尖锐 |
注意事项:不同操作系统下 pyttsx3 对 pitch 属性的支持程度不同。Windows 的 SAPI5 驱动支持该属性;Linux 的 espeak 驱动可能忽略 pitch 设置。若在 Linux 下音调无变化,建议改用 espeak 命令行工具或 gTTS 配合音频后处理实现音调调节。