Node.js接入Google Media Translation实现通话翻译报错如何解决?
Google Media Translation 实时翻译报错解决方案
错误根因
代码触发INVALID_ARGUMENT报错的核心问题是:发送给Google翻译服务的第一个请求没有携带流配置信息,你把初始配置请求的发送逻辑错误写在了Google流的data回调内部,而代码执行顺序中第一个写入流的内容是Twilio推送的音频payload,没有先发送配置请求。
同时代码存在逻辑冗余错误:connected事件的msg对象不存在stream()方法,写在data回调内的音频流监听逻辑完全无效,还会导致逻辑冲突。
修复方案
- 创建Google翻译流之后,立刻写入携带配置的初始请求,确保第一个请求是配置请求
- 删除写在
stream.on('data')回调内的无效音频监听逻辑 - 增加空判断,避免
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
相关产品推荐
相关产品推荐

