在使用 Bot Framework 时,如何将 Skype 音频附件与 Bing Speech API 一起使用?
Posted
技术标签:
【中文标题】在使用 Bot Framework 时,如何将 Skype 音频附件与 Bing Speech API 一起使用?【英文标题】:How can I use a Skype audio attachment with the Bing Speech API when using the Bot Framework? 【发布时间】:2017-12-19 19:55:41 【问题描述】:我有一个使用 Microsoft Bot Framework 创建的机器人,它使用 Skype 作为渠道。当用户尝试通过使用其中一个移动应用程序(android 或 ios)发送音频来与机器人交谈时,我希望能够从附件中获取音频并将其发送到 Bing Speech API 以便将其转换为文本。
我在执行此操作时遇到了一些问题,我认为主要问题是 I have to send a WAV 到 Bing Speech API 的事实。我在 Bot Builder 存储库中阅读了演示,在演示中有以下代码:
var audioAttachment = activity.Attachments?.FirstOrDefault(a => a.ContentType.Equals("audio/wav"));
if (audioAttachment != null)
using (var client = new HttpClient())
var stream = await client.GetStreamAsync(audioAttachment.ContentUrl);
var text = await this.speechService.GetTextFromAudioAsync(stream);
message = ProcessText(activity.Text, text);
但是,当我通过 Skype 移动应用(我正在使用 Android 进行测试)发送音频时,我没有“音频/wav”文件类型,文件类型 (ContentType) 只是“音频”。
当我尝试使用 Postman 在 Bot State Manager API 中获取音频文件时(URL 如下所示:https://smba.trafficmanager.net/apis/v3/attachments/0-eus-d1-0000000000000/views/original),我得到的内容类型为“application/octet-stream
”,但我不知道如果这是 MP3、WAV 或其他格式。
我可以在 Postman 中看到的仅有的几行是这样的:
ftypmp42isommp42pmoovlmvhd�_ ��_ ���@ymeta!hdlrmdta+keysmdtacom.android.version%ilstdata7.1.1�trak\tkhd�_ ��_ ��@mdia mdhd�_ ��_ ��D�� ,hdlrsounSoundHandle�minfsmhd$dinfdrefurl�stbl[stsdKmp4a�D'esds@ww0stts��-�stsz
我使用 ReadAsStreamAsync
方法将此内容下载到 Stream,并将此字符串传递给 Bing Speech API,位于以下端点:
https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=pt-BR&format=detailed
然而这是我得到的:
"RecognitionStatus":"InitialSilenceTimeout","Offset":11000000,"Duration":0
在这种情况下,它是带有可听语音的音频,并且它不检测音频。正如我所说,我认为问题出在文件类型上。 Skype 使用的文件类型是什么,如何使用该文件调用 Bing Speech API?
【问题讨论】:
【参考方案1】:Skype 使用的文件类型是什么,如何使用该文件调用 Bing Speech API?
你是对的,问题是文件类型。 Bing Speech Api 目前只支持 WAV/PCM 格式,如果您的音频文件不是这种格式,您需要尝试将其转换为 PCM。
如果您想检测用户附件是否为音频文件,您可以修改您的代码,例如:
var audioAttachment = activity.Attachments?.FirstOrDefault(a => a.ContentType.Contains("audio"));
那么现在真正的问题是将其转换为 .wav 音频。对于 C#,您可以尝试使用 NAudio 包。
【讨论】:
【参考方案2】:可能是下面的 sn-p 可能有助于转换为 bing 所需的 wav 格式。这个答案对您来说可能会迟到,但可能会在未来出现,它可能会有所帮助。我需要将 mp3 转换为 wav 文件以与 bing 语音(将语音转换为文本)一起使用,因此我不得不写一个如下的小片段。这里我们使用 stream 将输入从 ffmpeg 直接通过管道传输到 bing(因此不需要中间文件系统)。
const http = require('http'),
fs = require('fs'),
path = require('path');
const ffmpeg = require('fluent-ffmpeg');
const ffmpegPath = require('@ffmpeg-installer/ffmpeg').path;
ffmpeg.setFfmpegPath(ffmpegPath);
const stream = require('stream');
var bing = require('bingspeech-api-client/lib/client');
const bingSpeechkey = '';
var bingClient = new bing.BingSpeechClient(bingSpeechkey);
function bingUploadFromStream()
const pass = new stream.PassThrough();
console.log('Bing upload');
bingClient.recognizeStream(pass).then(response => console.log(response.results[0].name));
return pass;
function speechToText(input)
ffmpeg(input)
.format('wav')
.on('progress', (progress) =>
console.log('Processing: ' + progress.targetSize + ' KB converted');
)
.on('error', (err) =>
console.log('An error occurred: ' + err.message);
)
.on('end', () =>
console.log('Processing finished !');
)
.output(bingUploadFromStream())
.run();
【讨论】:
以上是关于在使用 Bot Framework 时,如何将 Skype 音频附件与 Bing Speech API 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Microsoft Bot Framework 将文件附加到消息?
如何在 Bot Framework 的测试函数中访问用户和对话数据
如何在 node.js 版本的 Microsoft Bot Framework 中“退出”?