如何访问Microsoft Speech SDK录制的音频流

2024-01-23

我正在使用 Microsoft 的 JavaScript 语音 SDK 转录麦克风流。录音和转录都是使用语音 SDK 完成的,我无法找到在录音完成后如何访问和保存录制的音频文件的方法。

创建录音机并录音的代码

recognizer = new SpeechSDK.SpeechRecognizer(speechConfig, audioConfig);
// to start the recording
recognizer.startContinuousRecognitionAsync(
    () => {
      portFromCS.postMessage({ type: "started", data: "" });
    },
    err => {
      recognizer.close();
    },
  );
// used after user input to stop the recording
recognizer.stopContinuousRecognitionAsync(
    () => {
      window.console.log("successfully stopped");
      // TODO: somehow need to save the file
    },
    err => {
      window.console.log("error on stop", err);
    },
  );

The 文档 https://learn.microsoft.com/en-us/javascript/api/microsoft-cognitiveservices-speech-sdk/?view=azure-node-latest相当糟糕,我无法找到如何使用他们的 SDK 访问原始音频的内置方法。我唯一的选择是使用两个音频流进行录制并使用单独的录制流保存文件吗?这意味着什么?


SDK 不保存音频,也没有内置的功能。

在版本 1.11.0 中,连接对象中添加了一个新的 API,以允许您查看发送到服务的消息,您可以从中提取音频并自行组装波形文件。

这是一些执行此操作的打字稿:

import * as SpeechSdk from "microsoft-cognitiveservices-speech-sdk";
import * as fs from "fs";

const filename: string = "input.wav";
const outputFileName: string = "out.wav";
const subscriptionKey: string = "<SUBSCRIPTION_KEY>";
const region: string = "<SUBSCRIPTION_REGION>";

const speechConfig: SpeechSdk.SpeechConfig = SpeechSdk.SpeechConfig.fromSubscription(subscriptionKey, region);

// Load the audio from a file, alternately you could use 
// const audioConfig:SpeechSdk.AudioConfig = SpeechSdk.AudioConfig.fromDefaultMicrophone() in a browser();
const fileContents: Buffer = fs.readFileSync(filename);
const inputStream: SpeechSdk.PushAudioInputStream = SpeechSdk.AudioInputStream.createPushStream();
const audioConfig: SpeechSdk.AudioConfig = SpeechSdk.AudioConfig.fromStreamInput(inputStream);
inputStream.write(fileContents);
inputStream.close();

const r: SpeechSdk.SpeechRecognizer = new SpeechSdk.SpeechRecognizer(speechConfig, audioConfig);
const con: SpeechSdk.Connection = SpeechSdk.Connection.fromRecognizer(r);

let wavFragmentCount: number = 0;

const wavFragments: { [id: number]: ArrayBuffer; } = {};

con.messageSent = (args: SpeechSdk.ConnectionMessageEventArgs): void => {
    // Only record outbound audio mesages that have data in them.
    if (args.message.path === "audio" && args.message.isBinaryMessage && args.message.binaryMessage !== null) {
        wavFragments[wavFragmentCount++] = args.message.binaryMessage;
    }
};

r.recognizeOnceAsync((result: SpeechSdk.SpeechRecognitionResult) => {
    // Find the length of the audio sent.
    let byteCount: number = 0;
    for (let i: number = 0; i < wavFragmentCount; i++) {
        byteCount += wavFragments[i].byteLength;
    }

    // Output array.
    const sentAudio: Uint8Array = new Uint8Array(byteCount);

    byteCount = 0;
    for (let i: number = 0; i < wavFragmentCount; i++) {
        sentAudio.set(new Uint8Array(wavFragments[i]), byteCount);
        byteCount += wavFragments[i].byteLength;
    }

    // Set the file size in the wave header:
    const view = new DataView(sentAudio.buffer);
    view.setUint32(4, byteCount, true);
    view.setUint32(40, byteCount, true);

    // Write the audio back to disk.
    fs.writeFileSync(outputFileName, sentAudio);
    r.close();
});

它从文件加载,因此我可以在 NodeJS 而不是浏览器中进行测试,但核心部分是相同的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何访问Microsoft Speech SDK录制的音频流 的相关文章

