在使用 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 作为渠道。当用户尝试通过使用其中一个移动应用程序(androidios)发送音频来与机器人交谈时,我希望能够从附件中获取音频并将其发送到 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 中“退出”?

使用 Bot Framework 代表用户发送消息

如何在 Bot Framework C# 中使用 Bing Speech API

如何自动将用户信息传递给 Bot Framework 对话实例,而不将其作为显式消息发布在聊天窗口中?