如何用@aws-sdk/client-transcribe-streaming实现Node.js并行实时转写流
问题描述
使用Node.js结合@aws-sdk/client-transcribe-streaming开发时,单条音频流转写功能正常,但创建多个TranscribeStreamingClient实例同时处理不同流时,仅第一个客户端正常工作,其余需等待其连接关闭才能运行。需要实现并行流响应并正确结束流。
原代码:
const {TranscribeStreamingClient,StartStreamTranscriptionCommand} = require("@aws-sdk/client-transcribe-streaming"); let client = new TranscribeStreamingClient({ credentials: config.get("amazon.credentials"), region: config.get("amazon.region"), }); let streamResponse = await client.send( new StartStreamTranscriptionCommand({ LanguageCode: this.audioConfig.languageCode, MediaSampleRateHertz: this.audioConfig.sampleRateHertz, MediaEncoding: this.audioConfig.encoding, AudioStream: audioStream(), }), ); client.destroy();
解决方案
要实现并行处理多个音频流,核心是确保每个流拥有独立的客户端实例、并行发起请求,并正确处理每个流的生命周期:
1. 封装独立的转写处理函数
为每个音频流单独创建客户端,避免实例复用导致的并发限制:
const { TranscribeStreamingClient, StartStreamTranscriptionCommand } = require("@aws-sdk/client-transcribe-streaming"); const config = require("./your-config-file"); // 替换为你的配置引入 async function processAudioStream(audioConfig, audioStreamGenerator) { // 为每个流创建独立的客户端实例 const client = new TranscribeStreamingClient({ credentials: config.get("amazon.credentials"), region: config.get("amazon.region"), }); try { const command = new StartStreamTranscriptionCommand({ LanguageCode: audioConfig.languageCode, MediaSampleRateHertz: audioConfig.sampleRateHertz, MediaEncoding: audioConfig.encoding, AudioStream: audioStreamGenerator(), // 传入当前流的生成器 }); const streamResponse = await client.send(command); // 处理转录结果流 for await (const event of streamResponse.TranscriptResultStream) { if (event.TranscriptEvent) { const transcript = event.TranscriptEvent.Transcript; console.log("转录结果:", transcript.Results?.[0]?.Alternatives?.[0]?.Transcript); // 这里添加你的业务处理逻辑 } } } catch (err) { console.error("转写出错:", err); throw err; // 可根据需求处理错误 } finally { // 无论成功失败,都销毁当前客户端 await client.destroy(); } }
2. 并行发起多个转写请求
使用Promise.all同时处理多个音频流,实现并行响应:
// 假设你有多个音频配置和流生成器 const audioTasks = [ processAudioStream(audioConfig1, audioStreamGenerator1), processAudioStream(audioConfig2, audioStreamGenerator2), processAudioStream(audioConfig3, audioStreamGenerator3), ]; // 并行执行所有转写任务 await Promise.all(audioTasks); console.log("所有音频流转写完成");
关键注意事项
- 独立客户端实例:每个音频流必须对应独立的
TranscribeStreamingClient,SDK的单个客户端连接池存在并发限制,复用会导致请求阻塞。 - 正确结束AudioStream:你的
audioStream()生成器必须在音频数据发送完毕后正确关闭流(比如返回return或者触发end事件),否则Transcribe会一直等待数据,导致连接无法正常结束。 - 异常处理:在
finally块中销毁客户端,确保即使转写出错也能释放资源。 - 流式结果处理:通过
for await...of遍历TranscriptResultStream,实时处理转录结果,同时等待流自然结束。
内容的提问来源于stack exchange,提问作者Imran Rafiq
相关产品推荐
相关产品推荐

