语音助手、智能外呼、带语音的机器人……它们的「灵魂」其实是一个很固定的闭环:你说话 → 转成文字 → 大模型思考 → 转回语音 → 播给你听。本教程把这个闭环拆开讲透,并带你用 Python 拼出一个能本地运行的语音对话 Demo。
🎙️ 本教程适合:想做语音助手、客服语音化、或可语音交互产品的开发者。不要求 DSP/音频底层基础,但建议会一点 Python。
先搞懂:一个「会说话」的 Agent 由哪三段拼成?
核心就是三个模块首尾相接:
| 模块 | 作用 | 常见选择 |
|---|---|---|
| STT(语音转文字) | 把麦克风声音变成文本 | Whisper、Deepgram、腾讯/阿里语音识别 |
| LLM(大脑) | 理解意图、生成回答 | DeepSeek、通义、GPT 等(开流式) |
| TTS(文字转语音) | 把回答念出来 | Edge-TTS(免费)、ElevenLabs(拟真) |
延迟会层层叠加:STT 200ms + LLM 首字 400ms + TTS 首音 300ms,还没算网络就接近 1 秒。生产级系统要「能流式就流式」,边生成边合成,才能聊得自然。
Step 1:选 STT(语音转文字)
1 先把声音变成文字
本地优先可选开源 Whisper;要低延迟、免运维可选 Deepgram 等云服务。下面是用 OpenAI 音频接口做一次性转写的示例(也可用本地 whisper 包):
from openai import OpenAI
client = OpenAI() # 用你自己的 key / base_url
audio_file = open("record.wav", "rb")
text = client.audio.transcriptions.create(
model="whisper-1", file=audio_file
).text
print("识别结果:", text)
💡 真实语音 Agent 一般走「流式 STT」:边说边识别,说完一句就立刻送进大模型,而不是等整段录完。
Step 2:中间大脑用流式 LLM
2 让大模型边想边往外吐字
语音场景一定要开流式,拿到第一个字就开始准备念,别等整段生成完:
stream = client.chat.completions.create(
model="deepseek-chat",
messages=[{"role": "user", "content": text}],
stream=True,
)
reply = ""
for chunk in stream:
reply += chunk.choices[0].delta.content or ""
念稿要「口语化」:TTS 会逐字念出 Markdown、星号、$ 符号。系统提示里要写清「只用 plain sentences,不要列表、不要表情符号、数字读成汉字」。
Step 3:选 TTS(文字转语音)
3 把回答念出来
想零成本先跑通,用微软的 edge-tts(免费、音质不错);要拟真音色再上 ElevenLabs 等:
import asyncio, edge_tts
async def speak(text):
voice = "zh-CN-XiaoxiaoNeural"
communicate = edge_tts.Communicate(text, voice)
await communicate.save("reply.mp3")
asyncio.run(speak(reply))
🔊 进阶玩法:把 LLM 输出按「句子」切分,生成一句播一句,整体延迟更低,也更接近真人对话节奏。
Step 4:把三段串成一个本地对话循环
4 让「听→想→说」自动转起来
下面是个骨架(示意逻辑,具体录音/播放你可用 sounddevice、pyaudio 或系统命令补齐):
while True:
record("record.wav") # 1. 录音(或等唤醒词)
text = stt("record.wav") # 2. STT
reply = llm_stream(text) # 3. LLM(流式攒成整段)
speak(reply) # 4. TTS 播放
# 说完一轮,回到录音,循环对话
🧩 跑通这个循环,你就拥有了一个最小可用的「本地语音助手」。再往上是工程化:电话接入、打断、多轮记忆。
Step 5:上线前必看的工程要点
从 Demo 到产品,这几件事绕不开:
1. 延迟(TTFA):全链路流式,目标亚秒级才自然
2. 打断处理:用户插话要能中断当前播报(VAD + 清空待播队列)
3. 电话场景:用 Twilio Conversation Relay / Cloudflare voice 托管语音管线
4. 成本:STT+LLM+TTS 按量计费,高并发要预算与限流
隐私与合规红线:录音属于敏感个人信息。务必告知用户「正在录音」、明确用途、加密存储,涉及账号/身份证等绝不明文处理;对外服务要符合相关法规。
常见问题速查
| 现象 | 大概率原因 & 解决 |
|---|---|
| 对话「慢半拍」 | 没开流式;改为 STT/LLM/TTS 逐级流式 |
| AI 把「$30」念成「美元符号三零」 | 系统提示要求纯口语、数字汉化 |
| 用户插话无效 | 缺 VAD/打断逻辑,需清空播放队列 |
| 成本失控 | 加并发限流、用量监控与告警 |