Langchain-Chatchat 如何实现问答结果的语音播报

在智能助手日益普及的今天,用户对交互方式的要求早已不再局限于“看”——越来越多的场景需要我们能“听”到答案。尤其是在工厂巡检、车载系统、老年服务等不方便盯着屏幕的环境中,语音播报已经成为提升可用性的关键能力。

而当我们将目光投向企业级知识管理时,另一个问题浮现:如何在保障数据隐私的前提下,构建一个既能“读懂文档”又能“开口说话”的本地化 AI 助手?这正是 Langchain-Chatchat + 本地 TTS 组合所要解决的核心命题。


传统的云端大模型虽然强大,但一旦涉及敏感信息(如医疗记录、财务制度),上传即意味着风险。Langchain-Chatchat 的出现,为这一困境提供了优雅解法——它允许你将 PDF、Word 等私有文件导入本地,通过 RAG 技术让大模型基于真实资料生成回答,全过程无需联网,彻底规避数据外泄隐患。

但它的输出默认仍是文本。对于视障员工、移动作业人员或不擅长打字的老年人来说,这种单模态交互依然存在门槛。于是,下一步自然就是:让这个沉默的 AI 助手“开口说话”

其实现路径并不复杂:只要在问答链的末端接上一个轻量级语音合成模块,就能完成从“文字输出”到“语音反馈”的跨越。整个流程就像这样:

  1. 用户提问 →
  2. 系统检索知识库并生成文本回答 →
  3. 将该文本送入 TTS 模型转为音频 →
  4. 自动播放语音

听起来简单,但在工程落地中仍有不少细节值得深挖。


以 Langchain-Chatchat 的典型架构为例,其核心是基于 LangChain 构建的检索增强生成(RAG)流程。文档被解析后切分成块,用 BGE 或 Sentence-BERT 类似的嵌入模型转化为向量,存入 FAISS 或 Chroma 数据库。当用户提问时,问题同样被向量化,在向量空间中查找最相关的几个片段,拼接成上下文送入本地部署的大模型(如 ChatGLM、Qwen)进行推理。

最终返回的答案是一个字符串,而这恰恰是我们接入语音功能的最佳切入点。

from langchain.chains import RetrievalQA
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.llms import ChatGLM

embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh-v1.5")
vectorstore = FAISS.load_local("vector_db", embeddings, allow_dangerous_deserialization=True)

llm = ChatGLM(
    endpoint_url="http://127.0.0.1:8000",
    max_token=8192,
    temperature=0.7
)

qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
    return_source_documents=True
)

def ask_question(query: str):
    response = qa_chain.invoke({"query": query})
    return response["result"], response.get("source_documents", [])

这段代码展示了标准的问答流程。注意 response["result"] 就是我们后续要转换成语音的原始文本。只要把这个字符串传给合适的 TTS 工具,就能迈出“发声”的第一步。


目前主流的本地 TTS 方案主要有两类:一类是基于深度学习的高质量合成模型,另一类则是依赖操作系统引擎的轻量级方案。

如果你追求自然流畅的发音效果,并且设备算力尚可(比如有 GPU 支持),推荐使用 Coqui TTS。它支持中文普通话模型,且完全开源、可离线运行。例如:

from TTS.api import TTS

tts = TTS(model_name="tts_models/zh-CN/baker/tacotron2-DDC-GST", progress_bar=False, gpu=False)

def text_to_speech(text: str, output_wav="response.wav"):
    tts.tts_to_file(text=text, file_path=output_wav)
    print(f"语音已保存至 {output_wav}")

# 调用示例
answer, _ = ask_question("什么是量子计算?")
text_to_speech(answer)

这个模型基于 Tacotron2 架构,配合 GST(Global Style Token)机制,能在一定程度上理解语义节奏,减少机械感。生成的 .wav 文件清晰度高,适合用于正式场合或产品原型演示。

不过,它的资源消耗相对较大,首次加载可能需要几秒时间。若你的目标平台是树莓派这类边缘设备,或者希望做到“零延迟启动”,那可以考虑更轻量的选择——pyttsx3

import pyttsx3

