ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

微信个人号API实战:语音消息怎么下载转文字,做客服质检?

微信个人号API实战:语音消息怎么下载转文字,做客服质检?

客服语音质检的难点不在转文字——技术上能做,在"转完之后怎么判"。这篇讲完整链路:下载、转码、ASR、质检卡。

一、下载转码:别等过期

语音回调只给临时下载地址,24 小时内有效,回调到达立刻下载转码,存本地再解析。格式是 silk,必须用 silk-v3-decoder 转成 mp3 或 wav 才能喂给 ASR。

转码失败的语音标记"无法转文字",进质检异常池人工听。别跳过这步直接丢,质检覆盖率会打折。

二、ASR:选准延迟与精度

客服质检场景准确率比低延迟重要——事后分析可以容忍 5-10 秒处理时间,选通用 ASR 模型(比如百度语音、阿里一句话)够用。ASR 的结果带时间戳,配合质检能定位到具体哪一秒的内容违规。

ASR 结果存两部分:纯文本给质检逻辑跑、带时间戳的结构化记录给人工复盘。

三、质检卡:情绪、合规、礼貌三个维度

转完文字跑三层质检:情绪识别(负面情绪、不耐烦、吵架)、合规词检测(敏感词、竞品词)、礼貌用语(有没有开头问候、结尾客气)。每个维度给分,汇总成质检卡:总分 + 各维度分数 + 命中片段 + 对应时间戳。

质检卡给客服和主管各一份——客服看到自己哪条扣分,主管看整体得分分布。

语音质检对照

环节

做什么

关键点

常见坑

下载转码

silk→mp3

回调即转存

URL 过期永远拿不到

ASR

通用模型+时间戳

准确率优先于延迟

方言识别率差

质检卡

情绪+合规+礼貌

带命中片段和时间戳

只给总分不定位

异常池

转码/识别失败

人工听补质检

丢弃覆盖率打折

质检管道实现

import time, threading, queue class VoiceQCPipeline: def __init__(self, rdb, store, asr, silkv3, sentiment, wordlist): self.rdb = rdb self.store = store self.asr = asr self.silkv3 = silkv3 self.sentiment = sentiment # 情绪分析模型 self.wordlist = wordlist # 合规词 Trie self.q = queue.Queue() threading.Thread(target=self.run, daemon=True).start() def on_voice(self, event): self.q.put({ "msg_id": event["msg_id"], "url": event["media_url"], "from": event["from"], "ts": event["ts"], }) def run(self): while True: task = self.q.get() try: self._process(task) except Exception as e: self.store.queue_anomaly(task["msg_id"], str(e)) def _process(self, task): # 1. 下载转码 raw_path = self.store.download(task["url"], task["msg_id"] + ".silk") mp3_path = self.silkv3.decode(raw_path) # 2. ASR transcript = self.asr.transcribe(mp3_path, with_timestamps=True) self.store.save_transcript(task["msg_id"], transcript) # 3. 质检卡 result = self._qc(task, transcript) self.store.save_qc(task["msg_id"], result) def _qc(self, task, transcript): text = transcript["full"] card = {"msg_id": task["msg_id"], "from": task["from"], "ts": task["ts"], "dimensions": {}, "total": 0} # 情绪 sent = self.sentiment.score(text) card["dimensions"]["sentiment"] = { "score": sent, "ok": sent >= 0.6, } # 合规词 + 命中片段 hits = self.wordlist.scan(text) card["dimensions"]["compliance"] = { "hits": hits, "ok": len(hits) == 0, } # 礼貌用语 polite = ("你好" in text or "您好" in text or "麻烦" in text or "谢谢" in text) card["dimensions"]["polite"] = {"ok": polite} card["total"] = ( card["dimensions"]["sentiment"]["score"] * 40 + (1 if card["dimensions"]["compliance"]["ok"] else 0) * 30 + (1 if polite else 0) * 30 ) return card

落地建议

语音回调到达立刻下载转码,silk 格式必须用 silkv3-decoder 转 mp3 才能给 ASR。ASR 结果存带时间戳的结构化记录,质检卡给情绪、合规词、礼貌三个维度各给分、附命中片段和时间戳——光给总分客服不知道哪错。转码或识别失败的进异常池人工听补质检,别丢。微信侧的语音回调和下载接口由Eyun这类个人微信API平台 提供,转码 ASR 和质检逻辑在自建服务实现,接口字段以平台开发文档为准。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进