Краткое руководство. Распознавание речи с помощью пакета SDK службы "Речь" для .NET Core

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

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

Создание конфигурации службы "Речь"

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

  1. Создайте экземпляр SpeechConfig с помощью ключа и параметра расположения/региона.
  2. Создайте ресурс службы "Речь" на портале Azure. Дополнительные сведения см. в разделе "Создание ресурса с несколькими службами".
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.FromSubscription("YourSpeechKey", "YourSpeechRegion");
    }
}

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

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

Примечание.

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

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

Чтобы распознать речь с помощью микрофона устройства, создайте AudioConfig экземпляр с помощью FromDefaultMicrophoneInput() метода. Затем инициализировать объект путем передачи SpeechRecognizerspeechConfig и 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 result = await speechRecognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={result.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
        await FromMic(speechConfig);
    }
}

Если необходимо использовать конкретное входное аудиоустройство, необходимо указать код устройства в AudioConfig. Узнайте, как получить код устройства для входного аудиоустройства.

по распознаванию речи из файла

Чтобы распознавать речь из звукового файла, а не с микрофона, вам все равно нужно создать экземпляр 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 result = await speechRecognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={result.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
        await FromFile(speechConfig);
    }
}

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

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

  • Записывает необработанные звуковые данные (PCM) в 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 result = await speechRecognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={result.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
        await FromStream(speechConfig);
    }
}

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

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

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

  • Выводит результат распознавания: ResultReason.RecognizedSpeech.
  • Если распознавание не соответствует, он сообщает пользователю: ResultReason.NoMatch
  • Если возникла ошибка, выводится сообщение об ошибке: ResultReason.Canceled
switch (result.Reason)
{
    case ResultReason.RecognizedSpeech:
        Console.WriteLine($"RECOGNIZED: Text={result.Text}");
        break;
    case ResultReason.NoMatch:
        Console.WriteLine($"NOMATCH: Speech could not be recognized.");
        break;
    case ResultReason.Canceled:
        var cancellation = CancellationDetails.FromResult(result);
        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 region 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 region 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.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
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");

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

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

Создание конфигурации службы "Речь"

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

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

auto speechConfig = SpeechConfig::FromSubscription("YourSpeechKey", "YourSpeechRegion");

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

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

Примечание.

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

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

Чтобы распознать речь с помощью микрофона устройства, создайте AudioConfig экземпляр с помощью FromDefaultMicrophoneInput() функции-члена. Затем инициализировать объект путем передачиSpeechRecognizeraudioConfig и 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 службы "Речь"

по распознаванию речи из файла

Чтобы распознавать речь из аудиофайла, а не с помощью микрофона, вам все равно нужно создать экземпляр 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 region 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 region 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.
    });

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

// 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::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
speechConfig->SetEndpointId("YourEndpointId");
auto speechRecognizer = SpeechRecognizer::FromConfig(speechConfig);

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

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

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

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

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

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

Используйте следующий пример кода для запуска распознавания речи с микрофона устройства по умолчанию. Замените переменные subscription и region своим ключом службы "Речь" и данными о расположении или регионе соответственно. Создайте ресурс службы "Речь" на портале Azure. Дополнительные сведения см. в разделе "Создание ресурса с несколькими службами". Запуск скрипта запускает сеанс распознавания на микрофоне по умолчанию и выходном тексте:

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.

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

Используйте следующий пример, чтобы запустить распознавание речи из звукового файла. Замените переменные subscription и region своим ключом службы "Речь" и данными о расположении или регионе соответственно. Создайте ресурс службы "Речь" на портале Azure. Дополнительные сведения см. в разделе "Создание ресурса с несколькими службами". Кроме того, замените переменную 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

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

Создание конфигурации службы "Речь"

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

  1. Создайте экземпляр SpeechConfig с помощью ключа и параметра расположения/региона.
  2. Создайте ресурс службы "Речь" на портале Azure. Дополнительные сведения см. в разделе "Создание ресурса с несколькими службами".
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-subscription-key>", "<paste-your-region>");
    }
}

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

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

