Когнитивные сервисы Microsoft – API-интерфейс Bing для распознавания речи

Это третья статья по когнитивным сервисам от Microsoft. На этот раз рассмотрим такие не тривиальные задачи как распознавание речи и конвертация текста в аудиофайл (синтез речи).

После получения ключей API, мы как обычно, можем увидеть конечную точку, ключи и текущие ограничения. Ограничения не дают отправлять более 20 запросов в минуту.

Использовать можно как с помощью REST API вызовов, так и используя клиентскую библиотеку. Использование REST API налаживает ограничения, нельзя распознавать аудио длиннее 15 секунд, получить промежуточные результаты, использовать LUIS.

Распознавание речи в текст

Используя REST API, чтобы распознать то, что говориться в аудиофайле, необходимо послать сам файл в виде POST запроса.

Сделать это можно так:

var requestUri = "https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=ru-RU";
var request = (HttpWebRequest)WebRequest.Create(requestUri);
request.SendChunked = true;
request.Accept = @"application/json;text/xml";
request.Method = "POST";
request.ProtocolVersion = HttpVersion.Version11;
request.ContentType = @"audio/wav; codec=audio/pcm; samplerate=16000";
request.Headers["Ocp-Apim-Subscription-Key"] = "insert_key";

using (var fs = new FileStream(@"audio-sample1.wav", FileMode.Open, FileAccess.Read))
{
    using (Stream requestStream = request.GetRequestStream())
    {
        var buffer = new Byte[checked((uint)Math.Min(1024, (int)fs.Length))];
        int bytesRead;
        while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) != 0)
        {
            requestStream.Write(buffer, 0, bytesRead);
        }
        requestStream.Flush();
    }
}

Мы указываем адрес, на который будет отправлен запрос. В параметре language указываем язык, на котором говорят в файле, в данном случае "ru-RU", список доступных языков можно увидеть здесь: https://docs.microsoft.com/ru-ru/azure/cognitive-services/speech/api-reference-rest/supportedlanguages

В "Ocp-Apim-Subscription-Key", как обычно, указывается ключ. В ContentType указываются параметры передаваемого аудио файла. Обращаю внимание, что сейчас поддерживаются только wav mono файлы с частотой 16000. Это конечно не очень удобно, так как при необходимости использовать данные в другом формате, данные придётся конвертировать.

Для проверки распознавания буду использовать эти файлы:

audio-sample1.wav (200,51 kb)

audio-sample2.wav (141,84 kb)

Получить ответ можно следующим образом:

using (WebResponse response = request.GetResponse())
{
    string responseString;
    using (StreamReader sr = new StreamReader(response.GetResponseStream()))
    {
        responseString = sr.ReadToEnd();
    }
    Console.WriteLine(responseString);
}

Ответом будет Json файлы следующего содержания:

{"RecognitionStatus":"Success","DisplayText":"Привет рассмотрим возможность распознавания речи 1)2)3","Offset":1900000,"Duration":60100000}
{"RecognitionStatus":"Success","DisplayText":"Количество распознавания зависит от качества вашего предложения","Offset":1000000,"Duration":43500000}

Во втором файле слово "произношение" распознало как "предложение". Качество распознавания зависит от качества вашей речи и качества записанного аудио файла.

Проверив распознавание на более сложных аудиофайлах, можно заметить, что с русским языком всё еще остаётся много проблем. Английский распознаёт куда с лучшим качеством, но, думаю, это не для кого не будет сюрпризом.

Помимо REST, можно использовать клиентскую библиотеку Microsoft.Bing.Speech

Работать с ней удобнее, чем напрямую через REST API. Хороший пример использования можно увидеть на GitHub здесь: https://github.com/Azure-Samples/Cognitive-Speech-STT-ServiceLibrary/tree/master/sample/SpeechClientSample

Дублировать их здесь я не буду.

Синтез речи из текста

Чтобы работать с синтезом речи, необходимо сперва получать токен для доступа. Токен действует 10 минут. Чтобы его получить необходимо отправить POST запрос на адрес "https://api.cognitive.microsoft.com/sts/v1.0/issueToken". В Headers в параметре "Ocp-Apim-Subscription-Key" добавить ключ подписки. В ответ, при условии, что ключ подписки корректный, будет получен токен.

