0

私はこれを可能な限り詳細に設定したいと考えました。うまくいけば、誰かがこの種のセットアップの経験を持っていることを願っています.

フロントエンド: ASP.Net MVC Razer Web サイト。

  • .Net フレームワーク 4.6.1

バックエンド:ボット フレームワーク Web API (RESTful)。

  • .Net フレームワーク 4.6

バックエンド: 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) ~依存関係

Web サイトで使用getUserMediaして、JavaScript コードからの要求に応じてユーザーのマイクを録音しています。これにより、ブロブ URL が作成されます。

次に、blob の URL をContentUrlanAttachmentから anに渡しActivityます。

これがボット フレームワークに到達すると、基本的な検証 (この問題には関係ありません) を実行してから、カスタム に渡します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
                }
            }
        }
    }
}

URL からストリーミングしないため、このメソッドが Microsoft サンプル コードで使用するWebClient ではなく、 を 使用してストリームを取得しています。FileStream Filestream

現在の問題:

この行がヒットすると:

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 の書き起こし機能を使用して音声をテキストに変換したい場合、これを行う最善の方法は何ですか? 私は少なくとも正しい方向に進んでいますか?

あなたの答えが私がすでにやっている方法と結びついている場合、ボーナスポイント.

4

2 に答える 2

3

Filestream は URL からストリーミングしないため、Microsoft サンプル コードでこのメソッドが使用する FileStream ではなく、WebClient を使用して Stream を取得しています。

すべてのストリームが同じ機能を持っているわけではありません。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
        }
    }
于 2018-07-29T17:06:05.310 に答える