Поделиться через


Как распознать речь

Справочная документация | Пакет (NuGet) | Дополнительные примеры на GitHub

В этом руководстве вы узнаете, как использовать речь искусственного интеллекта Azure для преобразования речи в режиме реального времени в текст. Распознавание речи в режиме реального времени идеально подходит для приложений, требующих немедленного транскрибирования, таких как диктовка, помощь в центре вызовов и субтитры для динамических собраний.

Чтобы узнать, как настроить среду для примерного приложения, см. Краткое руководство: Распознавание и преобразование речи в текст.

Создать экземпляр конфигурации речи

Чтобы вызвать службу "Речь" с помощью пакета SDK для службы "Речь", необходимо создать экземпляр SpeechConfig. Этот класс содержит сведения о вашей подписке, такие как ключ и связанный регион, конечная точка, узел или маркер авторизации.

  1. Создайте ресурс служб ИИ для "Речь" в портале Azure. Получите ключ ресурса службы "Речь" и конечную точку.
  2. SpeechConfig Создайте экземпляр с помощью следующего кода. Замените и YourSpeechEndpoint на YourSpeechKey ключ ресурса службы "Речь" и конечную точку.
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

class Program 
{
    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromEndpoint(new Uri("YourSpeechEndpoint"), "YourSpeechKey");
    }
}

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

  • Используйте конечную точку и передайте конечную точку службы речи. Ключ или маркер авторизации являются необязательными.
  • Используйте узел и укажите адрес узла. Ключ или маркер авторизации являются необязательными.
  • Используйте маркер авторизации с соответствующим регионом или расположением.

Примечание.

Независимо от того, выполняется ли распознавание речи, синтез речи, перевод или распознавание намерений, всегда создается конфигурация.

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

Чтобы распознать речь с помощью микрофона устройства, создайте AudioConfig экземпляр, используя FromDefaultMicrophoneInput() метод. Затем инициализируйте объект, передав SpeechRecognizer, speechConfig и audioConfig.

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

class Program 
{
    async static Task FromMic(SpeechConfig speechConfig)
    {
        using var audioConfig = AudioConfig.FromDefaultMicrophoneInput();
        using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

        Console.WriteLine("Speak into your microphone.");
        var speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromEndpoint(new Uri("YourSpeechEndpoint"), "YourSpeechKey");
        await FromMic(speechConfig);
    }
}

Если необходимо использовать конкретное входное аудиоустройство, необходимо указать код устройства в AudioConfig. Чтобы узнать, как получить идентификатор устройства, см. Выбор звукового устройства ввода с помощью SDK службы Speech.

Распознать речь из файла

Чтобы распознавать речь из звукового файла, а не с микрофона, вам все равно нужно создать экземпляр AudioConfig. Тем не менее, вы не вызываете FromDefaultMicrophoneInput(). Вы вызываете FromWavFileInput() и передаете путь к файлу:

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

class Program 
{
    async static Task FromFile(SpeechConfig speechConfig)
    {
        using var audioConfig = AudioConfig.FromWavFileInput("PathToFile.wav");
        using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

        var speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromEndpoint(new Uri("YourSpeechEndpoint"), "YourSpeechKey");
        await FromFile(speechConfig);
    }
}

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

Для многих вариантов использования, скорее всего, ваши звуковые данные поступают из хранилища BLOB-объектов Azure, или в противном случае находятся в памяти как экземпляр byte[] или аналогичную структуру необработанных данных. В следующем примере используется PushAudioInputStream для распознавания речи, который фактически представляет собой абстрактный поток памяти. Пример кода выполняет следующие действия:

  • Записывает необработанные аудиоданные в PushAudioInputStream, используя функцию Write(), которая принимает экземпляр byte[].
  • Читает файл .wav, используя FileReader для демонстрации. Если у вас уже есть звуковые данные в экземпляре byte[], вы можете сразу перейти к записи содержимого во входной поток.
  • Формат по умолчанию — 16-разрядная, 16-кГц моно модуляция импульсно-кодовых данных (PCM). Чтобы настроить формат, можно передать объект AudioStreamFormat в CreatePushStream() с использованием статической функции AudioStreamFormat.GetWaveFormatPCM(sampleRate, (byte)bitRate, (byte)channels).
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

class Program 
{
    async static Task FromStream(SpeechConfig speechConfig)
    {
        var reader = new BinaryReader(File.OpenRead("PathToFile.wav"));
        using var audioConfigStream = AudioInputStream.CreatePushStream();
        using var audioConfig = AudioConfig.FromStreamInput(audioConfigStream);
        using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

        byte[] readBytes;
        do
        {
            readBytes = reader.ReadBytes(1024);
            audioConfigStream.Write(readBytes, readBytes.Length);
        } while (readBytes.Length > 0);

        var speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromEndpoint(new Uri("YourSpeechEndpoint"), "YourSpeechKey");
        await FromStream(speechConfig);
    }
}

При использовании push-потока в качестве входных данных предполагается, что звуковые данные являются необработанными PCM и пропускают все заголовки. API по-прежнему работает в некоторых случаях, если заголовок не пропущен. Для достижения наилучших результатов рекомендуется реализовать логику для считывания заголовков, чтобы byte[] начинался в начале звуковых данных.

Обработка ошибок

В предыдущих примерах из свойства speechRecognitionResult.Text получается только текст, который был распознан. но, чтобы обработать ошибки и другие ответы, необходимо написать код для обработки результата. Следующий код вычисляет свойство speechRecognitionResult.Reason и:

  • Выводит результат распознавания: ResultReason.RecognizedSpeech.
  • Если нет соответствия распознавания, система сообщает пользователю: ResultReason.NoMatch.
  • Если возникла ошибка, выводится сообщение об ошибке: ResultReason.Canceled
switch (speechRecognitionResult.Reason)
{
    case ResultReason.RecognizedSpeech:
        Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
        break;
    case ResultReason.NoMatch:
        Console.WriteLine($"NOMATCH: Speech could not be recognized.");
        break;
    case ResultReason.Canceled:
        var cancellation = CancellationDetails.FromResult(speechRecognitionResult);
        Console.WriteLine($"CANCELED: Reason={cancellation.Reason}");

        if (cancellation.Reason == CancellationReason.Error)
        {
            Console.WriteLine($"CANCELED: ErrorCode={cancellation.ErrorCode}");
            Console.WriteLine($"CANCELED: ErrorDetails={cancellation.ErrorDetails}");
            Console.WriteLine($"CANCELED: Did you set the speech resource key and endpoint values?");
        }
        break;
}

Использование непрерывного распознавания

В предыдущих примерах используется одноразовое распознавание, которое распознает один речевой фрагмент. Конец одного речевого фрагмента определяется либо при обнаружении тишины в конце, либо после обработки максимум 15 секунд аудио.

В отличие от этого, вы используете непрерывное распознавание, когда хотите контролировать, когда нужно остановить распознавание. Для получения результатов распознавания необходимо подписаться на события Recognizing, Recognizedи Canceled. Чтобы отключить распознавание, необходимо вызвать StopContinuousRecognitionAsync. Ниже приведен пример того, как выполняется непрерывное распознавание входного аудиофайла.

Начните с определения входных данных и инициализации SpeechRecognizer:

using var audioConfig = AudioConfig.FromWavFileInput("YourAudioFile.wav");
using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

Затем создайте экземпляр TaskCompletionSource<int> для управления состоянием распознавания речи.

var stopRecognition = new TaskCompletionSource<int>();

Теперь подпишитесь на события, которые отправляет SpeechRecognizer:

  • Recognizing: сигнал для событий, содержащих промежуточные результаты распознавания.
  • Recognized: сигнал для событий, содержащих окончательные результаты распознавания (указывает на успешность попытки распознавания).
  • SessionStopped: сигнал для событий, указывающих на окончание сеанса (операции) распознавания.
  • Canceled: сигнал для событий, содержащих отмененные результаты распознавания. Эти результаты указывают на попытку распознавания, которая была отменена в результате прямого запроса на отмену. Они также могут указывать на сбой транспорта или протокола.
speechRecognizer.Recognizing += (s, e) =>
{
    Console.WriteLine($"RECOGNIZING: Text={e.Result.Text}");
};

speechRecognizer.Recognized += (s, e) =>
{
    if (e.Result.Reason == ResultReason.RecognizedSpeech)
    {
        Console.WriteLine($"RECOGNIZED: Text={e.Result.Text}");
    }
    else if (e.Result.Reason == ResultReason.NoMatch)
    {
        Console.WriteLine($"NOMATCH: Speech could not be recognized.");
    }
};

speechRecognizer.Canceled += (s, e) =>
{
    Console.WriteLine($"CANCELED: Reason={e.Reason}");

    if (e.Reason == CancellationReason.Error)
    {
        Console.WriteLine($"CANCELED: ErrorCode={e.ErrorCode}");
        Console.WriteLine($"CANCELED: ErrorDetails={e.ErrorDetails}");
        Console.WriteLine($"CANCELED: Did you set the speech resource key and endpoint values?");
    }

    stopRecognition.TrySetResult(0);
};

speechRecognizer.SessionStopped += (s, e) =>
{
    Console.WriteLine("\n    Session stopped event.");
    stopRecognition.TrySetResult(0);
};

Завершив настройку, вызовите StartContinuousRecognitionAsync, чтобы начать распознавание:

