进阶 📋 5 个步骤 第 399 / 470 篇

用 AI 搭建实时语音对话智能体:听懂、思考、开口的完整闭环

拆解一个能听会说的语音 Agent 如何由「语音转文字→大模型→文字转语音」三段拼成,手搓本地对话循环,并讲清延迟、流式合成与打断处理等工程要点。

2026.09.09· 20 分钟阅读· 约 1024 字· 🎙️ Whisper / 🧠 DeepSeek

语音助手、智能外呼、带语音的机器人……它们的「灵魂」其实是一个很固定的闭环:你说话 → 转成文字 → 大模型思考 → 转回语音 → 播给你听。本教程把这个闭环拆开讲透,并带你用 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/打断逻辑,需清空播放队列
成本失控加并发限流、用量监控与告警
← 返回教程中心