news 2026/8/28 16:10:08

如何在 Dify.AI 搭建“听懂又会说“的语音助手:STT 与 TTS 接入完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何在 Dify.AI 搭建“听懂又会说“的语音助手:STT 与 TTS 接入完整指南

如何在 Dify.AI 搭建"听懂又会说"的语音助手:STT 与 TTS 接入完整指南

【免费下载链接】difyBuild Agentic workflows, RAG pipelines, with rich AI model and tool support on one collaborative workspace. Deploy on cloud, VPC, or self-hosted, so teams move from prototype to production without rebuilding the stack.项目地址: https://gitcode.com/GitHub_Trending/di/dify

Dify.AI 是一个 LLM 应用开发平台,除了文本对话,它内置了语音转文字(Speech-to-Text,STT)和文字转语音(Text-to-Speech,TTS)两条链路,让你的应用既能"听懂"用户,也能"开口"回答。本文面向刚接手 Dify.AI 语音助手搭建的新手开发者,从真实客服场景出发,讲清最短上手路径、两个接口的参数细节,以及上线前最容易踩的四个坑,全程只需 30 分钟。

🎙️ 从一个客服电话开始:为什么应用需要"耳朵"和"嗓子"

想象一个电商客服机器人。用户在电话里说:"我上周买的耳机,什么时候发货?" 这时系统要完成三件事:先把这段话变成文本(STT),交给大模型理解并生成回答,再把回答念出来(TTS)。少了第一步,机器人"聋";少了第三步,机器人像复读机,体验大打折扣。

Dify.AI 把这两步做成了应用级的能力开关:STT 挂在语音输入上,TTS 挂在每条回复上。你不需要自己写音频处理代码,只需要配置模型提供商、打开两个开关,然后调用两个 HTTP 接口。

⚡ 最短路径:从 0 到出声的 5 步

  1. 准备模型。在工作区的"模型供应商"里配置一家提供语音能力的提供商并填入 API Key。STT 和 TTS 可以来自同一家(如 OpenAI),也可以分开配。
  2. 打开 STT 开关。进入目标应用(聊天、聊天流或工作流模式均可)的"功能设置",启用语音转文字。
  3. 打开 TTS 开关并选音色。启用文字转语音,再从该提供商提供的音色列表里挑一个,例如nova
  4. 发布应用,拿到该应用的访问地址。
  5. 前端接线:录音上传走/audio-to-text,回复播放走/text-to-audio,代码见第四节。

最小可用配置长这样(应用功能设置中要生效的两个字段):

{ "speech_to_text": { "enabled": true }, "text_to_speech": { "enabled": true, "voice": "nova" } }

后端会按这套配置校验请求:开关未打开时直接返回"STT/TTS 未启用"错误,不会白跑模型调用。

🎧 STT 与 TTS 详解:格式、上限与音色

语音转文字(STT):接口与限制

STT 的入口是POST /audio-to-text,以 multipart 表单提交,字段名为file,成功返回一个包含text字段的 JSON。它只接受音频文件的 MIME 类型,且大小卡在 30MB,这两条规则在 api/services/audio_service.py 中硬编码校验。

项目说明
请求方式POST /audio-to-text,multipart/form-data,字段file
支持格式mp3m4awavamrmpga
文件大小上限30MB(超出返回 413)
常用提供商OpenAI(Whisper)、Azure、Google、阿里云
典型报错415 格式不支持、"STT 未启用"、"提供商未配置该能力"

文字转语音(TTS):给回复配上声音

TTS 的入口是POST /text-to-audio,JSON 请求体包含三个字段:

字段必填作用
text二选一要合成的文本
message_id二选一传某条历史消息的 ID,服务端直接取该消息的回复来合成,免去重复传文本
voice音色;不传时自动取该提供商音色列表的第一个

以 OpenAI TTS 为例,可选音色大致是这一档(不同提供商列表不同,以模型供应商页面实际显示为准):

音色风格适合场景
alloy中性通用播报
nova明快客服、导购等友好交互
echo / onyx男性资讯、严肃内容
fable / shimmer女性 / 中性故事、创意内容

注意 TTS 的返回体不是 JSON,而是音频流本身(MIME 由实际返回的音频容器决定),前端拿 blob 直接播放即可。

🔧 完整示例:一个会听的客服助手

整条链路按时序展开是这样的:

