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


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

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

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

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

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

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

  1. Создайте ресурс Ai Foundry для службы "Речь" на портале Azure. Получите ключ ресурса службы "Речь" и конечную точку.
  2. SpeechConfig Создайте экземпляр с помощью следующего кода. Замените и YourSpeechKey на YourSpeechEndpoint ключ ресурса службы "Речь" и конечную точку.
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. Создайте ресурс Ai Foundry для службы "Речь" на портале Azure. Получите ключ ресурса службы "Речь" и конечную точку.
  2. SpeechConfig Создайте экземпляр с помощью следующего кода. Замените и YourSpeechKey на YourSpeechEndpoint ключ ресурса службы "Речь" и конечную точку.
using namespace std;
using namespace Microsoft::CognitiveServices::Speech;

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

Инициализировать 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. Чтобы узнать, как получить идентификатор устройства, см. Выбор звукового устройства ввода с помощью SDK службы Speech.

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

Чтобы распознавать речь из аудиофайла, а не с помощью микрофона, вам все равно нужно создать экземпляр 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", "YourSpeechResoureKey");
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. Создайте ресурс Ai Foundry для службы "Речь" на портале 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. Создайте ресурс Ai Foundry для службы "Речь" на портале Azure. Получите ключ ресурса для распознавания речи и регион.
  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. Чтобы узнать, как получить идентификатор устройства, см. Выбор звукового устройства ввода с помощью SDK службы Speech.

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

Чтобы распознавать речь из аудиофайла, а не с помощью микрофона, вам все равно нужно создать экземпляр 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, к которым обращается пакет SDK службы "Речь" и CLI службы "Речь". По умолчанию SDK и CLI службы "Речь" используют общедоступную службу "Речь". Чтобы использовать контейнер, вам необходимо изменить метод инициализации. Используйте URL-адрес узла контейнера вместо ключа и региона.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примечание.

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

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

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

Примечание.

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

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

Чтобы распознать речь из звукового файла, создайте 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("YourSpeechResoureKey", "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:"YourSpeechResoureKey" region:"YourServiceRegion"];
speechConfig.endpointId = "YourEndpointId";
SPXSpeechRecognizer* speechRecognizer = [[SPXSpeechRecognizer alloc] init:speechConfig];

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Создайте ресурс Ai Foundry для службы "Речь" на портале 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. Чтобы узнать, как получить идентификатор устройства, см. Выбор звукового устройства ввода с помощью SDK службы Speech.

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

Чтобы распознавать речь из аудиофайла, а не с помощью микрофона, создайте экземпляр 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="YourSpeechResoureKey", 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 для преобразования речи в режиме реального времени в текст. Распознавание речи в режиме реального времени идеально подходит для приложений, требующих немедленного транскрибирования, таких как диктовка, помощь в центре вызовов и субтитры для динамических собраний.

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

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

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

  • Ваш ключ API для ресурса "Речь"
  • Ваш регион службы распознавания речи
  • Путь для входного звукового файла
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.