Bing Speech API, интегрированный с Microsoft BotFramework
Я подумал, что изложу это как можно более подробно, надеюсь, у кого-то есть опыт работы с такого рода установками.
Внешний интерфейс : веб-сайт ASP.Net MVC Razer.
- .Net Framework 4.6.1
Серверная часть: веб-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, это создает URL-адрес BLOB-объекта.
Затем я передаю URL-адрес BLOB-объекта как ContentUrl
в пределах Attachment
для Activity
,
Когда это попадает в Bot-framework, я делаю некоторую базовую проверку (ничего не связано с этой проблемой), а затем перехожу к пользовательской 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
чтобы получить поток, а не FileStream
что этот метод использует в примере кода Microsoft, потому что Filestream
не будет транслироваться с URL.
Текущие проблемы:
Когда эта строка нажата:
await speechClient.RecognizeAsync(new SpeechInput(stream, requestMetadata), this.cts.Token).ConfigureAwait(false);
Выдает ошибку про Bond.IO.dll
Fusion Log:
Я отлаживаю локально с 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, а затем использовать функцию транскрипции API Bing.Speech для преобразования речи в текст, каков наилучший способ сделать это? Я, по крайней мере, иду в правильном направлении.
Бонусные баллы, если ваш ответ связан с тем, как я это уже делаю.
2 ответа
Хотя ответ от Дэвида был определенно хорошим уловом (поскольку я наверняка смешивал потоки), реальный ответ на проблему, перечисленную выше, является, к сожалению, одной из ограниченной поддержки Microsoft.Bing.Speech
апи.
Люди, работающие на Bond.IO
В проекте на github внесены существенные изменения между более низкими версиями и двумя последними версиями, которые в настоящее время перечислены в nuget (7.0.1 и 8.0.0).
Это было преднамеренное разрывное изменение между 5.x и 6.x, чтобы позволить людям вне Microsoft создавать и использовать подписанные сборки со строгими именами Bond.
Прерывистое изменение Сборки Bond теперь имеют строгое имя, подписанное ключом bond.snk в репозитории, а не ключом Microsoft. Это позволяет любому производить совместимые> сборки, а не только Microsoft. Официальный дистрибутив Bond будет по-прежнему подписан Authenticode с сертификатом Microsoft. Выпуск № 414
Новый открытый ключ для сборок теперь [Пример усеченного открытого ключа]
Разрывное изменение Сборки Bond теперь имеют версии сборок и файлов, которые соответствуют их версии пакета NuGet. Строгое имя пользователя теперь будет меняться в зависимости от версии пакета NuGet. Выпуск № 325 1
Казалось, это означает, что обновление Microsoft.Bing.Speech
API для его последних версий 2.0.1 и 2.0.2 (имейте в виду, что это только две из доступных на Nuget) можно было только установить Bond.IO
7.0.1 или выше. Однако они все еще содержали внутреннее требование к версии 1.0.0.0 Bond.IO
(или, точнее, любая сборка до 7.0.1).
Также стоит подчеркнуть, что если вы вручную устанавливаете пакеты из примера проекта Microsoft, которые предназначены для более старых версий обоих Microsoft.Bing.Speech
сборка и Bond.IO
В сборке версии 4.2.1 приведенный выше код работает без проблем.2
На одной из страниц Microsoft Docs есть также комментарии одного из авторов о том, что сборка Microsoft.Bind.Speech находится на пути к устареванию (было бы неплохо, если бы они пометили ее как таковую, я прав).3
В заключение, самый близкий ответ на мою проблему выше состоит в том, что, если вы не хотите использовать устаревшие сборки без постоянной поддержки, не беспокойтесь об использовании Microsoft.Bing.Speech
пакет Nuget. Они рекомендуют использовать Speech SDK
вместо этого (хотя будьте готовы к бою в гору, если используете это в WebFI BotFramework, поскольку он также имеет несколько внутренних ошибок)4.
Я провел последние несколько дней, работая над этим, поэтому я вполне уверен, что это текущее состояние этой библиотеки.
1 Пожалуйста, смотрите этот вопрос против Bond.IO Github
2 Прокомментируйте похожий вопрос, подтверждающий это.
3 Нашли проблему с GitHub, которая связана с документами здесь
4 Текущая ошибка прерывания в webAPI с использованием Speech SDK.
Я использую WebClient для получения Stream, а не FileStream, который этот метод использует в примере кода Microsoft, потому что Filestream не будет транслироваться с URL.
Не все потоки имеют одинаковые возможности. FileStream - это поток произвольного доступа для чтения / записи. NETworkStream - это прямой поток, доступный только для чтения.
Так что буферизируйте.wav в MemoryStream перед передачей его в API.
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
}
}