await speechRecognizer.StartContinuousRecognitionAsync();

// Waits for completion. Use Task.WaitAny to keep the task rooted.
Task.WaitAny(new[] { stopRecognition.Task });

// Make the following call at some point to stop recognition:
// await speechRecognizer.StopContinuousRecognitionAsync();

Изменение исходного языка

Распространенной задачей распознавания речи является указание языка ввода (или исходного языка). В следующем примере показано, как изменить язык ввода на итальянский. В своем коде найдите экземпляр SpeechConfig, а затем добавьте непосредственно под ним следующую строку:

speechConfig.SpeechRecognitionLanguage = "it-IT";

Свойство SpeechRecognitionLanguage ожидает строку в формате языка и региональных настроек. Список поддерживаемых языковых стандартов см. в разделе Поддержка языков и голоса для службы "Речь".

Идентификация языка

Вы можете использовать идентификацию языка с речью для распознавания текста, если необходимо определить язык в источнике звука, а затем переписать его в текст.

Полный пример кода см. в разделе "Идентификация языка".

Используйте пользовательскую конечную точку

С помощью пользовательской речи можно отправлять собственные данные, тестировать и обучать пользовательскую модель, сравнивать точность между моделями и развертывать модель в настраиваемую конечную точку. В следующем примере показано, как настроить пользовательскую конечную точку.

var speechConfig = SpeechConfig.FromEndpoint(new Uri("YourSpeechEndpoint"), "YourSpeechKey");
speechConfig.EndpointId = "YourEndpointId";
var speechRecognizer = new SpeechRecognizer(speechConfig);

Запуск и использование контейнера

Контейнеры службы "Речь" предоставляют API конечных точек запросов на основе websocket, к которым обращается пакет SDK службы "Речь" и CLI службы "Речь". По умолчанию SDK и CLI службы "Речь" используют общедоступную службу "Речь". Чтобы использовать контейнер, вам необходимо изменить метод инициализации. Используйте URL-адрес узла контейнера вместо ключа и региона.

Дополнительные сведения о контейнерах см. в разделе URL-адреса узлов в разделе "Установка и запуск контейнеров службы "Речь" с помощью Docker.

Изменение способа обработки тишины

Если пользователь говорит быстрее или медленнее, чем обычно, поведение по умолчанию для пауз без речи во входящем аудио может не привести к ожидаемым результатам. Распространенные проблемы с обработкой тишины:

  • Быстрая речь, которая связывает множество предложений в единый результат распознавания, вместо того чтобы разбивать предложения на отдельные результаты.
  • Медленная речь, которая разделяет части одного предложения на несколько результатов.
  • Однократное распознавание, которое заканчивается слишком быстро, ожидая начала речи.

Эти проблемы можно устранить, задав одно из двух свойств времени ожидания в экземпляре, используемом SpeechConfig для создания SpeechRecognizer:

  • Таймаут ожидания молчания корректирует, сколько неслышимого звука разрешено в фразе, пока она произносится, до того как эта фраза считается "завершённой".
    • Более высокие значения обычно делают результаты более длинными и разрешают более долгие паузы говорящего в пределах фразы, но результаты занимают больше времени, чтобы появиться. Они также могут объединять отдельные фразы в один результат при слишком высоком установленном значении.
    • Более низкие значения обычно делают результаты более короткими и обеспечивают более быстрые и частые паузы между фразами, но также могут привести к разделению отдельных фраз на несколько результатов при слишком низком значении.
    • Это время ожидания можно задать для целочисленных значений от 100 до 5000 в миллисекундах с 500 стандартным значением по умолчанию.
  • Тайм-аут начального молчания регулирует, сколько не речевого аудио разрешено перед началом фразы, прежде чем попытка распознавания заканчивается результатом "без совпадения".
    • Более высокие значения дают ораторам больше времени реагировать и начать говорить, но также может привести к медленной реакции, когда ничего не говорится.
    • Более низкие значения гарантируют, что запрос "не соответствует" для более быстрого взаимодействия с пользователем и более управляемой обработки звука, но может отрезать динамик слишком быстро при установке слишком низкого уровня.
    • Так как непрерывное распознавание создает множество результатов, это значение определяет частоту поступления результатов "без соответствия", но не влияет на содержимое результатов распознавания.
    • Это время ожидания может быть задано как любое неотрицательное целое значение, в миллисекундах или значение 0, чтобы полностью отключить его. 5000 — это типичное значение по умолчанию для однокамерного распознавания, в то время как 15000 является типичным по умолчанию для непрерывного распознавания.

Так как при изменении этих тайм-аутов существуют компромиссы, следует изменять параметры только при возникновении проблемы, связанной с обработкой молчания. Значения по умолчанию оптимально обрабатывают большинство речевых звуков, и только в редких сценариях могут возникать проблемы.

Пример: Пользователи, произносящие серийный номер, такой как "ABC-123-4567", могут сделать паузу между группами символов достаточно длинной, чтобы серийный номер перепутался с несколькими результатами. В этом случае попробуйте задать более высокое значение, например 2000 миллисекунд, для таймаута сегментации тишины.

speechConfig.SetProperty(PropertyId.Speech_SegmentationSilenceTimeoutMs, "2000");

Пример: речь записанного докладчика может быть достаточно быстрой, чтобы несколько предложений подряд сочетались, и большие результаты распознавания появляются только один или два раза в минуту. В этом случае задайте для времени ожидания молчания сегментации меньшее значение, например 300 мс:

speechConfig.SetProperty(PropertyId.Speech_SegmentationSilenceTimeoutMs, "300");

Пример: однократное распознавание, в котором система просит говорящего найти и прочитать серийный номер, заканчивается слишком быстро, пока номер все еще ищут. В этом случае попробуйте более длительное время ожидания молчания, например 10 000 мс:

speechConfig.SetProperty(PropertyId.SpeechServiceConnection_InitialSilenceTimeoutMs, "10000");

Семантическая сегментация

Семантическая сегментация — это стратегия сегментации распознавания речи, предназначенная для устранения проблем, связанных с сегментацией на основе молчания:

  • Недосегментация: когда пользователи говорят долго без пауз, они могут видеть длинный отрывок текста без разрывов ("стена текста"), что значительно снижает их восприятие читаемости.
  • Чрезмерное сегментирование: когда пользователь делает короткую паузу, механизм обнаружения молчания может сегментировать неправильно.

Вместо того чтобы полагаться только на время ожидания молчания, семантическая сегментация в основном разделяет текст и возвращает окончательные результаты, когда она обнаруживает знаки препинания (например, "." или "?"). Это улучшает качество взаимодействия с пользователем, исключает длительные промежуточные результаты и обеспечивает семантически завершенные сегменты более высокого качества.

Чтобы использовать семантику сегментации, необходимо задать следующее свойство в экземпляре, используемом SpeechConfig для создания SpeechRecognizer:

speechConfig.SetProperty(PropertyId.Speech_SegmentationStrategy, "Semantic");

Ниже приведены некоторые ограничения семантической сегментации.

  • Для использования семантической сегментации необходимо использовать пакет SDK службы "Речь" версии 1.41 или более поздней.
  • Семантическая сегментация предназначена только для использования в непрерывном распознавании. К ним относятся такие сценарии, как диктовка и субтитры. Его не следует использовать в одном режиме распознавания или интерактивных сценариях.
  • Семантическая сегментация недоступна для всех языков и языковых стандартов.
  • Семантическая сегментация пока не поддерживает оценки достоверности и списки NBest. Таким образом, мы не рекомендуем семантическую сегментацию, если вы используете оценки уверенности или списки NBest.

Справочная документация | Пакет (NuGet) | Дополнительные примеры на GitHub

В этом руководстве вы узнаете, как использовать речь искусственного интеллекта Azure для преобразования речи в режиме реального времени в текст. Распознавание речи в режиме реального времени идеально подходит для приложений, требующих немедленного транскрибирования, таких как диктовка, помощь в центре вызовов и субтитры для динамических собраний.

Узнайте, как настроить среду для примера приложения в Кратком руководстве: Распознавание и преобразование речи в текст.

Создайте экземпляр конфигурации речи

Чтобы вызвать службу распознавания речи с помощью SDK для речи, необходимо создать экземпляр SpeechConfig. Этот класс содержит сведения о вашей подписке, такие как ключ и связанный регион, конечная точка, узел или маркер авторизации.

  1. Создайте ресурс ИИ служб для функций "Речь" в портале Azure. Получите ключ ресурса службы "Речь" и конечную точку.
  2. SpeechConfig Создайте экземпляр с помощью следующего кода. Замените YourSpeechKey и YourSpeechEndpoint на ключ ресурса службы "Речь" и конечную точку соответственно.
using namespace std;
using namespace Microsoft::CognitiveServices::Speech;

auto speechConfig = SpeechConfig::FromEndpoint("YourServiceEndpoint", "YourSubscriptionKey");

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

  • Задействуйте конечную точку и передайте в неё конечную точку службы синтеза речи. Ключ или маркер авторизации являются необязательными.
  • Используйте хост и передайте его адрес. Ключ или маркер авторизации являются необязательными.
  • Используйте маркер авторизации с соответствующим регионом или расположением.

Примечание.

Независимо от того, выполняется ли распознавание речи, синтез речи, перевод или распознавание намерений, всегда создается конфигурация.

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

