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

如何用@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:03:16