
Wit AI 的 /speech 接口对音频编码格式要求严格,常见问题源于非标准 Ogg 容器中的编解码器不兼容(如 Opus),需统一转为 Ogg+Vorbis 格式方可正确识别。
wit ai 的 `/speech` 接口对音频编码格式要求严格,常见问题源于非标准 ogg 容器中的编解码器不兼容(如 opus),需统一转为 ogg+vorbis 格式方可正确识别。
Wit AI 的语音识别 API(https://api.wit.ai/speech)虽支持 audio/ogg 类型,但仅兼容 Vorbis 编码的 Ogg 文件。许多现代录音源(如 Web 浏览器 MediaRecorder、WhatsApp(通过 WPP Connect 获取的语音消息))默认生成的是 Ogg+Opus 格式——该格式在容器层面合法,但 Wit AI 后端不支持 Opus 解码,导致请求返回空结果:
{
"entities": {},
"intents": [],
"text": "",
"traits": {}
}即使音频内容完整、时长正常、Base64 解码无误,只要底层编码非 Vorbis,Wit AI 就会静默跳过语音转文本流程。
✅ 正确做法:在调用 Wit AI 前,将原始音频标准化为 Ogg 容器 + Vorbis 编码。推荐使用 ffmpeg 进行无损重编码(无需重新采样,仅更换 codec):
# 安装依赖(确保系统已安装 ffmpeg) npm install fluent-ffmpeg # 或全局安装:brew install ffmpeg(macOS) / apt install ffmpeg(Ubuntu)
const ffmpeg = require('fluent-ffmpeg');
function convertToVorbis(inputPath, outputPath, callback) {
ffmpeg(inputPath)
.audioCodec('libvorbis') // 强制使用 Vorbis 编码
.audioBitrate(128) // 可选:推荐 96–192 kbps,平衡质量与体积
.outputOptions([
'-vn', // 忽略视频流(确保纯音频)
'-ar 16000', // Wit AI 推荐采样率:16 kHz(若原音频非此值则启用)
'-ac 1' // 转为单声道(Wit AI 对立体声支持不稳定)
])
.on('end', () => {
console.log(`✅ 已转换为 Vorbis:${outputPath}`);
callback(null, outputPath);
})
.on('error', (err) => {
console.error('❌ 音频转换失败:', err.message);
callback(err);
})
.save(outputPath);
}
// 使用示例(配合 WPP Connect)
await message.downloadMedia().then(async (media) => {
const originalBuffer = Buffer.from(media.data, 'base64');
const tempInput = './temp_audio.ogg';
const tempOutput = './temp_audio_vorbis.ogg';
// 写入临时文件(fluent-ffmpeg 需要文件路径)
await fs.promises.writeFile(tempInput, originalBuffer);
// 转换为 Ogg+Vorbis
await new Promise((resolve, reject) => {
convertToVorbis(tempInput, tempOutput, (err, convertedPath) => {
if (err) return reject(err);
resolve(convertedPath);
});
});
// 读取转换后文件并发送至 Wit AI
const audioBuffer = await fs.promises.readFile(tempOutput);
try {
const response = await axios.post(
'https://api.wit.ai/speech?v=20230215',
audioBuffer,
{
headers: {
Authorization: `Bearer ${WIT_TOKEN}`,
'Content-Type': 'audio/ogg',
},
responseType: 'json',
}
);
console.log('? Wit AI 识别结果:', response.data.text || '(空文本)');
// 后续业务逻辑...
} catch (error) {
console.error('⚠️ Wit AI 请求异常:', error.response?.status, error.message);
} finally {
// 清理临时文件
await Promise.all([
fs.promises.unlink(tempInput).catch(() => {}),
fs.promises.unlink(tempOutput).catch(() => {}),
]);
}
});⚠️ 关键注意事项:
-
不要跳过转换:即使
Content-Type: audio/ogg正确,Opus 编码仍会导致失败; -
采样率建议:Wit AI 最佳适配
16 kHz单声道,转换时显式指定-ar 16000 -ac 1可显著提升识别率; -
避免内存流直传:
fluent-ffmpeg不支持直接处理 Buffer 输入,必须落地为临时文件; -
Token 与版本:确保
v=20230215(或更新日期)与 Wit AI 控制台应用权限一致; -
替代方案:若无法部署
ffmpeg,可考虑改用 Wit AI 支持的audio/mpeg(MP3)或audio/wav(PCM 16-bit, 16kHz, mono),但需对应调整Content-Type与编码参数。
通过标准化音频编码,即可稳定接入 Wit AI 语音识别能力,尤其适用于 WhatsApp、WebRTC 等多源语音场景。


















