在使用 Bot Framework 时,如何使用带有 Bing 语音 API 的 Skype 音频附件?

How can I use a Skype audio attachment with the Bing Speech API when using the Bot Framework?

我有一个使用 Microsoft Bot Framework 创建的机器人,它使用 Skype 作为渠道。当用户尝试通过使用其中一个移动应用程序(Android 或 iOS)发送音频来与机器人交谈时,我希望能够从附件中获取音频并将其发送到 Bing 语音 API 以便将其转换为文本。

我在执行此操作时遇到一些问题,我认为主要问题是 I have to send a WAV 到 Bing 演讲 API。我看了Bot Builder仓库里的demo,demo里有如下代码:

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 进行测试)我没有 "audio/wav" 文件类型,文件类型 (ContentType) 为只是 "audio".

当我尝试使用 Postman 在 Bot 状态管理器 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 语音 API:

https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=pt-BR&format=detailed

然而这是我得到的结果:

{"RecognitionStatus":"InitialSilenceTimeout","Offset":11000000,"Duration":0}

在这种情况下,它是一个带有可听语音的音频,但它没有检测到音频。正如我所说,我认为问题出在文件类型上。 Skype 使用的文件类型是什么,如何使用此文件调用 Bing 语音 API?

What is the file type used by Skype, and how can use this file to call the Bing Speech API?

你说得对,问题出在文件类型上。 Bing语音Api目前只支持WAV/PCM格式,如果您的音频文件不是这种格式,您需要尝试将其转换为PCM。

如果你想检测用户附件是否是音频文件,你可以像这样修改你的代码:

var audioAttachment = activity.Attachments?.FirstOrDefault(a => a.ContentType.Contains("audio"));

那么现在真正的问题是将其转换为.wav 音频。对于 C#,您可以尝试使用 NAudio 包。

以下代码片段可能有助于转换为 bing 所需的 wav 格式。这个答案对你来说可能会迟到,但可能对未来有用,它可能会有所帮助。我需要将 mp3 转换为 wav 文件以用于 bing 语音(将语音转换为文本),因此我不得不编写如下一小部分。这里我们使用流将 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();
    }