Чтобы распознать речь с помощью микрофона устройства, создайте AudioConfig экземпляр с помощью FromDefaultMicrophoneInput() функции-члена. Затем инициализируйте объект, передав SpeechRecognizer, audioConfig и config.

using namespace Microsoft::CognitiveServices::Speech::Audio;

auto audioConfig = AudioConfig::FromDefaultMicrophoneInput();
auto speechRecognizer = SpeechRecognizer::FromConfig(config, audioConfig);

cout << "Speak into your microphone." << std::endl;
auto result = speechRecognizer->RecognizeOnceAsync().get();
cout << "RECOGNIZED: Text=" << result->Text << std::endl;

Если необходимо использовать конкретное входное аудиоустройство, необходимо указать код устройства в AudioConfig. Сведения о том, как получить идентификатор устройства, см. в разделе Выбор звукового устройства ввода с помощью Speech SDK.

Распознать речь из файла

Чтобы распознавать речь из аудиофайла, а не с помощью микрофона, вам все равно нужно создать экземпляр AudioConfig. Тем не менее, вы не вызываете FromDefaultMicrophoneInput(). Вы вызываете FromWavFileInput() и передаете путь к файлу:

using namespace Microsoft::CognitiveServices::Speech::Audio;

auto audioConfig = AudioConfig::FromWavFileInput("YourAudioFile.wav");
auto speechRecognizer = SpeechRecognizer::FromConfig(config, audioConfig);

auto result = speechRecognizer->RecognizeOnceAsync().get();
cout << "RECOGNIZED: Text=" << result->Text << std::endl;

Распознавание речи с помощью класса распознавателя

Класс распознавателя для пакета SDK службы "Речь" для C++ предоставляет несколько методов, которые можно использовать для распознавания речи.

Одноразовое распознавание

Под одноразовым распознаванием подразумевается асинхронное распознавание отдельного речевого фрагмента. Конец одного речевого фрагмента определяется путем прослушивания до тишины в конце, или пока не будет обработано максимум 15 секунд аудио. Ниже приведен пример асинхронного одноразового распознавания с помощью RecognizeOnceAsync:

auto result = speechRecognizer->RecognizeOnceAsync().get();

Вам будет необходимо написать код для обработки результата. В этом примере оценивается result->Reason и:

  • Выводит результат распознавания: ResultReason::RecognizedSpeech.
  • Если нет совпадения при распознавании, это информирует пользователя: ResultReason::NoMatch.
  • Если возникла ошибка, выводится сообщение об ошибке: ResultReason::Canceled
switch (result->Reason)
{
    case ResultReason::RecognizedSpeech:
        cout << "We recognized: " << result->Text << std::endl;
        break;
    case ResultReason::NoMatch:
        cout << "NOMATCH: Speech could not be recognized." << std::endl;
        break;
    case ResultReason::Canceled:
        {
            auto cancellation = CancellationDetails::FromResult(result);
            cout << "CANCELED: Reason=" << (int)cancellation->Reason << std::endl;
    
            if (cancellation->Reason == CancellationReason::Error) {
                cout << "CANCELED: ErrorCode= " << (int)cancellation->ErrorCode << std::endl;
                cout << "CANCELED: ErrorDetails=" << cancellation->ErrorDetails << std::endl;
                cout << "CANCELED: Did you set the speech resource key and endpoint values?" << std::endl;
            }
        }
        break;
    default:
        break;
}

Непрерывное распознавание

Непрерывное распознавание чуть более сложное, чем однократное распознавание. Для получения результатов распознавания необходимо подписаться на события Recognizing, Recognizedи Canceled. Чтобы отключить распознавание, необходимо вызвать StopContinuousRecognitionAsync. Ниже приведен пример непрерывного распознавания, выполняемого в звуковом входном файле.

Начните с определения входных данных и инициализации SpeechRecognizer:

auto audioConfig = AudioConfig::FromWavFileInput("YourAudioFile.wav");
auto speechRecognizer = SpeechRecognizer::FromConfig(config, audioConfig);

Теперь создайте переменную для управления состоянием распознавания речи. Объявите promise<void>, так как в начале распознавания можно смело предположить, что оно не закончено:

promise<void> recognitionEnd;

Теперь подпишитесь на события, которые отправляет SpeechRecognizer:

  • Recognizing: сигнал для событий, содержащих промежуточные результаты распознавания.
  • Recognized: сигнал для событий, содержащих окончательные результаты распознавания (указывает на успешность попытки распознавания).
  • SessionStopped: сигнал для событий, указывающих на окончание сеанса (операции) распознавания.
  • Canceled: сигнал для событий, содержащих отмененные результаты распознавания. Эти результаты указывают на попытку распознавания, которая была отменена в результате прямого запроса на отмену. Они также могут указывать на сбой транспорта или протокола.
speechRecognizer->Recognizing.Connect([](const SpeechRecognitionEventArgs& e)
    {
        cout << "Recognizing:" << e.Result->Text << std::endl;
    });

speechRecognizer->Recognized.Connect([](const SpeechRecognitionEventArgs& e)
    {
        if (e.Result->Reason == ResultReason::RecognizedSpeech)
        {
            cout << "RECOGNIZED: Text=" << e.Result->Text 
                 << " (text could not be translated)" << std::endl;
        }
        else if (e.Result->Reason == ResultReason::NoMatch)
        {
            cout << "NOMATCH: Speech could not be recognized." << std::endl;
        }
    });

speechRecognizer->Canceled.Connect([&recognitionEnd](const SpeechRecognitionCanceledEventArgs& e)
    {
        cout << "CANCELED: Reason=" << (int)e.Reason << std::endl;
        if (e.Reason == CancellationReason::Error)
        {
            cout << "CANCELED: ErrorCode=" << (int)e.ErrorCode << "\n"
                 << "CANCELED: ErrorDetails=" << e.ErrorDetails << "\n"
                 << "CANCELED: Did you set the speech resource key and endpoint values?" << std::endl;

            recognitionEnd.set_value(); // Notify to stop recognition.
        }
    });

speechRecognizer->SessionStopped.Connect([&recognitionEnd](const SessionEventArgs& e)
    {
        cout << "Session stopped.";
        recognitionEnd.set_value(); // Notify to stop recognition.
    });

Завершив настройку, вызовите StartContinuousRecognitionAsync, чтобы начать распознавание:

// Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
speechRecognizer->StartContinuousRecognitionAsync().get();

// Waits for recognition end.
recognitionEnd.get_future().get();

// Stops recognition.
speechRecognizer->StopContinuousRecognitionAsync().get();

Изменение исходного языка

Распространенной задачей распознавания речи является указание языка ввода (или исходного языка). В следующем примере показано, как изменить язык ввода на немецкий. В своем коде найдите экземпляр SpeechConfig, а затем добавьте непосредственно под ним следующую строку:

speechConfig->SetSpeechRecognitionLanguage("de-DE");

SetSpeechRecognitionLanguage — это параметр, принимающий строку в качестве аргумента. Для получения списка поддерживаемых локалей см. раздел Поддержка языков и голосов для службы распознавания речи.

Идентификация языка

Вы можете использовать идентификацию языка с речью для распознавания текста, если необходимо определить язык в источнике звука, а затем переписать его в текст.

Полный пример кода см. в разделе "Идентификация языка".

Использование пользовательской конечной точки

С помощью пользовательской речи можно отправлять собственные данные, тестировать и обучать пользовательскую модель, сравнивать точность между моделями и развертывать модель в настраиваемую конечную точку. В следующем примере показано, как настроить пользовательскую конечную точку.

auto speechConfig = SpeechConfig::FromEndpoint("YourServiceEndpoint", "YourSubscriptionKey");
speechConfig->SetEndpointId("YourEndpointId");
auto speechRecognizer = SpeechRecognizer::FromConfig(speechConfig);

Запуск и использование контейнера

Речевые контейнеры предоставляют API конечных точек запросов на основе WebSocket, доступ к которым осуществляется через SDK и CLI для преобразования речи. По умолчанию, SDK службы распознавания речи и CLI службы распознавания речи используют общедоступную службу распознавания речи. Чтобы использовать контейнер, вам необходимо изменить метод инициализации. Используйте URL-адрес узла контейнера вместо ключа и конечной точки.

Дополнительные сведения о контейнерах см. в разделе URL-адреса узлов в разделе "Установка и запуск контейнеров службы "Речь" с помощью Docker.

Семантическая сегментация

Семантическая сегментация — это стратегия сегментации распознавания речи, предназначенная для устранения проблем, связанных с сегментацией на основе молчания:

  • Недостаточная сегментация: когда пользователи говорят долго без пауз, они могут видеть длинную последовательность сплошного текста, что значительно снижает читаемость.
  • Чрезмерное сегментирование: когда пользователь приостанавливается в течение короткого времени, механизм обнаружения молчания может сегментировать неправильно.

Вместо того чтобы полагаться только на тайм-ауты тишины, семантическая сегментация в основном сегментирует и возвращает окончательные результаты, когда она обнаруживает знаки препинания (например, '.' или '?'). Это улучшает пользовательский опыт благодаря более высокому качеству и семантически полным сегментам, и предотвращает возникновение длительных промежуточных результатов.

Чтобы использовать семантику сегментации, необходимо задать следующее свойство в экземпляре, используемом SpeechConfig для создания SpeechRecognizer:

