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

Node.js接入Google Media Translation实现通话翻译报错如何解决?

Google Media Translation 实时翻译报错解决方案

错误根因

代码触发INVALID_ARGUMENT报错的核心问题是:发送给Google翻译服务的第一个请求没有携带流配置信息,你把初始配置请求的发送逻辑错误写在了Google流的data回调内部,而代码执行顺序中第一个写入流的内容是Twilio推送的音频payload,没有先发送配置请求。
同时代码存在逻辑冗余错误:connected事件的msg对象不存在stream()方法,写在data回调内的音频流监听逻辑完全无效,还会导致逻辑冲突。

修复方案

  1. 创建Google翻译流之后,立刻写入携带配置的初始请求,确保第一个请求是配置请求
  2. 删除写在stream.on('data')回调内的无效音频监听逻辑
  3. 增加空判断,避免media事件触发时stream还未初始化导致报错

修复后完整代码

const WebSocket = require("ws");
const express = require("express");
const app = express();
const server = require("http").createServer(app);
const wss = new WebSocket.Server({ server });
const path = require("path");

let stream = null;
wss.on("connection", function connection(ws) {
  console.log("New Connection Initiated");
  ws.on("message", function incoming(message) {
    const msg = JSON.parse(message);
    switch (msg.event) {
      case "connected":
        console.log(`A new call has connected.`);
        const audio = require('@google-cloud/media-translation');
        const encoding = 'linear16';
        const sourceLanguage = 'sw';
        const targetLanguage = 'en-US';
        const sampleRateHertz = 8000;
        const model = 'google-provided-model/phone-call'
        const client = new audio.SpeechTranslationServiceClient();  

        const config = {
          audioConfig: {
            audioEncoding: encoding,
            sourceLanguageCode: sourceLanguage,
            sampleRateHertz : sampleRateHertz,
            targetLanguageCode: targetLanguage,
            targetModel : model
          },
          singleUtterance: false,
        };
        const initialRequest = {
          streamingConfig: config,
          audioContent: null,
        };
        let currentTranslation = '';
        let currentRecognition = '';

        stream = client
        .streamingTranslateSpeech()
        .on("error", console.error)
        .on('data', response => {
          const {result, speechEventType} = response;
          if (speechEventType === 'END_OF_SINGLE_UTTERANCE') {
            console.log(`\nFinal translation: ${currentTranslation}`);
            console.log(`Final recognition result: ${currentRecognition}`);
            stream.destroy();
          } else {
            currentTranslation = result.textTranslationResult.translation;
            currentRecognition = result.recognitionResult;
            console.log(`\nPartial translation: ${currentTranslation}`);
            console.log(`Partial recognition result: ${currentRecognition}`);
          }
        });
        // 修复点:创建流之后立刻发送初始配置请求,确保是第一个请求
        stream.write(initialRequest);
        break;
      case "start":
        console.log(`Starting Media Stream ${msg.streamSid}`);
        break;
      case "media":
        // 修复点:增加非空判断,避免stream未初始化时报错
        if (stream && !stream.destroyed) {
          stream.write({
            streamingConfig: config,
            audioContent: msg.media.payload
          });
        }
        break;
      case "stop":
        console.log(`Call Has Ended`);
        if (stream && !stream.destroyed) {
          stream.end();
          stream = null;
        }
        break;
    }
  });  
});
server.listen(8080);
console.log('Listening at Port 8080');

额外注意事项

  • 运行代码前需要配置Google服务账号凭证:将环境变量GOOGLE_APPLICATION_CREDENTIALS设置为你的服务账号JSON文件的本地路径
  • 确认Twilio侧的音频编码配置和你代码中设置的linear16、8000Hz参数一致
  • 确认你的Google云账号已经开通Media Translation API服务,并且对应区域支持斯瓦西里语到英语的翻译

内容的提问来源于stack exchange,提问作者STANLEY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:48:00