后端侧不需要你新写接口,AudioService已经把两步都封装好了(见api/controllers/web/audio.py),如果要在自定义后端中复用,核心就是这两行:

text = AudioService.transcript_asr(app_model=app, file=upload)["text"] audio = AudioService.transcript_tts(app_model=app, session=session, message_id=msg_id, voice="nova")

前端侧,录音结束后的处理逻辑:

const stt = await fetch(`${base}/audio-to-text`, { method: "POST", body: fd }); const text = (await stt.json()).text; // 先走正常聊天拿到 message_id,再合成语音 const tts = await fetch(`${base}/text-to-audio`, { method: "POST", body: JSON.stringify({ message_id, voice: "nova" }) }); new Audio(URL.createObjectURL(await tts.blob())).play();

🚧 避坑清单:上线前对一遍

症状对策
识别结果不准、整句丢失先确认录音没被压缩到失真;嘈杂环境加前端降噪;录音语言与 STT 模型不匹配时换支持该语言的模型
合成语音听着"播音腔"不自然换音色,客服场景nova通常比默认第一个音色自然;长文本拆短句分段合成,语气更连贯
中文应用接英文用户,识别成乱码在 STT 提供商处选择多语言模型,或在应用提示词中声明用户语言,让模型按正确语言转写
用户觉得"反应慢半拍"限制单次录音时长(10 秒内);TTS 返回后先建 Audio 对象再等 blob 加载完;对延迟敏感的场景考虑流式播放而非整段下载

另外两个高频错误码值得记住:415是文件格式不在白名单,413是超过 30MB,都发生在调用模型之前,属于客户端可自助解决的问题。

✅ 边界与方向

需要说明的是,Dify.AI 目前的语音链路是"先上传、再合成"的请求-响应模式,还没有实时的双向音频流,想做"边说边听"的通话体验,需要自己在外部叠一层音频通道。演进方向上,情感化合成、跨语言实时对话和专属音色克隆是社区最关心的能力,建议关注版本更新。如果你正准备做一个能听能说的助手应用,按本文的五步路径配置一遍,今天就能听到第一声回复。

【免费下载链接】difyBuild Agentic workflows, RAG pipelines, with rich AI model and tool support on one collaborative workspace. Deploy on cloud, VPC, or self-hosted, so teams move from prototype to production without rebuilding the stack.项目地址: https://gitcode.com/GitHub_Trending/di/dify

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/28 16:09:32

Superpowers快速入门指南:让AI编码代理变成有纪律的开发者

Superpowers快速入门指南:让AI编码代理变成有纪律的开发者 【免费下载链接】superpowers An agentic skills framework & software development methodology that works. 项目地址: https://gitcode.com/GitHub_Trending/su/superpowers Superpowers是面…

作者头像 李华
网站建设 2026/8/28 16:09:25

大模型应用开发实战:从对话到RAG与Agent

如果你最近关注过大模型相关的科技新闻,可能看到过这样一条略带幽默的消息:旧金山某处广告牌上出现了 “ChatTJB” 的推广,宣传标语很有意思,大意是 “Human-powered LLM”——背后不是 GPU 集群,而是一群真人&#xf…

作者头像 李华
网站建设 2026/8/28 16:08:50

LaTeX数学建模论文速成指南:从环境搭建到实战排版

1. 从Word到LaTeX:为什么数学建模必须换“笔”如果你参加过数学建模比赛,或者正在准备,大概率经历过这样的场景:凌晨三点,你和队友还在为论文里那个歪掉的公式、对不齐的表格、以及突然消失的页眉页脚而抓狂。Word&…

作者头像 李华
网站建设 2026/8/28 16:01:10

蓝桥杯单片机门禁系统实战:从状态机设计到EEPROM存储

1. 项目背景与核心需求解析 最近在整理蓝桥杯单片机的历年真题,第三届国赛的“门禁系统”这道题给我留下了挺深的印象。它不像一些纯算法题那样抽象,而是把一个非常贴近实际应用场景的“门禁”功能,用单片机开发板给具象化地实现了出来。题目…

作者头像 李华
网站建设 2026/8/28 16:00:25

Python K-means聚类算法实战:从原理到数学建模应用

1. 项目概述:从数学建模到Python实战最近在带学生准备数学建模竞赛,也和一些做数据分析的朋友交流,发现一个挺普遍的现象:大家拿到一堆数据,第一步总想看看“能不能分个类”。无论是客户细分、城市发展水平评估&#x…

作者头像 李华