speechConfig->SetProperty(PropertyId::Speech_SegmentationStrategy, "Semantic");

Ниже приведены некоторые ограничения семантической сегментации.

  • Для использования семантической сегментации необходимо использовать пакет SDK службы "Речь" версии 1.41 или более поздней.
  • Семантическая сегментация предназначена только для использования в непрерывном распознавании. К ним относятся такие сценарии, как диктовка и субтитры. Его не следует использовать в одном режиме распознавания или интерактивных сценариях.
  • Семантическая сегментация доступна не для всех языков и регионов.
  • Семантическая сегментация пока не поддерживает оценки достоверности и списки NBest. Таким образом, мы не рекомендуем семантику сегментации, если вы используете оценки достоверности или списки NBest.

Справочная документация | Пакет (Go) | Дополнительные примеры на GitHub

В этом руководстве вы узнаете, как использовать речь искусственного интеллекта Azure для преобразования речи в режиме реального времени в текст. Распознавание речи в режиме реального времени идеально подходит для приложений, требующих немедленного транскрибирования, таких как диктовка, помощь в центре вызовов и субтитры для динамических собраний.

Чтобы узнать, как настроить среду для примера приложения, см. Краткое руководство: распознавание и преобразование речи в текст.

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

  1. Создайте ресурс ИИ для службы "Речь" в портале Azure. Получите ключ ресурса для распознавания речи и регион.
  2. Используйте следующий пример кода для запуска распознавания речи с микрофона устройства по умолчанию. Замените YourSpeechKey на ключ ресурса "Речь", а YourSpeechRegion на регион. Запуск скрипта запускает сеанс распознавания на микрофоне по умолчанию и выходном тексте:
package main

import (
	"bufio"
	"fmt"
	"os"

	"github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
	"github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)

func sessionStartedHandler(event speech.SessionEventArgs) {
	defer event.Close()
	fmt.Println("Session Started (ID=", event.SessionID, ")")
}

func sessionStoppedHandler(event speech.SessionEventArgs) {
	defer event.Close()
	fmt.Println("Session Stopped (ID=", event.SessionID, ")")
}

func recognizingHandler(event speech.SpeechRecognitionEventArgs) {
	defer event.Close()
	fmt.Println("Recognizing:", event.Result.Text)
}

func recognizedHandler(event speech.SpeechRecognitionEventArgs) {
	defer event.Close()
	fmt.Println("Recognized:", event.Result.Text)
}

func cancelledHandler(event speech.SpeechRecognitionCanceledEventArgs) {
	defer event.Close()
	fmt.Println("Received a cancellation: ", event.ErrorDetails)
	fmt.Println("Did you set the speech resource key and region values?")
}

func main() {
    subscription :=  "YourSpeechKey"
    region := "YourSpeechRegion"

	audioConfig, err := audio.NewAudioConfigFromDefaultMicrophoneInput()
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer audioConfig.Close()
	config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer config.Close()
	speechRecognizer, err := speech.NewSpeechRecognizerFromConfig(config, audioConfig)
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer speechRecognizer.Close()
	speechRecognizer.SessionStarted(sessionStartedHandler)
	speechRecognizer.SessionStopped(sessionStoppedHandler)
	speechRecognizer.Recognizing(recognizingHandler)
	speechRecognizer.Recognized(recognizedHandler)
	speechRecognizer.Canceled(cancelledHandler)
	speechRecognizer.StartContinuousRecognitionAsync()
	defer speechRecognizer.StopContinuousRecognitionAsync()
	bufio.NewReader(os.Stdin).ReadBytes('\n')
}

Выполните приведенные ниже команды, чтобы создать файл go.mod со ссылкой на компоненты, размещенные в GitHub:

go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go

Теперь можно приступить к сборке и выполнению кода:

go build
go run quickstart

Подробные сведения см. в справочных материалах для SpeechConfig класса и SpeechRecognizer класса.

Распознавание речи в тексте из звукового файла

Используйте следующий пример, чтобы запустить распознавание речи из звукового файла. Замените YourSpeechKey на ключ ресурса службы "Речь" и YourSpeechRegion на регион. Кроме того, замените переменную file на путь к файлу .wav. При запуске скрипта он распознает речь из файла и выводит результат текста:

package main

import (
	"fmt"
	"time"

	"github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
	"github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)

func main() {
    subscription :=  "YourSpeechKey"
    region := "YourSpeechRegion"
    file := "path/to/file.wav"

	audioConfig, err := audio.NewAudioConfigFromWavFileInput(file)
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer audioConfig.Close()
	config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer config.Close()
	speechRecognizer, err := speech.NewSpeechRecognizerFromConfig(config, audioConfig)
	if err != nil {
		fmt.Println("Got an error: ", err)
		return
	}
	defer speechRecognizer.Close()
	speechRecognizer.SessionStarted(func(event speech.SessionEventArgs) {
		defer event.Close()
		fmt.Println("Session Started (ID=", event.SessionID, ")")
	})
	speechRecognizer.SessionStopped(func(event speech.SessionEventArgs) {
		defer event.Close()
		fmt.Println("Session Stopped (ID=", event.SessionID, ")")
	})

	task := speechRecognizer.RecognizeOnceAsync()
	var outcome speech.SpeechRecognitionOutcome
	select {
	case outcome = <-task:
	case <-time.After(5 * time.Second):
		fmt.Println("Timed out")
		return
	}
	defer outcome.Close()
	if outcome.Error != nil {
		fmt.Println("Got an error: ", outcome.Error)
	}
	fmt.Println("Got a recognition!")
	fmt.Println(outcome.Result.Text)
}

Выполните приведенные ниже команды, чтобы создать файл go.mod со ссылкой на компоненты, размещенные в GitHub:

go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go

Теперь можно приступить к сборке и выполнению кода:

go build
go run quickstart

Подробные сведения см. в справочных материалах для SpeechConfig класса и SpeechRecognizer класса.

Запуск и использование контейнера

Контейнеры службы "Речь" предоставляют API конечных точек запросов на основе websocket, к которым обращается пакет SDK службы "Речь" и CLI службы "Речь". По умолчанию SDK службы "Речь" и CLI службы "Речь" используют общедоступную службу "Речь". Чтобы использовать контейнер, вам необходимо изменить метод инициализации. Используйте URL-адрес узла контейнера вместо ключа и региона.

Дополнительные сведения о контейнерах см. в разделе URL-адреса узлов в разделе "Установка и запуск контейнеров службы "Речь" с помощью Docker.

Справочная документация | Дополнительные примеры на GitHub

В этом руководстве вы узнаете, как использовать речь искусственного интеллекта Azure для преобразования речи в режиме реального времени в текст. Распознавание речи в режиме реального времени идеально подходит для приложений, требующих немедленного транскрибирования, таких как диктовка, помощь в центре вызовов и субтитры для динамических собраний.

Чтобы узнать, как настроить среду для примера приложения, см. Краткое руководство: Распознавание и преобразование речи в текст.

Создать экземпляр конфигурации речи

Чтобы вызвать службу "Речь" с помощью Speech SDK, необходимо создать экземпляр SpeechConfig. Этот класс содержит сведения о вашей подписке, такие как ключ и связанный регион, конечная точка, узел или маркер авторизации.

  1. Создайте ресурс служб ИИ для службы "Речь" в портале Azure. Получите ключ ресурса Speech и регион.
  2. Создайте SpeechConfig экземпляр, используя ваш ключ для "Speech" и регион.
import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key>", "<paste-your-region>");
    }
}

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

  • Используйте конечную точку и передайте адрес конечной точки службы «Речь». Ключ или маркер авторизации являются необязательными.
  • Используйте узел и передайте адрес узла в качестве параметра. Ключ или маркер авторизации являются необязательными.
  • Используйте маркер авторизации с соответствующим регионом или расположением.

Примечание.

Независимо от того, используете ли вы распознавание речи, синтез речи, перевод или распознавание намерения, вы всегда создаете конфигурацию.

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

Чтобы распознать речь с помощью микрофона устройства, создайте AudioConfig экземпляр с помощью fromDefaultMicrophoneInput() метода. Затем инициализируйте объект, передав SpeechRecognizer, audioConfig и config.

import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key>", "<paste-your-region>");
        fromMic(speechConfig);
    }

    public static void fromMic(SpeechConfig speechConfig) throws InterruptedException, ExecutionException {
        AudioConfig audioConfig = AudioConfig.fromDefaultMicrophoneInput();
        SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);

        System.out.println("Speak into your microphone.");
        Future<SpeechRecognitionResult> task = speechRecognizer.recognizeOnceAsync();
        SpeechRecognitionResult speechRecognitionResult = task.get();
        System.out.println("RECOGNIZED: Text=" + speechRecognitionResult.getText());
    }
}

Если необходимо использовать конкретное входное аудиоустройство, необходимо указать код устройства в AudioConfig. Чтобы узнать, как получить идентификатор устройства, см. раздел "Выбор устройства аудиоввода с помощью Speech SDK".

Распознать речь из файла

Чтобы распознавать речь из аудиофайла, а не с помощью микрофона, вам все равно нужно создать экземпляр AudioConfig. Тем не менее, вы не вызываете FromDefaultMicrophoneInput(). Вы вызываете fromWavFileInput() и передаете путь к файлу:

