【问题标题】:Bing Speech API integrated with Microsofts BotFramework必应语音 API 与 Microsoft Bot Framework 的集成
【发布时间】:2018-07-27 16:02:26
【问题描述】:

我想我会尽可能详细地设置这个,希望有人对这种设置有一些经验。

前端: ASP.Net MVC Razer 网站。

  • .Net Framework 4.6.1

后端: Bot-framework Web API (RESTful)。

  • .Net Framework 4.6

Back-Back-end:我使用各种位于 Azure 的认知服务,但在这种情况下,它只是 Bing Speech API。

相关 SDK:

  • Microsoft.Bing.Speech(版本:2.0.2)
    • Bond.Core.CSharp(版本:8.0.0)~依赖
    • Bond.CSharp(版本:8.0.0)~依赖
    • Bond.Runtime.CSharp(版本:8.0.0)~依赖

我在网站中使用getUserMedia 来根据一些 javascript 代码的请求记录用户麦克风,这会创建一个 blob URL。

然后我将 blob url 作为 Attachment 中的 ContentUrl 传递给 Activity

当这遇到 Bot 框架时,我会进行一些基本验证(与此问题无关),然后传递给自定义 Dialog<T>

这是我正在努力让 Bing Speech API 做我想做的事情的地方。

我在Dialog<T> 中使用此方法:

public async Task Run(string audioFile, string locale, Uri serviceUrl)
{
    // create the preferences object
    var preferences = new Preferences(locale, serviceUrl, new CognitiveServicesAuthorizationProvider(subscriptionKey));

    using (var speechClient = new SpeechClient(preferences))
    {
        speechClient.SubscribeToPartialResult(this.OnPartialResult);
        speechClient.SubscribeToRecognitionResult(this.OnRecognitionResult);

        using (WebClient webClient = new WebClient())
        {
            using (Stream stream = webClient.OpenRead(audioFile))
            {
                var deviceMetadata = new DeviceMetadata(DeviceType.Near, DeviceFamily.Desktop, NetworkType.Ethernet, OsName.Windows, "1607", "Dell", "T3600");
                var applicationMetadata = new ApplicationMetadata("SampleApp", "1.0.0");
                var requestMetadata = new RequestMetadata(Guid.NewGuid(), deviceMetadata, applicationMetadata, "SampleAppService");

                try
                {
                    await speechClient.RecognizeAsync(new SpeechInput(stream, requestMetadata), this.cts.Token).ConfigureAwait(false);
                }
                catch (Exception genEx)
                {
                    // Was just using this try/catch for debugging reasons
                }
            }
        }
    }
}

我正在使用 WebClient 获取 Stream,而不是 FileStream 此方法在 Microsoft 示例代码中使用,因为 Filestream 不会从 URL 流式传输。

当前的问题:

当这条线被击中时:

await speechClient.RecognizeAsync(new SpeechInput(stream, requestMetadata), this.cts.Token).ConfigureAwait(false);

它引发有关 Bond.IO.dll 的错误

融合日志:

我正在使用Microsoft Bot Framework Emulator 在本地进行调试,这就是为什么您会看到本地文件路径的原因。

=== Pre-bind state information ===
LOG: DisplayName = Bond.IO, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
 (Fully-specified)
LOG: Appbase = file:///[project folder]
LOG: Initial PrivatePath = \bin
Calling assembly : Microsoft.Bing.Speech, Version=2.0.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file:\web.config
LOG: Using host configuration file: \aspnet.config
LOG: Using machine configuration file from \machine.config.
LOG: Post-policy reference: Bond.IO, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
LOG: Attempting download of new URL file:///C:/Users/[USER]/AppData/Local/Temp/Temporary ASP.NET Files/vs/0f4bb63f/ca796715/Bond.IO.DLL.
LOG: Attempting download of new URL file:///C:/Users/[USER]/AppData/Local/Temp/Temporary ASP.NET Files/vs/0f4bb63f/ca796715/Bond.IO/Bond.IO.DLL.
LOG: Attempting download of new URL file:///C:/[USER]/[PROJECT PATH]/bin/Bond.IO.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

奇怪的是,如果我将 bing api 回滚到 2.0.1 并手动插入示例项目中安装的旧版本 Bond.IO 包(版本 4.0.1),它不会抛出这个错误,它会抛出其他错误。

真正在问什么:

如果我只想将 .wav 音频文件发送到我的 API,然后使用 Bing.Speech API 的转录功能将语音转换为文本,那么最好的方法是什么?这?我是否至少朝着正确的方向前进。

奖励 如果你的答案与我已经在做的事情相关,则加分。

