首页 → 博客 → 语音消息转文字:Telegram、WhatsApp 及其他即时通讯工具
语音消息转文字:Telegram、WhatsApp 及其他即时通讯工具
语音消息对发送者方便,对其他所有人都不方便:没法快速略读,没法检索,开会时也没法看。自动转录解决了这个问题——下面讲如何把它接进机器人或业务流程。
语音消息和普通录音有什么不同
有三个特点需要注意:
- ogg/opus 容器。Telegram 和 WhatsApp 把语音压成 opus,不需要事先转换,服务直接接收原始文件。
- 时长很短。一条消息通常在三秒到一分钟之间。片段越短,模型能用的上下文越少。
- 口语化表达。断句、街道噪音、口头禅都会进入转录结果,因为识别的是实际说出来的内容。
把语音消息送去转录
文件按即时通讯工具给出的原样传过去:
from openai import OpenAI
client = OpenAI(base_url="https://voicesscribe.com/v1", api_key="your key")
with open("voice_message.ogg", "rb") as f:
text = client.audio.transcriptions.create(model="whisper-1", file=f).text
print(text)
格式由文件内容判断,而不是扩展名,因此文件名写错也不影响识别。
用文字回复语音消息的机器人
流程很简单:收到语音消息 → 下载文件 → 送去转录 → 把文字发回聊天。
async def on_voice(message, bot):
file = await bot.download(message.voice.file_id) # ogg/opus
text = client.audio.transcriptions.create(
model="whisper-1", file=("voice.ogg", file), language="zh",
).text
await message.reply(text or "没有听清任何语音内容")
结果在同一个请求里返回,用户发完消息一两秒后就能拿到文字。
短片段:如何提高准确率
两三秒的录音最难处理:上下文少,语种判断也容易出错。三个几乎总是有效的做法:
- 显式指定语种——
language="zh"。关掉自动识别,短句上的错误就消失了。 - 描述预期内容,通过
prompt。例如验证码场景:prompt="A four-digit confirmation code"。 - 检查置信度。
verbose_json的响应里带有语种概率,数值偏低就是需要人工复核的信号。
多语种混合的场景
如果消息来自不同语种,无需任何配置:语种由音频自动判断,支持 99 种语言。verbose_json 会返回识别出的语种,用它把会话分配给对应的客服很方便。
一个注意点:语种是根据录音开头判定的。如果对方先说中文再切到英文,转录会继续以「中文模式」进行——这类消息最好单独处理。
静音和空录音
有一部分语音消息其实是空的:误触、断线、只有背景噪音没有人声。这种情况下服务返回空字符串,而不是编造出来的句子——内置过滤器会切掉神经网络典型的幻觉内容,比如片尾字幕和「感谢观看」。
代码里只需判断字符串是否为空,不要把无意义的结果展示给用户。
用你自己的录音试一试。 注册只需一分钟,免费额度足够判断识别质量。
免费获取 API 密钥常见问题
发送前需要把 ogg 转成 wav 吗?
不需要。即时通讯工具产出什么格式就直接发什么:ogg、opus、mp3、m4a、wav 等常见格式都可以。
中文语音消息识别效果怎么样?
中文属于识别质量最好的一批语种,共支持 99 种语言。不过对于单一语种的消息流,仍然建议显式指定语种。
一条语音消息要转多久?
一分钟以内的普通消息一到两秒完成,结果在同一个请求里返回。
如果录音里没有人声会返回什么?
返回空文本。服务不会在没有内容的地方编造内容。
文件大小有限制吗?
有,单次请求 25 MB。对语音消息来说余量极大:opus 编码下这个体积是好几个小时的语音。
相关阅读
- 如何把通话录音转成文字 — 分步教程:几分钟内通过 API 把电话录音转成文字,包含 Python 和 C# 代码示例、响应格式说明,以及常见错误的处理办法。
- 从视频和网络研讨会自动生成 SRT 与 VTT 字幕 — 如何从录播视频或网络研讨会得到带时间轴的现成字幕:提取音轨、SRT 与 VTT 的区别、代码示例,以及常见问题的解决办法。
- 如何提高语音识别准确率:八个实用方法 — 真正能改善转录质量的八件事:音频预处理、指定语种、prompt 词表、切分策略、响应格式,以及如何测量字错率。