
在人工智能与语音交互技术飞速发展的今天,TTS(Text-to-Speech,文本转语音)已渗透到生活与工作的方方面面。从手机导航的语音播报、智能音箱的对话反馈,到有声书制作、企业客服语音提醒,TTS技术以“让文字开口说话”的核心能力,大幅提升了信息传递效率与用户体验。今天我们从TTS技术基础入手,详解主流实现方案,结合丰富实操示例,覆盖从入门到进阶的全场景应用,帮助读者快速掌握TTS技术的使用方法。
TTS技术的本质是将文本信息转化为自然语音信号,核心流程分为三步:
选择TTS方案时,需重点关注以下三个指标:
初次接触,我们先做一些基础示例体验,优先从“零配置、低门槛”的方案入手,快速体验TTS核心功能。我们通过pyttsx3(离线)和gTTS(在线)两个入门工具的实操步骤,覆盖单文本转语音、基础参数配置等核心需求。
pyttsx3是基于系统内置语音引擎的Python库,无需联网、无需复杂配置,安装后即可使用,支持Windows、Linux、Mac三大系统,适合快速测试和简单离线场景。
一行代码实现文本转语音并立即播放,并可将播报文字存为wav音频格式:
import pyttsx3
# 初始化引擎
engine = pyttsx3.init()
# 核心:文本转语音并立即播放
engine.say("你好,今天是2025年12月8日,这是最简单的TTS语音播报示例!")
# 等待语音播放完成
engine.runAndWait()
# (可选)保存语音到文件(仅支持wav格式)
engine.save_to_file("你好,这是保存的语音文件", "output.wav")
engine.runAndWait()
可通过调整参数优化语音效果,支持语速、音量、发音人(男声/女声/多语言)切换:
import pyttsx3
engine = pyttsx3.init()
# 1. 调整语速(默认200,范围0-500)
engine.setProperty('rate', 150)
# 2. 调整音量(默认1.0,范围0.0-1.0)
engine.setProperty('volume', 0.8)
# 3. 切换发音人(0=男声,1=女声,不同系统数量不同)
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[1]) # 切换到女声
# 播放
engine.say("调整后的语音效果,语速更慢,音量适中,女声发音")
engine.runAndWait()调整语音情感,通过控制语速,调整音量模拟不同情感的语音
import pyttsx3
engine = pyttsx3.init()
# 模拟不同情感的语音
def emotional_tts(text, emotion="normal"):
if emotion == "happy": # 欢快:语速快、音量高
engine.setProperty('rate', 180)
engine.setProperty('volume', 1.0)
elif emotion == "sad": # 悲伤:语速慢、音量低
engine.setProperty('rate', 120)
engine.setProperty('volume', 0.6)
elif emotion == "angry": # 愤怒:语速快、音量高、略卡顿
engine.setProperty('rate', 200)
engine.setProperty('volume', 1.0)
else: # 正常
engine.setProperty('rate', 150)
engine.setProperty('volume', 0.8)
engine.say(text)
engine.runAndWait()
# 测试不同情感
# emotional_tts("今天收到了心仪的offer,太开心了!", "happy")
# emotional_tts("这次考试没发挥好,有点难过", "sad")
emotional_tts("为什么又迟到了!下次注意!", "angry")将pyttsx3生成的WAV转为MP3,从而达到减小文件体积的效果
from pydub import AudioSegment
import os
# 将pyttsx3生成的WAV转为MP3(减小文件体积)
def wav_to_mp3(wav_path, mp3_path):
audio = AudioSegment.from_wav(wav_path)
audio.export(mp3_path, format="mp3", bitrate="128k") # 128k音质
print(f"已转换:{mp3_path}")
# 批量转换文件夹下的所有WAV
def batch_wav_to_mp3(input_dir, output_dir):
os.makedirs(output_dir, exist_ok=True)
for file in os.listdir(input_dir):
if file.endswith(".wav"):
wav_path = os.path.join(input_dir, file)
mp3_path = os.path.join(output_dir, file.replace(".wav", ".mp3"))
wav_to_mp3(wav_path, mp3_path)
# 调用
batch_wav_to_mp3("audio_batch", "audio_mp3")gTTS(Google Text-to-Speech)是调用谷歌在线TTS接口的Python库,支持中文、英文、日语等数十种语言,语音自然度高于pyttsx3,但需联网使用,适合对音质有一定要求的多语言场景。
安装核心依赖:pip install gTTS pydub pydub需配合ffmpeg使用,用于解析MP3格式。Windows环境下载ffmpeg,解压后将bin目录添加到系统环境变量;
from gtts import gTTS
from pydub import AudioSegment
from pydub.playback import play
import os
# 1. 定义待转换文本与语言(lang参数:zh-CN=中文,en=英文,ja=日语)
text_zh = "谷歌TTS支持多语言生成,音质更接近真人发音"
text_en = "Google TTS supports multi-language generation with high-quality voice"
text_ja = "Google TTSは多言語生成に対応しており、音質は人間の発音に近いです"
# 2. 生成MP3文件(以中文为例)
tts = gTTS(text=text_zh, lang='zh-CN', slow=False) # slow=False:正常语速,True:慢速
output_path = "gtts_output.mp3"
tts.save(output_path)
print(f"已生成语音文件:{output_path}")
# 3. 播放生成的MP3文件
audio = AudioSegment.from_mp3(output_path)
play(audio)
# (可选)删除临时文件
os.remove(output_path)读取txt文件中的多行文本(每行一个语音片段),批量生成WAV格式语音文件,保存到指定文件夹。
import pyttsx3
import os
# 初始化TTS引擎并配置参数
engine = pyttsx3.init()
engine.setProperty('rate', 160) # 语速:160词/分钟
engine.setProperty('volume', 0.9) # 音量:0.9(接近最大)
# engine.setProperty('voice', pyttsx3.getProperty('voices')[1].id) # 选择女声
# 批量生成语音函数
def batch_tts_from_txt(txt_path, output_dir):
# 创建输出文件夹(若不存在)
os.makedirs(output_dir, exist_ok=True)
# 读取txt文件(按行分割文本,过滤空行)
with open(txt_path, 'r', encoding='utf-8') as f:
texts = [line.strip() for line in f if line.strip()]
# 逐行生成语音文件(命名格式:audio_1.wav、audio_2.wav...)
for i, text in enumerate(texts):
output_path = os.path.join(output_dir, f"audio_{i+1}.wav")
engine.save_to_file(text, output_path)
print(f"已生成:{output_path}")
# 执行批量生成(必须调用,否则无法保存文件)
engine.runAndWait()
# 调用函数:处理text_list.txt文件,输出到audio_batch文件夹
batch_tts_from_txt(txt_path="test2.txt", output_dir="audio_batch")文档内容和输出文件参考:

