You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:42:42