【问题标题】:How can I use a Skype audio attachment with the Bing Speech API when using the Bot Framework?在使用 Bot Framework 时,如何将 Skype 音频附件与 Bing Speech API 一起使用?
【发布时间】: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?

【问题讨论】:

    标签: c# botframework skype chatbot microsoft-cognitive


    【解决方案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();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多