import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key>", "<paste-your-region>");
        fromFile(speechConfig);
    }

    public static void fromFile(SpeechConfig speechConfig) throws InterruptedException, ExecutionException {
        AudioConfig audioConfig = AudioConfig.fromWavFileInput("YourAudioFile.wav");
        SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);
        
        Future<SpeechRecognitionResult> task = speechRecognizer.recognizeOnceAsync();
        SpeechRecognitionResult speechRecognitionResult = task.get();
        System.out.println("RECOGNIZED: Text=" + speechRecognitionResult.getText());
    }
}

Обработка ошибок

В предыдущих примерах используется только распознанный текст, полученный с помощью speechRecognitionResult.getText(). но, чтобы обработать ошибки и другие ответы, необходимо написать код для обработки результата. Следующий пример кода вычисляет значение speechRecognitionResult.getReason() и выполняет следующее:

  • Выводит результат распознавания: ResultReason.RecognizedSpeech.
  • Если распознавание не соответствует, он сообщает пользователю: ResultReason.NoMatch
  • Если возникла ошибка, выводится сообщение об ошибке: ResultReason.Canceled
switch (speechRecognitionResult.getReason()) {
    case ResultReason.RecognizedSpeech:
        System.out.println("We recognized: " + speechRecognitionResult.getText());
        exitCode = 0;
        break;
    case ResultReason.NoMatch:
        System.out.println("NOMATCH: Speech could not be recognized.");
        break;
    case ResultReason.Canceled: {
            CancellationDetails cancellation = CancellationDetails.fromResult(speechRecognitionResult);
            System.out.println("CANCELED: Reason=" + cancellation.getReason());

            if (cancellation.getReason() == CancellationReason.Error) {
                System.out.println("CANCELED: ErrorCode=" + cancellation.getErrorCode());
                System.out.println("CANCELED: ErrorDetails=" + cancellation.getErrorDetails());
                System.out.println("CANCELED: Did you set the speech resource key and region values?");
            }
        }
        break;
}

Использование непрерывного распознавания

В предыдущих примерах используется одноразовое распознавание, которое распознает один речевой фрагмент. Конец одного речевого фрагмента определяется путем прослушивания до тишины в конце, или пока не будет обработано максимум 15 секунд аудио.

Напротив, непрерывное распознавание используется в тех случаях, когда вы хотите сами контролировать момент остановки распознавания. Для получения результатов распознавания необходимо подписаться на события recognizing, recognizedи canceled. Чтобы отключить распознавание, необходимо вызвать stopContinuousRecognitionAsync. Ниже приведен пример того, как можно выполнять непрерывное распознавание в звуковом файле ввода.

Начните с определения входных данных и инициализации SpeechRecognizer:

AudioConfig audioConfig = AudioConfig.fromWavFileInput("YourAudioFile.wav");
SpeechRecognizer speechRecognizer = new SpeechRecognizer(config, audioConfig);

Теперь создайте переменную для управления состоянием распознавания речи. Объявите экземпляр Semaphore в области класса:

private static Semaphore stopTranslationWithFileSemaphore;

Теперь подпишитесь на события, которые отправляет SpeechRecognizer:

  • recognizing: сигнал для событий, содержащих промежуточные результаты распознавания.
  • recognized: сигнал для событий, содержащих окончательные результаты распознавания (указывает на успешность попытки распознавания).
  • sessionStopped: сигнал для событий, указывающих на окончание сеанса (операции) распознавания.
  • canceled: сигнал для событий, содержащих отмененные результаты распознавания. Эти результаты указывают на попытку распознавания, которая была отменена в результате прямого запроса на отмену. Они также могут указывать на сбой транспорта или протокола.
// First initialize the semaphore.
stopTranslationWithFileSemaphore = new Semaphore(0);

speechRecognizer.recognizing.addEventListener((s, e) -> {
    System.out.println("RECOGNIZING: Text=" + e.getResult().getText());
});

speechRecognizer.recognized.addEventListener((s, e) -> {
    if (e.getResult().getReason() == ResultReason.RecognizedSpeech) {
        System.out.println("RECOGNIZED: Text=" + e.getResult().getText());
    }
    else if (e.getResult().getReason() == ResultReason.NoMatch) {
        System.out.println("NOMATCH: Speech could not be recognized.");
    }
});

speechRecognizer.canceled.addEventListener((s, e) -> {
    System.out.println("CANCELED: Reason=" + e.getReason());

    if (e.getReason() == CancellationReason.Error) {
        System.out.println("CANCELED: ErrorCode=" + e.getErrorCode());
        System.out.println("CANCELED: ErrorDetails=" + e.getErrorDetails());
        System.out.println("CANCELED: Did you set the speech resource key and region values?");
    }

    stopTranslationWithFileSemaphore.release();
});

speechRecognizer.sessionStopped.addEventListener((s, e) -> {
    System.out.println("\n    Session stopped event.");
    stopTranslationWithFileSemaphore.release();
});

Завершив настройку, вызовите startContinuousRecognitionAsync, чтобы начать распознавание:

// Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
speechRecognizer.startContinuousRecognitionAsync().get();

// Waits for completion.
stopTranslationWithFileSemaphore.acquire();

// Stops recognition.
speechRecognizer.stopContinuousRecognitionAsync().get();

Изменение исходного языка

Распространенной задачей распознавания речи является указание языка ввода (или исходного языка). В следующем примере показано, как изменить язык ввода на французский. В коде найдите экземпляр SpeechConfig и добавьте эту строку непосредственно под ним:

config.setSpeechRecognitionLanguage("fr-FR");

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

Идентификация языка

Вы можете использовать идентификацию языка с речью для распознавания текста, если необходимо определить язык в источнике звука, а затем переписать его в текст.

Полный пример кода см. в разделе "Идентификация языка".

Использование пользовательской конечной точки

С помощью пользовательской речи можно отправлять собственные данные, тестировать и обучать пользовательскую модель, сравнивать точность между моделями и развертывать модель в настраиваемую конечную точку. В следующем примере показано, как задать пользовательскую конечную точку:

SpeechConfig speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourServiceRegion");
speechConfig.setEndpointId("YourEndpointId");
SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig);

Запуск и использование контейнера

Контейнеры речевых служб предоставляют API конечных точек для запросов на основе WebSocket, к которым обращаются с помощью Speech SDK и Speech CLI. По умолчанию SDK и CLI для службы "Речь" используют публично доступную службу "Речь". Чтобы использовать контейнер, вам необходимо изменить метод инициализации. Используйте URL-адрес узла контейнера вместо ключа и региона.

Дополнительные сведения о контейнерах см. в разделе URL-адреса узлов в разделе "Установка и запуск контейнеров службы "Речь" с помощью Docker.

Семантическая сегментация

Семантическая сегментация — это стратегия сегментации распознавания речи, предназначенная для устранения проблем, связанных с сегментацией на основе молчания:

  • Недостаточная сегментация: когда пользователи говорят долго без пауз, они могут видеть длинную последовательность текста без разрывов ("стена текста"), что значительно снижает их удобочитаемость.
  • Чрезмерное сегментирование: Когда пользователь ненадолго останавливается, механизм обнаружения молчания может сегментировать неправильно.

Вместо того чтобы полагаться только на время ожидания молчания, семантическая сегментация в основном разбивает на сегменты и возвращает окончательные результаты, когда она обнаруживает знаки препинания, заканчивающие предложение (например, '.' или '?'). Это улучшает опыт пользователя за счет более высокого качества и семантически завершенных сегментов, а также предотвращает продолжительные промежуточные результаты.

Чтобы использовать семантику сегментации, необходимо задать следующее свойство в экземпляре, используемом SpeechConfig для создания SpeechRecognizer:

speechConfig.SetProperty(PropertyId.Speech_SegmentationStrategy, "Semantic");

Ниже приведены некоторые ограничения семантической сегментации.

  • Для использования семантической сегментации необходимо использовать пакет SDK службы "Речь" версии 1.41 или более поздней.
  • Семантическая сегментация предназначена только для использования в непрерывном распознавании. К ним относятся такие сценарии, как диктовка и субтитры. Его не следует использовать в одном режиме распознавания или интерактивных сценариях.
  • Семантическая сегментация недоступна для всех языков и локалей.
  • Семантическая сегментация пока не поддерживает оценки достоверности и списки NBest. Мы не рекомендуем семантическую сегментацию, если вы используете оценку достоверности или списки NBest.

Справочная документация | Пакет (npm) | Дополнительные примеры на GitHub | Исходный код библиотеки

В этом руководстве вы узнаете, как использовать речь искусственного интеллекта Azure для преобразования речи в режиме реального времени в текст. Распознавание речи в режиме реального времени идеально подходит для приложений, требующих немедленного транскрибирования, таких как диктовка, помощь в центре вызовов и субтитры для динамических собраний.

Чтобы узнать, как настроить среду для примерного приложения, см. Краткое руководство: Распознавание и преобразование речи в текст.

Создать экземпляр конфигурации речи

Чтобы вызвать службу распознавания речи с помощью пакета Speech SDK, необходимо создать экземпляр SpeechConfig. Этот класс содержит сведения о вашей подписке, такие как ключ и связанный регион, конечная точка, узел или маркер авторизации.

  1. Создайте ресурс ИИ для "Речи" в портале Azure. Получите ключ службы "Речь" и регион.
  2. SpeechConfig Создайте экземпляр с помощью следующего кода. Замените и замените YourSpeechKey ключ ресурса службы "Речь" и YourSpeechRegion регион.