随机推荐

  • 检测菜单项单击上的鼠标左键/右键吗?

    在Delphi XE2中 如何检测用户是否用鼠标左键或右键单击了弹出菜单项 使用该单元 将其作为组件安装并替换标准TPopupMenu这增加了一个OnMenuRightClick event unit RCPopupMenu interfa
  • 如何在使用 iframe 时停止 IE 11 上的自动下载

    我已经在 Iframe 标记中给出了源 我的问题是 当页面在 IE 上加载时 下载会自动开始 并且通常发生在 Windows 8 上安装的 IE 上 div div 下载可能是因为没有Adobe Reader插件 安装 在这种情况下 IE
  • 在 SoundCloud iOS 应用程序中打开曲目的 URL

    我想在 SoundCloud iOS 应用程序中打开 SoundCloud 曲目 我的印象是使用正确的 url 方案是soundcloud track track id 这将打开 SoundCloud 应用程序 但不会选择正确的曲目 任何人
  • 无法在 Python 3.10 上安装 Matplotlib

    python3 10 m pip install user matplotlib 当我运行上面的命令来安装 Matplotlib 时 我不断收到以下错误 我最初遇到 C 错误 然后我安装了 Visual Studio Time Elapse
  • 任何像 recyclerview 或 javafx 的可重用视图之类的东西

    我正在创建一个滚动窗格 它显示从 sqlite 数据库获取的数据集 这些数据以这样的方式显示 即它们排列在重复的 ui 集中 就像在 android 中的 recyclerview 中一样 有什么方法可以实现它 因为使用 javafx 定位
  • 如何阻止 Exchange 自动将纯文本电子邮件转换为 HTML?

    我已经为将由我的代码解析的电子邮件设置了一个 Exchange 2003 邮箱 电子邮件以纯文本形式发送 我的代码希望以纯文本形式接收它们 但是 Exchange 似乎会自动将它们转换为 HTML 我如何阻止它这样做并只按照发送的方式接收电
  • 在 pandas 中使用元组作为索引键时,如何“通过传入类别参数显式指定类别顺序”?

    我一直在试图弄清楚如何使这些元组索引键pandas但我收到错误 我如何使用错误中的建议pd Categorical下面修复这个错误 我知道我可以转换为字符串 但我很好奇错误消息中的建议是什么意思 当我运行它时 效果非常好0 22 0 我已经
  • emberjs:如何在视图中触发自定义事件

    我想将原始事件 单击 转换为语义事件 例如 deleteTodo 这是描述的here http emberjs com guides views 但不知道如何实施 我有以下代码 App TodoView Em View extend cli
  • 在编译时进行字符串驻留以进行分析

    Context 我正在开发一个仪器分析器 它使您能够通过字符串命名不同的测量结果 例如 MEASURE SCOPE text rendering code MEASURE SCOPE password hashing MEASURE STA
  • 使用 jQuery 获取 单元格的“坐标”

    我正在构建一个不同的网站 下面是我的 HTML 标记和我的问题 请不要被这堵文字吓倒 我确信对于那些知道自己的东西的人来说这确实不是一个难题 但需要一些解释 div class cell table border 0 cellpadding
  • 当 HEALTHCHECK 失败时 Docker 容器会发生什么

    码头工人docs https docs docker com engine reference builder healthcheck说什么HEALTHCHECK说明是如何检查容器的健康状况 但我无法弄清楚健康检查失败时会发生什么 就像按照
  • MySQL复制用户

    我想在我的 MySQL 测试数据库上创建两个用户 一个对与生成报告等相关的表具有只读访问权限 另一个对同一表具有读写访问权限 这是为了测试通常与只读用户连接但切换到读写用户以执行某些任务的子系统 我已经创建了具有正确权限的读写用户 现在我需
  • 使用 RxJava 处理长时间运行的任务

    我正在尝试迁移AsyncTask向服务器发送消息 使用 RxJava 粗略地说 该任务执行以下操作 1 创建一条将要发送的消息 保存到数据库 2 向用户显示消息 状态 正在发送 3 向服务器发送消息 代码片段如下 4 将消息标记为已发送或失
  • 如何向表视图添加“加载更多”选项

    我的应用程序有一个由 Sqlite DB 填充的表 其中包含大量数据 所以它会导致表视图中的延迟加载 这是代码 void searchData i 0 newSearchBar setShowsCancelButton YES animat
  • IMDB 是否提供 API? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我最近发现了一个电影组织者应用程序 它从互联网电影数据库 http www imdb com Does
  • 无法调试 Go 代码:无法启动进程:在偏移量 0x0 处解码 dwarf 部分信息:太短

    我们正在尝试调试 Go 代码并收到此错误 could not launch process decoding dwarf section info at offset 0x0 too short 我们的设置 WITSC02X6385JGH
  • BluetoothGatt:协商新的 MTU 成功,但无法使用新的大小(相差 3 个字节)

    我正在开发一个使用 BLE 在设备之间交换数据的应用程序 为了获得更好的性能 在连接两个设备后 我正在协商增加 MTU 以便通过 BLE 交换更大的数据包 连接蓝牙设备并读取所有服务和特征后 我请求使用以下方法增加 MTU private
  • 我想为图像创建一个单独的域

    我想设置一个名为 img mydomain com 的域 这将是一个虚拟域 就像我的实际域一样 除了一个区别 它只提供以 jpg jpeg gif png 等结尾的文件 这样我就可以参考 img mydomain com some imag
  • 如何在wxFrame上设置图标?

    如何向 wxFrame 添加图标 ico 文件 我正在寻找docs http www wxpython org docs api wx Frame class html但找不到任何提及icon Thanks 凤凰wxpython frame
  • 如何访问Microsoft Speech SDK录制的音频流

    我正在使用 Microsoft 的 JavaScript 语音 SDK 转录麦克风流 录音和转录都是使用语音 SDK 完成的 我无法找到在录音完成后如何访问和保存录制的音频文件的方法 创建录音机并录音的代码 recognizer new S