engine = pyttsx3.init('sapi5')  # Windows 使用 SAPI 引擎
engine.setProperty('rate', 150)   # 语速
engine.setProperty('volume', 0.9) # 音量

def speak_text(text):
    engine.say(text)
    engine.runAndWait()

speak_text("您好,这是来自本地AI助手的回答。")

pyttsx3 不依赖任何神经网络模型,直接调用系统内置语音引擎(如 Microsoft Speech API),因此启动快、内存占用小。缺点也很明显:语音生硬、缺乏情感变化,多音字处理差(比如“重”容易读错)。但它胜在稳定可靠,特别适合做内部工具或辅助性提示音。


真正把这两部分串起来,形成完整的“问完即播”体验,还需要一点工程技巧。

首先,语音合成和播放不能阻塞主线程,否则 UI 会卡住,用户体验极差。合理的做法是启用异步任务来处理 TTS 和播放:

import threading
from playsound import playsound

def async_speak(text, audio_file="temp_response.wav"):
    def _task():
        text_to_speech(text, audio_file)  # 假设使用 Coqui TTS
        playsound(audio_file)
    thread = threading.Thread(target=_task, daemon=True)
    thread.start()

def voice_qa(query: str):
    answer, _ = ask_question(query)
    print("AI回答:", answer)
    async_speak(answer)

这样即使语音正在播放,用户也可以继续输入新问题,系统也不会无响应。

其次,实际应用中常遇到一些“坑”。比如中文里的多音字:“重庆”中的“重”应读作 chóng,“重要”中的“重”才是 zhòng。TTS 模型如果没有足够上下文理解能力,很容易出错。对此,可以在前端加入简单的预处理规则,或选择支持上下文感知更强的模型(如 FastSpeech2 + GST 结构)。

另外,长文本合成耗时较长,重复提问还会造成资源浪费。一个实用优化是建立语音缓存机制:将常见问题的回答音频预先生成并存储,下次命中时直接播放,大幅提升响应速度。


这套组合拳的价值,远不止于“让机器会说话”这么简单。

设想一位工厂巡检员戴着耳机行走在车间,他只需说出:“上个月设备故障率是多少?”系统便立刻播报统计结果,无需掏出手机查看;又或者一位老人坐在沙发上,对着智能音箱般的终端问:“医保报销比例变了没有?”系统随即用清晰的声音读出政策摘要——这些场景背后,都是同一个技术逻辑在支撑。

更重要的是,这一切都在本地完成。没有数据上传,没有云服务调用,也没有按次计费的压力。整套系统基于开源组件搭建,一次部署,长期可用,成本可控。

对比维度 传统搜索引擎 通用聊天机器人(如ChatGPT) Langchain-Chatchat + TTS
数据安全性 低(需上传至云端) 高(全程本地处理)
回答准确性 依赖关键词匹配 广泛但可能虚构 基于真实文档,准确可信
定制化能力 强(可接入企业内部资料)
多模态支持潜力 有限 支持图像/语音输入 可扩展为“语音输入+语音输出”闭环

未来甚至可以进一步升级:加入 ASR(自动语音识别)模块,让用户直接“说问题”,实现真正的全语音交互闭环。届时,整个系统将更接近人们理想中的“私人助理”形态。


当然,这条路仍有挑战。本地 TTS 的自然度与真人朗读仍有差距,尤其在长句断句、语气停顿方面还需持续优化。同时,不同硬件平台的兼容性也需测试验证,比如 macOS 和 Linux 下的音频播放支持是否一致。

但从技术趋势看,小型化、高性能的端侧模型正在快速演进。像 VITS、FastSpeech2 这类结构不断被压缩优化,已有能在 CPU 上实时运行的轻量版本出现。随着边缘计算能力提升,这类本地智能系统的应用场景只会越来越广。

某种意义上,Langchain-Chatchat 加上语音播报,不只是功能叠加,更是一种设计理念的体现:把控制权交还给用户,让 AI 在尊重隐私的前提下真正服务于人

这种高度集成的设计思路,正引领着智能知识系统向更可靠、更高效、更具包容性的方向演进。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