Google Cloud Speech-to-Text对OGG OPUS Base64音频偶尔返回空转录求助
问题描述
在Node.js中使用Google Cloud Speech-to-Text API转录48000Hz的OGG OPUS Base64编码音频字符串时,API随机返回空转录结果。将Base64转为Buffer保存为文件后,音频可在VLC正常播放,ffprobe也显示文件参数正确。已检查音频质量、编码、采样率等,问题仍未解决。
代码实现
import { SpeechClient } from "@google-cloud/speech"; // `base64Audio` 格式示例: // "data:audio/ogg; codecs=opus;base64,T2dnUwACAAAAAAAA..." export async function transcribeB64(base64Audio: string): Promise<string> { const client = new SpeechClient(); return new Promise(async (resolve) => { const content = base64Audio.split(",")[1]; const x = await client.recognize({ config: { encoding: "OGG_OPUS", sampleRateHertz: 48000, languageCode: "en-US", }, audio: { content, }, }); resolve(JSON.stringify(x, null, 2)); }); }
API空响应示例
[ { "results": [], "totalBilledTime": { "seconds": "0", "nanos": 0 }, "speechAdaptationInfo": null, "requestId": "000000" }, null, null ]
ffprobe输出(音频文件验证)
Input #0, ogg, from 'input.ogg': Duration: 00:00:05.74, start: 0.000000, bitrate: 129 kb/s Stream #0:0: Audio: opus, 48000 Hz, mono, fltp Metadata: ENCODER : Mozilla111.0.1
排查与解决建议
- 复用SpeechClient实例:当前代码每次调用都创建新的
SpeechClient,频繁初始化可能导致连接不稳定。建议将client实例全局化,避免重复创建:// 全局初始化client const client = new SpeechClient(); export async function transcribeB64(base64Audio: string): Promise<string> { return new Promise(async (resolve, reject) => { try { const content = base64Audio.split(",")[1]; const [response] = await client.recognize({ config: { encoding: "OGG_OPUS", sampleRateHertz: 48000, languageCode: "en-US", audioChannelCount: 1, // 显式指定单声道,匹配ffprobe结果 }, audio: { content, }, }); resolve(JSON.stringify(response, null, 2)); } catch (err) { reject(err); } }); } - 显式指定声道数:ffprobe显示音频为单声道,在config中添加
audioChannelCount: 1,避免API自动检测声道时出现偏差。 - 添加错误捕获逻辑:原代码未处理API调用可能抛出的错误,错误被吞后可能导致空结果。添加try/catch块,排查是否存在隐藏的请求错误。
- 尝试异步识别接口:替换同步的
recognize为longRunningRecognize,该接口更适合处理可能存在波动的音频,且返回结果更稳定:// 示例:使用longRunningRecognize const [operation] = await client.longRunningRecognize(request); const [response] = await operation.promise(); - 检查音频有效内容:即使音频能播放,也可能存在部分时段无有效语音的情况。可尝试用音频编辑工具查看波形,确认每次失败的音频是否确实包含清晰语音。
- 启用自动标点与增强模型:在config中添加
enableAutomaticPunctuation: true和model: "command_and_search"(或"phone_call",根据场景选择),提升识别准确率和稳定性。
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