批量生成中文、英文、日语三种语言的语音文件,适配多语言内容创作场景。
from gtts import gTTS
import os
# 批量生成多语言语音函数
def batch_tts_multi_lang(text_list, output_dir):
# 创建输出文件夹
os.makedirs(output_dir, exist_ok=True)
# 语言映射表(对应gTTS的lang参数)
lang_map = {
"zh": "zh-CN", # 中文
"en": "en", # 英文
"ja": "ja" # 日语
}
# 逐一生成不同语言的语音文件
for i, (text, lang) in enumerate(text_list):
# 生成TTS对象
tts = gTTS(text=text, lang=lang_map[lang], slow=False)
# 命名格式:audio_1_zh.mp3(序号+语言)
output_path = os.path.join(output_dir, f"audio_{i+1}_{lang}.mp3")
tts.save(output_path)
print(f"已生成{lang}语音:{output_path}")
# 待转换的文本列表(元组格式:(文本内容, 语言标识))
text_list = [
("今天天气很好,适合出门散步", "zh"),
("Life is like a box of chocolates, you never know what you gonna get", "en"),
("今日は天気がいいですね、公園で散歩したいです", "ja"),
("人工智能正在改变世界", "zh"),
("AI is transforming the world", "en")
]
# 调用函数:输出到multi_lang_audio文件夹
batch_tts_multi_lang(text_list=text_list, output_dir="multi_lang_audio")结合time模块,实现每小时自动播报休息提醒,适配办公场景的健康管理。
import pyttsx3
import time
# 初始化TTS引擎(选择女声)
engine = pyttsx3.init()
voices = engine.getProperty('voices')
#engine.setProperty('voice', voices[1].id)
# 定时播报函数
def timing_reminder(interval=3600): # interval:间隔时间(秒),默认3600秒=1小时
print(f"定时提醒已启动,每{interval//60}分钟播报一次...")
while True:
# 获取当前时间(格式:时:分:秒)
current_time = time.strftime("%H:%M:%S", time.localtime())
# 提醒文本
reminder_text = f"现在时间是{current_time},该放下工作休息一下啦,保护眼睛从每小时休息开始!"
# 语音播报
engine.say(reminder_text)
engine.runAndWait()
# 等待指定间隔时间(循环执行)
time.sleep(interval)
# 测试时可将interval设为10秒(快速验证效果)
timing_reminder(interval=10)基于pyttsx3实现,通过调整语速和音量模拟情感模拟欢快、悲伤、愤怒三种情感的语音效果,适配故事播报、情感化提醒等场景。
import pyttsx3
engine = pyttsx3.init()
# 情感化TTS函数(根据emotion参数调整语速和音量)
def emotional_tts(text, emotion="normal"):
if emotion == "happy": # 欢快:语速快(180)、音量高(1.0)
engine.setProperty('rate', 180)
engine.setProperty('volume', 1.0)
print("【欢快模式】")
elif emotion == "sad": # 悲伤:语速慢(120)、音量低(0.6)
engine.setProperty('rate', 120)
engine.setProperty('volume', 0.6)
print("【悲伤模式】")
elif emotion == "angry": # 愤怒:语速极快(200)、音量最高(1.0)
engine.setProperty('rate', 200)
engine.setProperty('volume', 1.0)
print("【愤怒模式】")
else: # 正常:语速150、音量0.8
engine.setProperty('rate', 150)
engine.setProperty('volume', 0.8)
print("【正常模式】")
# 语音播报
engine.say(text)
engine.runAndWait()
# 测试不同情感效果
emotional_tts("今天收到了心仪的offer,太开心了!", emotion="happy")
time.sleep(3) # 间隔3秒
emotional_tts("这次考试没发挥好,努力了却没得到想要的结果", emotion="sad")
time.sleep(3)
emotional_tts("为什么又迟到了!已经提醒过多次,下次必须注意!", emotion="angry")将TTS功能封装为HTTP接口,支持网页、APP、小程序等多端调用,生成并返回语音文件。
from flask import Flask, request, send_file
import pyttsx3
import os
# 初始化Flask应用
app = Flask(__name__)
# 定义TTS接口(POST请求)
@app.route("/tts", methods=["POST"])
def tts_api():
# 获取请求参数(text:待转换文本,lang:语言,默认中文)
text = request.form.get("text")
lang = request.form.get("lang", "zh-CN")
# 参数校验(文本不能为空)
if not text:
return "错误:请传入text参数(待转换文本)", 400
# 初始化语音引擎
engine = pyttsx3.init()
engine.setProperty('rate', 150) # 设置语速
engine.setProperty('volume', 0.9) # 设置音量
# 生成语音并保存为临时文件
temp_path = "temp_tts.mp3"
engine.save_to_file(text, temp_path)
engine.runAndWait()
# 返回语音文件(作为附件下载)
response = send_file(temp_path, as_attachment=True)
response.headers["Content-Disposition"] = f"attachment; filename=tts_output.mp3"
return response
# 启动服务(支持局域网访问)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)启动运行:
* Serving Flask app "251208 copy 3" (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: on * Restarting with watchdog (windowsapi) * Debugger is active! * Debugger PIN: 638-459-906 * Running on all addresses. WARNING: This is a development server. Do not use it in a production deployment. * Running on http://192.168.2.106:5000/ (Press CTRL+C to quit) 192.168.2.106 - - [08/Dec/2025 21:53:16] "GET / HTTP/1.1" 404 - 192.168.2.106 - - [08/Dec/2025 21:53:16] "GET /favicon.ico HTTP/1.1" 404 - 192.168.2.106 - - [08/Dec/2025 21:53:22] "GET /tts HTTP/1.1" 405 -
服务启动后将开发一个API接口地址http://192.168.2.106:5000/,同时提供了/tts的post请求方法,接口调用方式:
我们通过Postman来调试一下接口调用:

通过结果调用,生成的语音文件保存成功!
import pyttsx3
import tkinter as tk
from tkinter import scrolledtext, ttk
import threading
class SimpleTTSApp:
def __init__(self):
self.window = tk.Tk()
self.window.title("简单TTS工具")
self.window.geometry("600x400")
# 初始化TTS引擎
self.engine = pyttsx3.init()
# 创建界面
self.create_widgets()
def create_widgets(self):
# 文本输入区域
tk.Label(self.window, text="输入文本:").pack(pady=5)
self.text_input = scrolledtext.ScrolledText(self.window, height=10)
self.text_input.pack(padx=10, fill=tk.BOTH, expand=True)
self.text_input.insert(tk.END, "欢迎使用文本转语音工具!")
# 控制面板
control_frame = tk.Frame(self.window)
control_frame.pack(pady=10)
# 语音选择
tk.Label(control_frame, text="语音:").grid(row=0, column=0, padx=5)
self.voice_var = tk.StringVar()
self.voice_combo = ttk.Combobox(control_frame, textvariable=self.voice_var, width=30)
self.voice_combo.grid(row=0, column=1, padx=5)
# 填充可用语音
voices = self.engine.getProperty('voices')
voice_names = [voice.name for voice in voices]
self.voice_combo['values'] = voice_names
if voice_names:
self.voice_combo.current(0)
# 语速控制
tk.Label(control_frame, text="语速:").grid(row=1, column=0, padx=5, pady=5)
self.rate_scale = tk.Scale(control_frame, from_=50, to=300,
orient=tk.HORIZONTAL, length=200)
self.rate_scale.set(150) # 默认值
self.rate_scale.grid(row=1, column=1, padx=5)
# 音量控制
tk.Label(control_frame, text="音量:").grid(row=2, column=0, padx=5, pady=5)
self.volume_scale = tk.Scale(control_frame, from_=0, to=100,
orient=tk.HORIZONTAL, length=200)
self.volume_scale.set(90) # 默认值
self.volume_scale.grid(row=2, column=1, padx=5)
# 按钮区域
button_frame = tk.Frame(self.window)
button_frame.pack(pady=10)
tk.Button(button_frame, text="播放", command=self.speak_text,
bg="green", fg="white", width=10).pack(side=tk.LEFT, padx=5)
tk.Button(button_frame, text="保存为MP3", command=self.save_audio,
bg="blue", fg="white", width=10).pack(side=tk.LEFT, padx=5)
tk.Button(button_frame, text="停止", command=self.stop_speech,
bg="red", fg="white", width=10).pack(side=tk.LEFT, padx=5)
# 状态标签
self.status_label = tk.Label(self.window, text="就绪", fg="gray")
self.status_label.pack()
def update_settings(self):
"""更新TTS设置"""
# 设置语音
voices = self.engine.getProperty('voices')
selected_index = self.voice_combo.current()
if 0 <= selected_index < len(voices):
self.engine.setProperty('voice', voices[selected_index].id)
# 设置语速
self.engine.setProperty('rate', self.rate_scale.get())
# 设置音量(转换为0.0-1.0)
self.engine.setProperty('volume', self.volume_scale.get() / 100.0)
def speak_text(self):
"""播放语音(在线程中运行)"""
text = self.text_input.get("1.0", tk.END).strip()
if not text:
self.status_label.config(text="请输入文本", fg="red")
return
self.update_settings()
self.status_label.config(text="正在播放...", fg="blue")
# 在线程中运行,避免界面卡顿
thread = threading.Thread(target=self._speak_in_thread, args=(text,))
thread.daemon = True
thread.start()
def _speak_in_thread(self, text):
"""在线程中执行语音合成"""
try:
self.engine.say(text)
self.engine.runAndWait()
self.window.after(0, lambda: self.status_label.config(text="播放完成", fg="green"))
except Exception as e:
self.window.after(0, lambda: self.status_label.config(text=f"错误: {str(e)}", fg="red"))
def save_audio(self):
"""保存语音到文件"""
text = self.text_input.get("1.0", tk.END).strip()
if not text:
self.status_label.config(text="请输入文本", fg="red")
return
self.update_settings()
# 保存文件
filename = "tts_output.mp3"
try:
self.engine.save_to_file(text, filename)
self.engine.runAndWait()
self.status_label.config(text=f"已保存到 {filename}", fg="green")
except Exception as e:
self.status_label.config(text=f"保存失败: {str(e)}", fg="red")
def stop_speech(self):
"""停止语音"""
try:
self.engine.stop()
self.status_label.config(text="已停止", fg="orange")
except:
pass
def run(self):
self.window.mainloop()
# 运行应用
if __name__ == "__main__":
app = SimpleTTSApp()
app.run()输出界面:

在实际应用中,需根据场景需求选择合适的方案,同时规避常见问题
TTS 技术已从传统的文字朗读进化为多场景、高适配性的智能交互工具,无论是日常办公中的批量处理、生活中的实时提醒,还是专业领域的高音质内容创作,都能通过简单的代码实现高效落地。
我们如果初次接触先从 pyttsx3 或 gTTS 应用型入手,快速掌握核心用法;若需提升音质或定制化,可尝试 VITS 预训练模型;若需跨平台应用,可基于 Flask 搭建接口服务。随着技术的发展,TTS 与 AI 大模型、语音识别等技术的结合将更加紧密,未来在智能客服、虚拟人、元宇宙等领域的应用将更加广泛,值得持续关注与探索。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。