【问题讨论】:

    标签: c# botframework speech-to-text microsoft-cognitive bing-speech


    【解决方案1】:

    我使用 WebClient 来获取 Stream,而不是 Microsoft 示例代码中此方法使用的 FileStream,因为 Filestream 不会从 URL 流式传输。

    并非所有流都具有相同的功能。 FileStream 是一个读/写随机访问流。 NetworkStream 是一个只进的只读流。

    因此,在将 .wav 传递给 API 之前,将其缓冲到 MemoryStream。

        using (Stream stream = webClient.OpenRead(audioFile))
        {
    
            var ms = new MemoryStream();
            stream.CopyTo(ms);
            ms.Position = 0;
            var deviceMetadata = new DeviceMetadata(DeviceType.Near, DeviceFamily.Desktop, NetworkType.Ethernet, OsName.Windows, "1607", "Dell", "T3600");
            var applicationMetadata = new ApplicationMetadata("SampleApp", "1.0.0");
            var requestMetadata = new RequestMetadata(Guid.NewGuid(), deviceMetadata, applicationMetadata, "SampleAppService");
    
            try
            {
                await speechClient.RecognizeAsync(new SpeechInput(ms, requestMetadata), this.cts.Token).ConfigureAwait(false);
            }
            catch (Exception genEx)
            {
                // Was just using this try/catch for debugging reasons
            }
        }
    

    【讨论】:

    • 当我将 wav 标头添加到内存流时,是否有任何明显的原因导致上述可能导致 Unable to read beyond the end of the stream 错误?
    • 是的,对不起。 Stream.CopyTo 不会重置目标流的 Position,所以必须调用 ms.Position =0;在 Stream.CopyTo 之后。更新了答案。
    • 我很可能会奖励你积分,这样它们就不会消失在虚无中,你的回答很有帮助,肯定把我推向了正确的方向,这也是流式传输的最佳方式将 url 中的文件添加到旧版本的 API 中,因此对其他人来说可能是一个不错的发现。
    【解决方案2】:

    虽然 David 的回答绝对是一个不错的选择(因为我肯定会混淆流),但令人讨厌的是,上面列出的问题的实际答案是对 Microsoft.Bing.Speech api 的有限支持之一。

    在 github 上从事 Bond.IO 项目的人员介绍了较低版本和当前在 nuget 上列出的两个最新版本(7.0.1 和 8.0.0)之间的重大更改。

    这是在 5.x 和 6.x 之间有意进行的重大更改,以启用 Microsoft 以外的人员构建和使用强名称签名的 Bond 程序集。


    重大更改 Bond 程序集现在使用存储库中的 bond.snk 密钥进行强名称签名,而不是使用 Microsoft 密钥。这允许任何人生产兼容的 > 程序集,而不仅仅是 Microsoft。邦德官方发行将继续>> 使用 Microsoft 证书签名的 Authenticode。第 414 期


    程序集的新公钥现在是[截断公钥示例]

    重大变化 Bond 程序集现在具有与其 NuGet 包版本相对应的程序集和文件版本。强大的名字 身份现在将根据 NuGet 更改发布版本 包版本。问题 #325 1

    这似乎意味着将Microsoft.Bing.Speech api 升级到其最新版本 2.0.1 和 2.0.2(请记住,这是 nuget 上仅有的两个可用版本)只能安装 Bond.IO 7.0.1 或更高版本。但是,它们仍然包含对 Bond.IO 版本 1.0.0.0 的内部要求(或者更明确地说是 7.0.1 之前的任何构建)。

    还值得强调的是,如果您从 microsoft 示例项目中手动安装针对 Microsoft.Bing.Speech 程序集和 Bond.IO 版本 4.2.1 程序集的旧版本的包,则上述代码可以正常工作。 2

    其中一位贡献者在 Microsoft Docs 页面上也有 cmets,Microsoft.Bind.Speech 程序集即将贬值(如果他们将其标记为这样就好了,对吗? .)3

    总而言之,最接近我上述问题的答案是,除非您想使用没有持续支持的过时程序集,否则不要费心使用Microsoft.Bing.Speech nuget 包。他们建议改用Speech SDK(尽管如果在 BotFramework WebAPI 中使用它,请做好准备迎接一场艰苦的战斗,因为它也有一些内部错误)4

    过去几天我一直在研究这个,所以我非常有信心这是该库的当前状态。


    1Please see this issue against the Bond.IO Github

    2Comment on a similar question supporting this.

    3Look under closed comments at the bottom of this page, the response by 'Zhouwangzw' suggests using the latest Speech SDK.

    3Found the GitHub issue that linked to the docs here

    4Current breaking error in a webAPI using the Speech SDK.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      相关资源
      最近更新 更多