const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");

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

  • Используйте конечную точку и передайте конечную точку службы речевого распознавания. Ключ или маркер авторизации являются необязательными.
  • Используйте хост и введите его адрес. Ключ или маркер авторизации являются необязательными.
  • Используйте маркер авторизации с соответствующим регионом или расположением.

Примечание.

Независимо от того, выполняется ли распознавание речи, синтез речи, перевод или распознавание намерений, всегда создается конфигурация.

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

Распознавание речи с микрофона не поддерживается в Node.js. Эта функция поддерживается только в среде JavaScript на основе браузера. Дополнительные сведения см. в примере React и реализации речи с микрофона на GitHub. В примере React показаны конструктивные шаблоны для обмена и управления маркерами проверки подлинности, В нем также показана запись звука с микрофона или файла для преобразования речи в текст.

Примечание.

Если необходимо использовать конкретное входное аудиоустройство, необходимо указать код устройства в AudioConfig. Чтобы узнать, как получить идентификатор устройства, см. раздел "Выбор устройства ввода звука с помощью Speech SDK".

Распознайте речь из файла

Чтобы распознать речь из звукового файла, создайте AudioConfig экземпляр с помощью fromWavFileInput() метода, который принимает Buffer объект. Затем инициализируйте SpeechRecognizer, передав audioConfig и speechConfig.

const fs = require('fs');
const sdk = require("microsoft-cognitiveservices-speech-sdk");
const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");

function fromFile() {
    let audioConfig = sdk.AudioConfig.fromWavFileInput(fs.readFileSync("YourAudioFile.wav"));
    let speechRecognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);

    speechRecognizer.recognizeOnceAsync(result => {
        console.log(`RECOGNIZED: Text=${result.text}`);
        speechRecognizer.close();
    });
}
fromFile();

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

Во многих случаях ваши звуковые данные, скорее всего, поступают из хранилища BLOB-объектов Azure. Или он уже находится в памяти, как ArrayBuffer или аналогичная структура необработанных данных. Следующий код:

  • Создается поток передачи данных методом push с помощью createPushStream().
  • Считывает файл .wav с помощью fs.createReadStream для демонстрации. Если у вас уже есть звуковые данные в ArrayBuffer, можно перейти непосредственно к записи содержимого во входной поток.
  • Создается аудио-конфигурация с использованием потока push.
const fs = require('fs');
const sdk = require("microsoft-cognitiveservices-speech-sdk");
const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");

function fromStream() {
    let pushStream = sdk.AudioInputStream.createPushStream();

    fs.createReadStream("YourAudioFile.wav").on('data', function(arrayBuffer) {
        pushStream.write(arrayBuffer.slice());
    }).on('end', function() {
        pushStream.close();
    });
 
    let audioConfig = sdk.AudioConfig.fromStreamInput(pushStream);
    let speechRecognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);
    speechRecognizer.recognizeOnceAsync(result => {
        console.log(`RECOGNIZED: Text=${result.text}`);
        speechRecognizer.close();
    });
}
fromStream();

При использовании потока push-передачи в качестве входных данных предполагается, что звуковые данные являются необработанными данными импульсно-кодовой модуляции (PCM) без заголовков. API по-прежнему работает в некоторых случаях, если заголовок не пропущен. Для получения наилучших результатов рекомендуется реализовать логику для считывания заголовков, чтобы fs начинался с начала звуковых данных.

Обработка ошибок

В предыдущих примерах из свойства result.text получается только распознанный текст. но, чтобы обработать ошибки и другие ответы, необходимо написать код для обработки результата. Следующий код вычисляет свойство result.reason и:

  • Выводит результат распознавания: ResultReason.RecognizedSpeech.
  • Если совпадение при распознавании отсутствует, он сообщает пользователю: ResultReason.NoMatch.
  • Если возникла ошибка, выводится сообщение об ошибке: ResultReason.Canceled
switch (result.reason) {
    case sdk.ResultReason.RecognizedSpeech:
        console.log(`RECOGNIZED: Text=${result.text}`);
        break;
    case sdk.ResultReason.NoMatch:
        console.log("NOMATCH: Speech could not be recognized.");
        break;
    case sdk.ResultReason.Canceled:
        const cancellation = sdk.CancellationDetails.fromResult(result);
        console.log(`CANCELED: Reason=${cancellation.reason}`);

        if (cancellation.reason == sdk.CancellationReason.Error) {
            console.log(`CANCELED: ErrorCode=${cancellation.ErrorCode}`);
            console.log(`CANCELED: ErrorDetails=${cancellation.errorDetails}`);
            console.log("CANCELED: Did you set the speech resource key and region values?");
        }
        break;
    }

Использование непрерывного распознавания

В предыдущих примерах используется одноразовое распознавание, которое распознает один речевой фрагмент. Конец одного речевого фрагмента определяется путем прослушивания до тишины в конце, или пока не будет обработано максимум 15 секунд аудио.

В отличие от этого, вы можете использовать непрерывное распознавание, когда хотите контролировать, когда остановить распознавание. Для получения результатов распознавания необходимо подписаться на события Recognizing, Recognizedи Canceled. Чтобы остановить распознавание, необходимо вызвать [stopContinuousRecognitionAsync] (/javascript/api/microsoft-cognitiveservices-speech-sdk/speechrecognizer#microsoft-cognitiveservices-speech-sdk-speechrecognizer-stopcontinuousrecognitionasync). Ниже приведен пример того, как выполняется непрерывное распознавание входного аудиофайла.

Начните с определения входных данных и инициализации SpeechRecognizer:

const speechRecognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);

Теперь подпишитесь на события, отправленные из SpeechRecognizer:

  • recognizing: сигнал для событий, содержащих промежуточные результаты распознавания.
  • recognized: сигнал для событий, содержащих окончательные результаты распознавания (указывает на успешность попытки распознавания).
  • sessionStopped: сигнал для событий, указывающих на окончание сеанса (операции) распознавания.
  • canceled: сигнал для событий, содержащих отмененные результаты распознавания. Эти результаты указывают на попытку распознавания, которая была отменена в результате прямого запроса на отмену. Они также могут указывать на сбой транспорта или протокола.
speechRecognizer.recognizing = (s, e) => {
    console.log(`RECOGNIZING: Text=${e.result.text}`);
};

speechRecognizer.recognized = (s, e) => {
    if (e.result.reason == sdk.ResultReason.RecognizedSpeech) {
        console.log(`RECOGNIZED: Text=${e.result.text}`);
    }
    else if (e.result.reason == sdk.ResultReason.NoMatch) {
        console.log("NOMATCH: Speech could not be recognized.");
    }
};

speechRecognizer.canceled = (s, e) => {
    console.log(`CANCELED: Reason=${e.reason}`);

    if (e.reason == sdk.CancellationReason.Error) {
        console.log(`"CANCELED: ErrorCode=${e.errorCode}`);
        console.log(`"CANCELED: ErrorDetails=${e.errorDetails}`);
        console.log("CANCELED: Did you set the speech resource key and region values?");
    }

    speechRecognizer.stopContinuousRecognitionAsync();
};

speechRecognizer.sessionStopped = (s, e) => {
    console.log("\n    Session stopped event.");
    speechRecognizer.stopContinuousRecognitionAsync();
};

