语音是消息类型里门槛最高的一种:不是"有音频文件就能发",平台要求语音内容是 silk 格式,而互联网上的音频绝大多数是 mp3、m4a。格式转换因此成为语音消息链路的必经环节。这篇讲从音频源到语音消息送达的完整链路,以及格式这关怎么过。

背景痛点

第一次发语音的典型经历:拿一段 mp3 直接上传发送,接口报错或发出后客户端无法播放;查资料才知道要 silk,又发现主流语言生态里现成的转换方案不多,社区工具质量参差。格式认知的缺口让很多团队干脆放弃语音,其实链路打通后这并不难。

原理

所谓语音消息链路,是指音频源经过格式转换、上传获取凭证、调用发送接口的流程。格式是第一关:平台侧要求语音为 silk 编码,这是微信生态的语音格式,采样率与时长也有相应要求。转换环节用社区维护的 silk 编码工具,多数实现思路是把源音频先解码为原始 PCM,再编码为 silk。

上传与发送沿用媒体消息的两步走模型:先调上传接口拿到媒体凭证,再用凭证发送——语音之外的视频、文件都是同一模型,只是格式约束各不相同。

核心实现

转换与发送链路(示例代码,需按官方文档校验,参数以接口页为准):

def send_voice(appid: str, conversation_id, mp3_path: str):
    # 示例代码,需按官方文档校验
    pcm = decode_to_pcm(mp3_path)                  # 第一步:解码为原始音频
    silk_path = encode_silk(pcm, rate=24000)       # 第二步:编码为 silk
    cred = api("/wx-api/api/cdn/upload", {         # 第三步:上传换凭证
        "appid": appid, "file": open(silk_path, "rb"),
    })["data"]["mediaCred"]
    return api("/wx-api/api/message/sendEmoji", {  # 第四步:凭凭证发送
        "appid": appid, "conversationId": conversation_id,
        "contentType": 34, "mediaCred": cred,      # 34 = 语音
    })

媒体上传的通用流程见CDN 模块文档,消息类型与发送接口见消息模块文档。

踩坑

一、转换工具的选择要实测:社区工具对采样率、单双声道的支持各不相同,选型时用真实语音样本全量验证,确认客户端能正常播放才算过关——这一步没有捷径。

二、时长限制要守住,超长语音先切片再逐条发;TTS 合成的语音同样要过转换链路,合成输出的格式不等于能直接发。

三、语音的验收必须在手机客户端完成,接口返回成功只代表受理,格式不对时客户端侧的表现才是最终判据。

四、媒体凭证有有效期,转换后尽快上传发送,别把凭证缓存过夜;上传失败的原始文件保留下来,便于排查是转换问题还是上传问题。

总结

语音链路四步:解码、转 silk、上传取凭证、发送。格式这关过了之后,语音和图片文件的链路复杂度其实差不多。适用场景想清楚再上:语音在客服安抚、播报类场景有不可替代的温度感,但在信息密度上不如文本。这篇基于 Eyun 平台的企微接口整理,语音格式细节与参数以官方文档为准,转换工具务必先小样本实测再接入生产。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