Примечание.

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

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

Чтобы распознать речь с помощью микрофона устройства, создайте AudioConfig экземпляр с помощью fromDefaultMicrophoneInput() метода. Затем инициализировать объект путем передачи SpeechRecognizeraudioConfig и 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-subscription-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 result = task.get();
        System.out.println("RECOGNIZED: Text=" + result.getText());
    }
}

Если необходимо использовать конкретное входное аудиоустройство, необходимо указать код устройства в AudioConfig. Дополнительные сведения о том, как получить идентификатор устройства для устройства ввода звука, см. в разделе "Выбор устройства ввода звука" с помощью пакета 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-subscription-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 result = task.get();
        System.out.println("RECOGNIZED: Text=" + result.getText());
    }
}

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

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

  • Выводит результат распознавания: ResultReason.RecognizedSpeech.
  • Если распознавание не соответствует, он сообщает пользователю: ResultReason.NoMatch
  • Если возникла ошибка, выводится сообщение об ошибке: ResultReason.Canceled
switch (result.getReason()) {
    case ResultReason.RecognizedSpeech:
        System.out.println("We recognized: " + result.getText());
        exitCode = 0;
        break;
    case ResultReason.NoMatch:
        System.out.println("NOMATCH: Speech could not be recognized.");
        break;
    case ResultReason.Canceled: {
            CancellationDetails cancellation = CancellationDetails.fromResult(result);
            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("YourSubscriptionKey", "YourServiceRegion");
speechConfig.setEndpointId("YourEndpointId");
SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig);

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

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

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

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

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

Создание конфигурации службы "Речь"

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

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

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

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

Примечание.

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

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

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

Примечание.

Если вы хотите использовать определенное звуковое устройство ввода, необходимо указать идентификатор устройства в объектеAudioConfig. Дополнительные сведения см. в разделе "Выбор звукового устройства ввода" с помощью пакета 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. Ниже приведен пример того, как выполняется непрерывное распознавание входного аудиофайла.

Начните с определения входных данных и инициализации 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, чтобы начать распознавание:

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

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

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

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

Дополнительные сведения см. в справке по пакету 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

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

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

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

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

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

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

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

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

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

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

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

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

Создание конфигурации службы "Речь"

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

  1. Создайте экземпляр SpeechConfig с помощью ключа речи и параметра расположения/региона.
  2. Создайте ресурс службы "Речь" на портале Azure. Дополнительные сведения см. в разделе "Создание ресурса с несколькими службами".
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.")
    result = speech_recognizer.recognize_once_async().get()
    print(result.text)

from_mic()

Если необходимо использовать конкретное входное аудиоустройство, необходимо указать код устройства в AudioConfig и передать его в параметр audio_config конструктора SpeechRecognizer. Дополнительные сведения о том, как получить идентификатор устройства для устройства ввода звука, см. в разделе "Выбор устройства ввода звука" с помощью пакета 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)

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

from_file()

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

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

  • Выводит результат распознавания: speechsdk.ResultReason.RecognizedSpeech.
  • Если распознавание не соответствует, он сообщает пользователю: speechsdk.ResultReason.NoMatch
  • Если возникла ошибка, выводится сообщение об ошибке: speechsdk.ResultReason.Canceled
if result.reason == speechsdk.ResultReason.RecognizedSpeech:
    print("Recognized: {}".format(result.text))
elif result.reason == speechsdk.ResultReason.NoMatch:
    print("No speech could be recognized: {}".format(result.no_match_details))
elif result.reason == speechsdk.ResultReason.Canceled:
    cancellation_details = 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(). Ниже приведен пример того, как выполняется непрерывное распознавание входного аудиофайла.

Начните с определения входных данных и инициализации 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()
    nonlocal 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.

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

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

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

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

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

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

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

Дополнительные сведения см. в справочнике по REST API преобразования речи в текст.

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

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

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

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

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.

Следующие шаги