Когда все настроено, вызовите [startContinuousRecognitionAsync] (/javascript/api/microsoft-cognitiveservices-speech-sdk/speechrecognizer#microsoft-cognitiveservices-speech-sdk-speechrecognizer-startkeywordrecognitionasync), чтобы начать распознавание:

speechRecognizer.startContinuousRecognitionAsync();

// Make the following call at some point to stop recognition:
// speechRecognizer.stopContinuousRecognitionAsync();

Изменение исходного языка

Распространенной задачей распознавания речи является указание языка ввода (или исходного языка). В следующем примере показано, как изменить язык ввода на итальянский. В своем коде найдите экземпляр SpeechConfig, а затем добавьте непосредственно под ним следующую строку:

speechConfig.speechRecognitionLanguage = "it-IT";

Свойство speechRecognitionLanguage принимает строку формата языка и регионального стандарта. Для списка поддерживаемых языков и регионов см. в разделе "Поддержка языков и голосов для службы речевого сервиса".

Идентификация языка

Вы можете использовать идентификацию языка с речью для распознавания текста, если необходимо определить язык в источнике звука, а затем переписать его в текст.

Полный пример кода см. в разделе "Идентификация языка".

Использование пользовательской конечной точки

С помощью пользовательской речи можно отправлять собственные данные, тестировать и обучать пользовательскую модель, сравнивать точность между моделями и развертывать модель в настраиваемую конечную точку. В следующем примере показано, как настроить пользовательскую конечную точку.

var speechConfig = SpeechSDK.SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
speechConfig.endpointId = "YourEndpointId";
var speechRecognizer = new SpeechSDK.SpeechRecognizer(speechConfig);

Запуск и использование контейнера

Контейнеры службы "Речь" предоставляют API конечных точек запросов на основе websocket, к которым обращается пакет SDK службы "Речь" и CLI службы "Речь". По умолчанию пакет SDK службы "Речь" и cli службы "Речь" используют общедоступную службу "Речь". Чтобы использовать контейнер, вам необходимо изменить метод инициализации. Используйте URL-адрес узла контейнера вместо ключа и региона.

Дополнительные сведения о контейнерах см. в разделе URL-адреса узлов в разделе "Установка и запуск контейнеров службы "Речь" с помощью Docker.

Справочный пакет документации | (скачивание) | Дополнительные примеры на GitHub

В этом руководстве вы узнаете, как использовать речь искусственного интеллекта Azure для преобразования речи в режиме реального времени в текст. Распознавание речи в режиме реального времени идеально подходит для приложений, требующих немедленного транскрибирования, таких как диктовка, помощь в центре вызовов и субтитры для динамических собраний.

См. Краткое руководство по распознаванию и преобразованию речи в текст для получения сведений о настройке среды для примера приложения.

Установка пакета SDK и примеров для службы "Речь"

Репозиторий Azure-Samples/cognitive-services-speech-sdk включает примеры, написанные на Objective-C для iOS и Mac. Щелкните ссылку, чтобы просмотреть инструкции по установке для каждого примера:

Дополнительные сведения см. в разделе справки по Speech SDK для Objective-C.

Использование пользовательской конечной точки

С помощью пользовательской речи можно отправлять собственные данные, тестировать и обучать пользовательскую модель, сравнивать точность между моделями и развертывать модель в настраиваемую конечную точку. В следующем примере показано, как задать пользовательскую конечную точку:

SPXSpeechConfiguration *speechConfig = [[SPXSpeechConfiguration alloc] initWithSubscription:"YourSubscriptionKey" region:"YourServiceRegion"];
speechConfig.endpointId = "YourEndpointId";
SPXSpeechRecognizer* speechRecognizer = [[SPXSpeechRecognizer alloc] init:speechConfig];

Запуск и использование контейнера

Контейнеры службы "Речь" предоставляют API конечных точек запросов на основе websocket, к которым обращается пакет SDK службы "Речь" и CLI службы "Речь". По умолчанию пакет SDK службы "Речь" и CLI службы "Речь" используют публичную службу распознавания речи. Чтобы использовать контейнер, вам необходимо изменить метод инициализации. Используйте URL-адрес узла контейнера вместо ключа и региона.

Дополнительные сведения о контейнерах см. в разделе URL-адреса узлов в разделе "Установка и запуск контейнеров службы "Речь" с помощью Docker.

Справочный пакет документации | (скачивание) | Дополнительные примеры на GitHub

В этом руководстве вы узнаете, как использовать речь искусственного интеллекта Azure для преобразования речи в режиме реального времени в текст. Распознавание речи в режиме реального времени идеально подходит для приложений, требующих немедленного транскрибирования, таких как диктовка, помощь в центре вызовов и субтитры для динамических собраний.

Чтобы узнать, как настроить среду для примера приложения, см. Краткое руководство: Распознавание и преобразование речи в текст.

Установка Speech SDK и примеров

Репозиторий Azure-Samples/cognitive-services-speech-sdk включает примеры, написанные на Swift для iOS и Mac. Щелкните ссылку, чтобы просмотреть инструкции по установке для каждого примера:

Дополнительные сведения см. в справочнике по Speech SDK для Objective-C.

Используйте пользовательскую конечную точку

С помощью пользовательской речи можно отправлять собственные данные, тестировать и обучать пользовательскую модель, сравнивать точность между моделями и развертывать модель в настраиваемую конечную точку. В следующем примере показано, как задать пользовательскую конечную точку:

let speechConfig = SPXSpeechConfiguration(subscription: "YourSubscriptionKey", region: "YourServiceRegion");
speechConfig.endpointId = "YourEndpointId";
let speechRecognizer = SPXSpeechRecognizer(speechConfiguration: speechConfig);

Запуск и использование контейнера

Контейнеры для распознавания речи предоставляют API конечных точек запросов на основе WebSocket, которые доступны через Speech SDK и Speech CLI. По умолчанию, Speech SDK и Speech CLI используют общедоступную службу "Речь". Чтобы использовать контейнер, вам необходимо изменить метод инициализации. Используйте URL-адрес узла контейнера вместо ключа и региона.

Дополнительные сведения о контейнерах см. в разделе URL-адреса узлов в разделе "Установка и запуск контейнеров службы "Речь" с помощью Docker.

Справочные примеры пакета документации | (PyPi) | Дополнительные примеры на GitHub

В этом руководстве вы узнаете, как использовать речь искусственного интеллекта Azure для преобразования речи в режиме реального времени в текст. Распознавание речи в режиме реального времени идеально подходит для приложений, требующих немедленного транскрибирования, таких как диктовка, помощь в центре вызовов и субтитры для динамических собраний.

Чтобы узнать, как настроить среду для образца приложения, см. Краткое руководство: распознавание и преобразование речи в текст.

Создать экземпляр конфигурации речи

Чтобы вызвать службу "Речь" с помощью пакета SDK, необходимо создать экземпляр SpeechConfig. Этот класс содержит сведения о подписке, например ключ речи и связанный регион, конечную точку, узел или маркер авторизации.

  1. Создайте ресурс сервисов ИИ для "Речь" в портале Azure. Получите ключ ресурса "Речь" и регион.
  2. SpeechConfig Создайте экземпляр с помощью следующего кода. Замените YourSpeechKey на ключ ресурса службы "Речь" и YourSpeechRegion на регион.
speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", region="YourSpeechRegion")

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

  • Используйте конечную точку и укажите конечную точку сервиса "Речь". Ключ 'Речь' или токен авторизации являются необязательными.
  • Используйте узел и укажите адрес узла. Ключ или токен авторизации для речи являются необязательными.
  • Используйте маркер авторизации с соответствующим регионом или расположением.

Примечание.

Независимо от того, выполняется ли распознавание речи, синтез речи, перевод или распознавание намерений, всегда создается конфигурация.

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

Чтобы распознать речь с микрофона устройства, создайте экземпляр SpeechRecognizer, не передавая AudioConfig, а затем передайте speech_config:

import azure.cognitiveservices.speech as speechsdk

def from_mic():
    speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", region="YourSpeechRegion")
    speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config)

    print("Speak into your microphone.")
    speech_recognition_result = speech_recognizer.recognize_once_async().get()
    print(speech_recognition_result.text)

from_mic()

Если необходимо использовать конкретное входное аудиоустройство, необходимо указать код устройства в AudioConfig и передать его в параметр SpeechRecognizer конструктора audio_config. Сведения о том, как получить идентификатор устройства, см. в разделе Выберите звуковое устройство ввода с помощью Speech SDK.

Распознайте речь из файла

Чтобы распознавать речь из аудиофайла, а не с помощью микрофона, создайте экземпляр AudioConfig и используйте параметр filename:

import azure.cognitiveservices.speech as speechsdk

def from_file():
    speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", region="YourSpeechRegion")
    audio_config = speechsdk.AudioConfig(filename="your_file_name.wav")
    speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)

    speech_recognition_result = speech_recognizer.recognize_once_async().get()
    print(speech_recognition_result.text)

from_file()

Обработка ошибок

В предыдущих примерах распознанный текст получают из свойства speech_recognition_result.text. но, чтобы обработать ошибки и другие ответы, необходимо написать код для обработки результата. Следующий код вычисляет свойство speech_recognition_result.reason и:

  • Выводит результат распознавания: speechsdk.ResultReason.RecognizedSpeech.
  • Если совпадения для распознавания нет, система сообщает пользователю: speechsdk.ResultReason.NoMatch
  • Если возникла ошибка, выводится сообщение об ошибке: speechsdk.ResultReason.Canceled
if speech_recognition_result.reason == speechsdk.ResultReason.RecognizedSpeech:
    print("Recognized: {}".format(speech_recognition_result.text))
elif speech_recognition_result.reason == speechsdk.ResultReason.NoMatch:
    print("No speech could be recognized: {}".format(speech_recognition_result.no_match_details))
elif speech_recognition_result.reason == speechsdk.ResultReason.Canceled:
    cancellation_details = speech_recognition_result.cancellation_details
    print("Speech Recognition canceled: {}".format(cancellation_details.reason))
    if cancellation_details.reason == speechsdk.CancellationReason.Error:
        print("Error details: {}".format(cancellation_details.error_details))
        print("Did you set the speech resource key and region values?")

Использование непрерывного распознавания

В предыдущих примерах используется одноразовое распознавание, которое распознает один речевой фрагмент. Конец одного речевого фрагмента определяется либо путем выслушивания паузы в конце, либо когда обрабатывается максимальное количество 15 секунд аудио.

В отличие от других подходов, непрерывное распознавание используется, когда вы хотите контролировать момент остановки распознавания. Для получения результатов распознавания необходимо подключиться к EventSignal. Чтобы остановить распознавание, необходимо вызвать stop_continuous_recognition() или stop_continuous_recognition_async(). Ниже приведен пример того, как выполняется непрерывное распознавание входного аудиофайла.

Начните с определения входных данных и инициализации SpeechRecognizer:

audio_config = speechsdk.audio.AudioConfig(filename=weatherfilename)
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)

Теперь создайте переменную для управления состоянием распознавания речи. Задайте для переменной False значение, так как в начале распознавания можно безопасно предположить, что она не завершена:

