客服为当前企微账号初始化一次本人录音,之后在客服工作台输入文本、自动选择受控语气,并在人工确认后生成和发送原生企微语音。第一版只允许人工触发,不接入全自动回复。试听功能禁用,避免为同一条消息额外调用一次付费合成。
本人参考录音
-> 16kHz 单声道 WAV 档案
-> Fmode /api/voice/indextts2
-> 24kHz 单声道 SILK
-> Fmode /api/qiwei/doFileApi 直传
-> /msg/sendVoice
参考录音限制为 5~30 秒、最大 20MB。档案存放在 outputs/voice/profiles/<account-key>/,不同企微账号相互隔离。
默认参数:
{
"input": "客服回复文本",
"emo_control_method": 0,
"use_random": false
}
识别到特殊客服场景时使用文本情绪控制:
{
"input": "非常抱歉给您带来了不好的体验。",
"emo_control_method": 3,
"emo_alpha": 0.5,
"emo_text": "真诚、耐心、克制,带有适度歉意,语速稍慢,不夸张",
"use_random": false
}
| 语气 | 场景 | emo_alpha |
|---|---|---|
| 自然 | 普通说明或无法判断 | 不传 |
| 友好 | 欢迎、感谢、成功、好消息 | 0.40 |
| 真诚致歉 | 投诉、道歉、服务失误 | 0.50 |
| 温和关怀 | 遗憾、安慰、身体不适 | 0.45 |
| 明确提醒 | 截止、到期、时间安排 | 0.40 |
不启用情绪音频和八维情绪向量,不开放愤怒、厌恶、恐惧或强烈悲伤。use_random 固定为 false。
| 路由 | 用途 |
|---|---|
GET /api/agent/voice/status |
查询服务和声音档案状态 |
POST /api/agent/voice/profile |
上传 Base64 音频并初始化声音 |
DELETE /api/agent/voice/profile |
删除当前账号声音档案 |
POST /api/agent/conversations/:id/voice-send |
合成并真实发送企微语音;可传当前 draftId |
GET /api/agent/messages/:id/voice-audio |
回放指定已发送语音,支持 HTTP Range |
真实发送继续执行私聊、白名单和人工确认校验,并写入工作台消息与审计表。
Dashboard 从待审核草稿发送语音时,在 voice-send 请求中携带该草稿的 draftId。服务端在合成和企微发送成功后执行以下状态更新:
msgType=16 的 outbound 语音消息并保存 WAV 路径、时长和发送结果;sent;reviewed_at、reviewer=human:voice 和 sent_message_id;显式传入的 draftId 不存在、已处理或属于其他会话时,在合成和外发前拒绝请求。没有待审核草稿时仍允许作为人工语音发送。
outputs/voice/<date>/<time>-clone-*/speech.wav 的文件,支持 HTTP Range、audio/wav 和私有无缓存响应。QIWEI_VOICE_ENDPOINT=https://server.fmode.cn/api/voice/indextts2
QIWEI_TTS_TIMEOUT_MS=180000
语音合成使用 Fmode /api/voice/indextts2,自动复用技能包的 Fmode Token。语音媒体只使用 Fmode 网关的 /api/qiwei/doFileApi multipart 代理;该路由已完成真实 SILK 上传验证,可以直接返回企微发送所需的 fileId、fileAesKey 和 fileSize。路由不可用或上传失败时直接报错,不使用公网 URL 回源。系统会在合成前检查 Fmode 鉴权和企微账号配置,避免已知无法上传时产生合成费用。
.env.local 或安全环境变量;confirmed=true,并标记为破坏性外部操作;