Сам запрос синтеза речи делается на адрес "https://speech.platform.bing.com/synthesize"

В ContentType запроса записываем "application/ssml+xml"

В Headers добавляем следующие параметры:

"X-Microsoft-OutputFormat" — формат получаемого аудиофайла.

Сейчас поддерживаются эти значения:

  1. ssml-16khz-16bit-mono-tts
  2. raw-16khz-16bit-mono-pcm
  3. audio-16khz-16kbps-mono-siren
  4. riff-16khz-16kbps-mono-siren
  5. riff-16khz-16bit-mono-pcm
  6. audio-16khz-128kbitrate-mono-mp3
  7. audio-16khz-64kbitrate-mono-mp3
  8. audio-16khz-32kbitrate-mono-mp3

"X-Search-AppId" — идентификатор клиентского приложения. Можно использовать идентификатор приложения в магазине. Идентификатор также может быть создан пользователем.

"X-Search-ClientID" — идентификатор для идентификации отдельных экземпляров приложения.

"User-Agent" — имя приложения. Может быть до 255 символов.

"Authorization" — сюда добавляется полученный токен, в виде Bearer [Base64 access_token]

В примерах на GitHub есть пример реализации TTSClient, который описывает пример всех необходимых вызовов. Увидеть можно здесь:

https://raw.githubusercontent.com/Azure-Samples/Cognitive-Speech-TTS/master/Samples-Http/CSharp/TTSClient.cs

Использовать можно, например, так:

private static void PlayAudio(object sender, GenericEventArgs args)
{
    Console.WriteLine(args.EventData);
    SoundPlayer player = new SoundPlayer(args.EventData);
    player.PlaySync();
    args.EventData.Dispose();
}

private static void ErrorHandler(object sender, GenericEventArgs e)
{
    Console.WriteLine("Не удалось выполнить запрос: [{0}]", e.ToString());
}

private static void Main(string[] args)
{
    Console.WriteLine("Аутентификация");
    string accessToken;
    Authentication auth = new Authentication("b0126fb5265b4c389e50a31ee195d0ac");

    try
    {
        accessToken = auth.GetAccessToken();
        Console.WriteLine("Token: {0}\n", accessToken);
    }
    catch (Exception ex)
    {
        Console.WriteLine("Ошибка аутентификации.");
        Console.WriteLine(ex.ToString());
        Console.WriteLine(ex.Message);
        return;
    }

    string requestUri = "https://speech.platform.bing.com/synthesize";

    var cortana = new Synthesize();

    cortana.OnAudioAvailable += PlayAudio;
    cortana.OnError += ErrorHandler;
    cortana.Speak(CancellationToken.None, new Synthesize.InputOptions()
    {
        RequestUri = new Uri(requestUri),
        Text = "Привет, как твои дела? Это пример синтеза речи для статьи о когнитивных сервисах.",
        VoiceType = Gender.Female,
        Locale = "ru-RU",
        VoiceName = "Microsoft Server Speech Text to Speech Voice (ru-RU, Irina, Apollo)",
        OutputFormat = AudioOutputFormat.Riff16Khz16BitMonoPcm,
        AuthorizationToken = "Bearer " + accessToken,
    }).Wait();
}

В VoiceName мы задаём целевой голос для синтеза речи. Доступные голоса можно увидеть здесь: https://docs.microsoft.com/ru-ru/azure/cognitive-services/speech/api-reference-rest/bingvoiceoutput#SupLocales

На экране мы увидим, какой токен был получен. А сама синтезированная речь будет произнесена:

Как звучит синтезированная речь для используемой фразы, можно услышать здесь

speech-synthesis.wav (250,98 kb)

Если использовать мужской голос для синтеза, то звучать он будет так 

speech-synthesis-male.wav (220,87 kb)

На это всё. Надеюсь принципы работы с речью через API Bing понятны.

Приятного программирования.

Добавить комментарий