done = False

Теперь создайте обратный вызов, чтобы предотвратить непрерывное распознавание при получении evt. Помните следующее:

  • При получении evt выводится сообщение evt.
  • После получения evt для отмены распознавания вызывается stop_continuous_recognition ().
  • Состояние распознавания изменится на True.
def stop_cb(evt):
    print('CLOSING on {}'.format(evt))
    speech_recognizer.stop_continuous_recognition()
    global done
    done = True

В этом примере кода показано, как соединять обратные вызовы с событиями, отправленными из SpeechRecognizer. События включают:

  • recognizing: сигнал для событий, содержащих промежуточные результаты распознавания.
  • recognized: сигнал для событий, содержащих окончательные результаты распознавания (указывает на успешность попытки распознавания).
  • session_started: сигнал для событий, указывающих на начало сеанса (операции) распознавания.
  • session_stopped: сигнал для событий, указывающих на окончание сеанса (операции) распознавания.
  • canceled: сигнал для событий, содержащих отмененные результаты распознавания. Эти результаты указывают на попытку распознавания, которая была отменена в результате прямого запроса на отмену. Они также могут указывать на сбой транспорта или протокола.
speech_recognizer.recognizing.connect(lambda evt: print('RECOGNIZING: {}'.format(evt)))
speech_recognizer.recognized.connect(lambda evt: print('RECOGNIZED: {}'.format(evt)))
speech_recognizer.session_started.connect(lambda evt: print('SESSION STARTED: {}'.format(evt)))
speech_recognizer.session_stopped.connect(lambda evt: print('SESSION STOPPED {}'.format(evt)))
speech_recognizer.canceled.connect(lambda evt: print('CANCELED {}'.format(evt)))

speech_recognizer.session_stopped.connect(stop_cb)
speech_recognizer.canceled.connect(stop_cb)

Если все настроено, можно вызвать start_continuous_recognition ().

speech_recognizer.start_continuous_recognition()
while not done:
    time.sleep(.5)

Изменение исходного языка

Распространенной задачей распознавания речи является указание языка ввода (или исходного языка). В следующем примере показано, как изменить язык ввода на немецкий. В своем коде найдите экземпляр SpeechConfig, а затем добавьте непосредственно под ним следующую строку:

speech_config.speech_recognition_language="de-DE"

speech_recognition_language — это параметр, принимающий строку в качестве аргумента. Список поддерживаемых языковых стандартов см. в разделе "Язык" и "Голосовая поддержка" службы "Речь".

Идентификация языка

Вы можете использовать идентификацию языка вместе с распознаванием речи, когда необходимо определить язык в аудиоисточнике и затем преобразовать его в текст.

Полный пример кода см. в разделе "Идентификация языка".

Используйте пользовательскую конечную точку

С помощью пользовательской речи можно отправлять собственные данные, тестировать и обучать пользовательскую модель, сравнивать точность между моделями и развертывать модель в настраиваемую конечную точку. В следующем примере показано, как настроить пользовательскую конечную точку.

speech_config = speechsdk.SpeechConfig(subscription="YourSubscriptionKey", region="YourServiceRegion")
speech_config.endpoint_id = "YourEndpointId"
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config)

Запуск и использование контейнера

Контейнеры службы "Речь" предоставляют API конечных точек запросов на основе websocket, к которым обращается пакет SDK службы "Речь" и CLI службы "Речь". По умолчанию пакет SDK службы "Речь" и cli службы "Речь" используют общедоступную службу "Речь". Чтобы использовать контейнер, вам необходимо изменить метод инициализации. Используйте URL-адрес узла контейнера вместо ключа и региона.

Дополнительные сведения о контейнерах см. в разделе URL-адреса узлов в разделе "Установка и запуск контейнеров службы "Речь" с помощью Docker.

Семантическая сегментация

Семантическая сегментация — это стратегия сегментации распознавания речи, предназначенная для устранения проблем, связанных с сегментацией на основе молчания:

  • Недостаточная сегментация, когда пользователи говорят долго без пауз, они могут видеть длинную последовательность текста без разрывов ("стена текста"), что значительно снижает удобочитаемость текста.
  • Чрезмерное сегментирование: Когда пользователь делает паузу на короткое время, механизм обнаружения пауз может сегментировать неправильно.

Вместо того чтобы полагаться только на таймауты из-за молчания, семантическая сегментация в основном сегментирует и выдает окончательные результаты, когда она обнаруживает знаки препинания (например, '.' или '?'). Это улучшает взаимодействие с пользователем за счет сегментов более высокого качества и семантической завершенности и предотвращает продолжительные промежуточные результаты.

Чтобы использовать семантику сегментации, необходимо задать следующее свойство в экземпляре, используемом SpeechConfig для создания SpeechRecognizer:

speech_config.set_property(speechsdk.PropertyId.Speech_SegmentationStrategy, "Semantic") 

Ниже приведены некоторые ограничения семантической сегментации.

  • Для использования семантической сегментации необходимо использовать пакет SDK службы "Речь" версии 1.41 или более поздней.
  • Семантическая сегментация предназначена только для использования в непрерывном распознавании. К ним относятся такие сценарии, как диктовка и субтитры. Его не следует использовать в одном режиме распознавания или интерактивных сценариях.
  • Семантическая сегментация недоступна для всех языков и локалей.
  • Семантическая сегментация пока не поддерживает оценки достоверности и списки NBest. Таким образом, мы не рекомендуем семантическую сегментацию, если вы используете коэффициенты уверенности или списки NBest.

Справочник по REST API для преобразования речи в текст | REST API для преобразования речи в текст для кратких аудиофайлов | Дополнительные примеры на GitHub

В этом руководстве вы узнаете, как использовать речь искусственного интеллекта Azure для преобразования речи в режиме реального времени в текст. Распознавание речи в режиме реального времени идеально подходит для приложений, требующих немедленного транскрибирования, таких как диктовка, помощь в центре вызовов и субтитры для динамических собраний.

Сведения о настройке среды для образца приложения см Начало работы: распознавание и преобразование речи в текст.

Преобразование речи в текст

В командной строке выполните приведенную ниже команду. Вставьте в команду указанные ниже значения:

  • Ключ подписки для ресурса "Речь"
  • Ваш регион службы распознавания речи
  • Путь для входного звукового файла
curl --location --request POST 'https://INSERT_REGION_HERE.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=en-US' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: audio/wav' \
--data-binary @'INSERT_AUDIO_FILE_PATH_HERE'

Вы должны получить ответ, как показано в следующем примере:

{
    "RecognitionStatus": "Success",
    "DisplayText": "My voice is my passport, verify me.",
    "Offset": 6600000,
    "Duration": 32100000
}

Дополнительные сведения см. в разделе справки Speech to text REST API reference.

В этом руководстве вы узнаете, как использовать речь искусственного интеллекта Azure для преобразования речи в режиме реального времени в текст. Распознавание речи в режиме реального времени идеально подходит для приложений, требующих немедленного транскрибирования, таких как диктовка, помощь в центре вызовов и субтитры для динамических собраний.

Чтобы ознакомиться с настройкой среды для образца приложения, см. Краткое руководство: Распознавание и преобразование речи в текст.

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

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

Итак, все готово для запуска интерфейса командной строки службы "Речь" для распознавания речи с микрофона. В командной строке перейдите в каталог, в котором содержится бинарный файл CLI для Speech. Затем выполните следующую команду.

spx recognize --microphone

Примечание.

По умолчанию интерфейс командной строки службы "Речь" использует английский язык. Вы можете выбрать другой язык от речи к текстовой таблице. Например, для распознавания речи на немецком добавьте --source de-DE.

Поговорите с микрофоном, и вы можете увидеть транскрибирование ваших слов в текст в режиме реального времени. Интерфейс командной строки "Речь" останавливается после периода тишины или при нажатии CTRL+C.

Распознать речь из файла

Речевой интерфейс командной строки может распознать речь во многих форматах файлов и на естественных языках. В этом примере можно использовать любой файл .wav (16 кГц или 8 кГц, 16-разрядный и моно PCM), содержащий речь на английском языке. Или если вы хотите получить краткий пример, скачайте файл whatstheweatherlike.wav и скопируйте его в тот же каталог, что и двоичный файл CLI службы "Речь".

Запустите интерфейс командной строки службы "Речь" для распознавания речи из аудиофайла, выполнив следующую команду:

spx recognize --file whatstheweatherlike.wav

Примечание.

По умолчанию интерфейс командной строки службы "Речь" использует английский язык. Вы можете выбрать другой язык от речи к текстовой таблице. Например, для распознавания речи на немецком добавьте --source de-DE.

В интерфейсе командной строки службы "Речь" транскрипция текста отображается на экране.

Запуск и использование контейнера

Контейнеры службы "Речь" предоставляют API конечных точек запросов на основе websocket, к которым обращается пакет SDK службы "Речь" и CLI службы "Речь". По умолчанию, SDK службы "Речь" и CLI службы "Речь" используют общедоступную службу "Речь". Чтобы использовать контейнер, вам необходимо изменить метод инициализации. Используйте URL-адрес узла контейнера вместо ключа и региона.

Дополнительные сведения о контейнерах см. в разделе URL-адреса узлов в разделе "Установка и запуск контейнеров службы "Речь" с помощью Docker.