Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Справочная документация | Пакет (NuGet) | Дополнительные примеры на GitHub
В этом кратком руководстве вы запустите приложение для преобразования речи в текст с диаризацией в режиме реального времени. Диаризация различает разных говорящих, участвующих в беседе. Служба распознавания речи предоставляет сведения о том, какой докладчик говорил определенную часть транскрибированной речи.
Сведения о говорящем включаются в результат в поле идентификатора говорящего. Идентификатор говорящего — это обобщенный идентификатор, назначенный каждому участнику беседы системой во время распознавания, так как различные говорящие определяются на основании предоставленного аудио.
Совет
Вы можете попробовать речь в режиме реального времени на текст в Speech Studio без регистрации или написания кода. Тем не менее, Speech Studio пока не поддерживает диаризацию.
Предварительные условия
- Подписка Azure. Вы можете создать бесплатную учетную запись.
- Создайте ресурс службы искусственного интеллекта (ИИ) для речевого интерфейса в портале Azure.
- Получите ключ и регион ресурса службы распознавания речи. После развертывания ресурса службы "Речь" выберите Перейти к ресурсу, чтобы просмотреть ключи и управлять ими.
Настройка среды
Пакет SDK для службы "Речь" доступен в виде пакета NuGet и реализует .NET Standard 2.0. Вы устанавливаете пакет Speech SDK далее в этом руководстве, но сначала ознакомьтесь с руководством по установке SDK на предмет дополнительных требований.
Настройка переменных среды
Для доступа к службам ИИ Azure необходимо пройти проверку подлинности приложения. В этой статье показано, как использовать переменные среды для хранения учетных данных. Затем вы можете получить доступ к переменным среды из кода для проверки подлинности приложения. Для рабочей среды используйте более безопасный способ хранения и доступа к учетным данным.
Внимание
Мы рекомендуем использовать аутентификацию с помощью Microsoft Entra ID с управляемыми удостоверениями для ресурсов Azure, чтобы не хранить учетные данные вместе с вашими приложениями, работающими в облаке.
Используйте ключи API с осторожностью. Не включайте ключ API непосредственно в код и никогда не публикуйте его. При использовании ключей API безопасно храните их в Azure Key Vault, регулярно поворачивайте ключи и ограничьте доступ к Azure Key Vault с помощью управления доступом на основе ролей и ограничений доступа к сети. Дополнительные сведения об использовании ключей API безопасно в приложениях см. в разделе "Ключи API" с помощью Azure Key Vault.
Дополнительные сведения о безопасности служб ИИ см. в статье "Проверка подлинности запросов к службам ИИ Azure".
Чтобы задать переменные среды для ключа ресурса службы "Речь" и региона, откройте окно консоли и следуйте инструкциям для вашей операционной системы и среды разработки.
- Чтобы задать
SPEECH_KEY
переменную среды, замените ваш-ключ одним из ключей вашего ресурса. - Чтобы задать
SPEECH_REGION
переменную среды, замените your-region одним из регионов для ресурса.
setx SPEECH_KEY your-key
setx SPEECH_REGION your-region
Примечание.
Если вам нужно получить доступ только к переменным среды в текущей консоли, можно задать переменную set
среды вместо setx
.
После добавления переменных среды может потребоваться перезапустить все программы, которые должны считывать переменные среды, включая окно консоли. Например, если вы используете Visual Studio в качестве редактора, перезапустите Visual Studio перед запуском примера.
Реализация диаризации из файла с транскрибированием беседы
Выполните следующие действия, чтобы создать консольное приложение и установить Speech SDK.
Откройте окно командной строки в папке, в которой требуется создать проект. Выполните эту команду, чтобы создать консольное приложение с помощью .NET CLI.
dotnet new console
Эта команда создает файл Program.cs в каталоге проекта.
Установите Speech SDK в новом проекте с помощью .NET CLI.
dotnet add package Microsoft.CognitiveServices.Speech
Замените все содержимое
Program.cs
следующим кодом:using Microsoft.CognitiveServices.Speech; using Microsoft.CognitiveServices.Speech.Audio; using Microsoft.CognitiveServices.Speech.Transcription; class Program { // This example requires environment variables named "SPEECH_KEY" and "SPEECH_REGION" static string speechKey = Environment.GetEnvironmentVariable("SPEECH_KEY"); static string speechRegion = Environment.GetEnvironmentVariable("SPEECH_REGION"); async static Task Main(string[] args) { var filepath = "katiesteve.wav"; var speechConfig = SpeechConfig.FromSubscription(speechKey, speechRegion); speechConfig.SpeechRecognitionLanguage = "en-US"; speechConfig.SetProperty(PropertyId.SpeechServiceResponse_DiarizeIntermediateResults, "true"); var stopRecognition = new TaskCompletionSource<int>(TaskCreationOptions.RunContinuationsAsynchronously); // Create an audio stream from a wav file or from the default microphone using (var audioConfig = AudioConfig.FromWavFileInput(filepath)) { // Create a conversation transcriber using audio stream input using (var conversationTranscriber = new ConversationTranscriber(speechConfig, audioConfig)) { conversationTranscriber.Transcribing += (s, e) => { Console.WriteLine($"TRANSCRIBING: Text={e.Result.Text} Speaker ID={e.Result.SpeakerId}"); }; conversationTranscriber.Transcribed += (s, e) => { if (e.Result.Reason == ResultReason.RecognizedSpeech) { Console.WriteLine(); Console.WriteLine($"TRANSCRIBED: Text={e.Result.Text} Speaker ID={e.Result.SpeakerId}"); Console.WriteLine(); } else if (e.Result.Reason == ResultReason.NoMatch) { Console.WriteLine($"NOMATCH: Speech could not be transcribed."); } }; conversationTranscriber.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); } stopRecognition.TrySetResult(0); }; conversationTranscriber.SessionStopped += (s, e) => { Console.WriteLine("\n Session stopped event."); stopRecognition.TrySetResult(0); }; await conversationTranscriber.StartTranscribingAsync(); // Waits for completion. Use Task.WaitAny to keep the task rooted. Task.WaitAny(new[] { stopRecognition.Task }); await conversationTranscriber.StopTranscribingAsync(); } } } }
Получите пример звукового файла или используйте собственный
.wav
файл. Заменитеkatiesteve.wav
на путь и имя вашего файла.wav
.Приложение распознает речь нескольких участников беседы. Звуковой файл должен содержать несколько динамиков.
Чтобы изменить язык распознавания речи, замените
en-US
на другой поддерживаемый язык. Например,es-ES
для испанского (Испания). Если язык не указан, по умолчанию используетсяen-US
. Дополнительные сведения о том, как определить один из нескольких языков, на которых могут говорить, см. в разделе Определение языка.Запустите консольное приложение, чтобы начать транскрибирование бесед:
dotnet run
Внимание
Убедитесь, что заданы переменные SPEECH_KEY
и SPEECH_REGION
среды. Если вы не зададите эти переменные, пример завершится с сообщением об ошибке.
Транскрибированные беседы должны выводиться в виде текста:
TRANSCRIBING: Text=good morning steve Speaker ID=Unknown
TRANSCRIBING: Text=good morning steve how are Speaker ID=Guest-1
TRANSCRIBING: Text=good morning steve how are you doing today Speaker ID=Guest-1
TRANSCRIBED: Text=Good morning, Steve. How are you doing today? Speaker ID=Guest-1
TRANSCRIBING: Text=good morning katie Speaker ID=Unknown
TRANSCRIBING: Text=good morning katie i hope Speaker ID=Guest-2
TRANSCRIBING: Text=good morning katie i hope you're having a great Speaker ID=Guest-2
TRANSCRIBING: Text=good morning katie i hope you're having a great start to Speaker ID=Guest-2
TRANSCRIBING: Text=good morning katie i hope you're having a great start to your day Speaker ID=Guest-2
TRANSCRIBED: Text=Good morning, Katie. I hope you're having a great start to your day. Speaker ID=Guest-2
TRANSCRIBING: Text=have you tried Speaker ID=Unknown
TRANSCRIBING: Text=have you tried the latest Speaker ID=Unknown
TRANSCRIBING: Text=have you tried the latest real time Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in microsoft Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in microsoft speech Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in microsoft speech service Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in microsoft speech service which Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in microsoft speech service which can Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in microsoft speech service which can tell you Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in microsoft speech service which can tell you who said Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in microsoft speech service which can tell you who said what Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in microsoft speech service which can tell you who said what in Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in microsoft speech service which can tell you who said what in real time Speaker ID=Guest-1
TRANSCRIBED: Text=Have you tried the latest real time diarization in Microsoft Speech Service which can tell you who said what in real time? Speaker ID=Guest-1
TRANSCRIBING: Text=not yet Speaker ID=Unknown
TRANSCRIBING: Text=not yet i Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch trans Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization function Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produc Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces di Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature able to Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature able to di Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature able to diarize Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature able to diarize in real Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature able to diarize in real time Speaker ID=Guest-2
TRANSCRIBED: Text=Not yet. I've been using the batch transcription with diarization functionality, but it produces diarization results after the whole audio is processed. Is the new feature able to diarize in real time? Speaker ID=Guest-2
TRANSCRIBING: Text=absolutely Speaker ID=Unknown
TRANSCRIBING: Text=absolutely i Speaker ID=Unknown
TRANSCRIBING: Text=absolutely i recom Speaker ID=Guest-1
TRANSCRIBING: Text=absolutely i recommend Speaker ID=Guest-1
TRANSCRIBING: Text=absolutely i recommend you give it a try Speaker ID=Guest-1
TRANSCRIBED: Text=Absolutely, I recommend you give it a try. Speaker ID=Guest-1
TRANSCRIBING: Text=that's exc Speaker ID=Unknown
TRANSCRIBING: Text=that's exciting Speaker ID=Unknown
TRANSCRIBING: Text=that's exciting let me try Speaker ID=Guest-2
TRANSCRIBING: Text=that's exciting let me try it right now Speaker ID=Guest-2
TRANSCRIBED: Text=That's exciting. Let me try it right now. Speaker ID=Guest-2
Спикеры обозначаются как гость-1, гость-2 и т. д. в зависимости от количества участников в разговоре.
Примечание.
Вы можете увидеть Speaker ID=Unknown
в некоторых из ранних промежуточных результатов, когда динамик еще не определен. Без промежуточных результатов диаризации (если свойству PropertyId.SpeechServiceResponse_DiarizeIntermediateResults
не присвоено значение "true"), идентификатор говорящего всегда будет "Неизвестно".
Очистка ресурсов
Для удаления созданного ресурса Speech можно использовать портал Azure или Azure CLI.
Справочная документация | Пакет (NuGet) | Дополнительные примеры на GitHub
В этом кратком руководстве вы запустите приложение для распознавания речи в текст с диаризацией в режиме реального времени. Диаризация различает различных докладчиков, участвующих в беседе. Речевой сервис предоставляет сведения о том, какой говорящий говорил определенную часть транскрибированной речи.
Сведения о говорящем включаются в результат в поле идентификатора говорящего. Идентификатор говорящего — это универсальный идентификатор, назначаемый каждому участнику беседы службой во время распознавания, когда различные говорящие определяются из предоставленного звукового содержимого.
Совет
Вы можете попробовать речь в режиме реального времени на текст в Speech Studio без регистрации или написания кода. Тем не менее, в Speech Studio пока еще не реализована поддержка диаризации.
Требования
- Подписка Azure. Вы можете создать бесплатную учетную запись.
- Создайте ресурс ИИ-служб для распознавания речи на портале Azure.
- Получите ключ ресурса службы "Речь" и регион. После развертывания ресурса службы "Речь" выберите Перейти к ресурсу для просмотра ключей и управления ими.
Настройка среды
Пакет SDK для службы "Речь" доступен в виде пакета NuGet и реализует .NET Standard 2.0. Вы установите Speech SDK далее в этом руководстве, но сначала проверьте руководство по установке SDK для получения дополнительных требований.
Настройка переменных среды
Для доступа к службам ИИ Azure необходимо пройти проверку подлинности приложения. В этой статье показано, как использовать переменные среды для хранения учетных данных. Затем вы можете получить доступ к переменным среды из кода для проверки подлинности приложения. Для рабочей среды используйте более безопасный способ хранения и доступа к учетным данным.
Внимание
Мы рекомендуем использовать аутентификацию Microsoft Entra ID с управляемыми удостоверениями для ресурсов Azure, чтобы избежать хранения учетных данных с приложениями, работающими в облаке.
Используйте ключи API с осторожностью. Не включайте ключ API непосредственно в код и никогда не публикуйте его. При использовании ключей API безопасно храните их в Azure Key Vault, регулярно поворачивайте ключи и ограничьте доступ к Azure Key Vault с помощью управления доступом на основе ролей и ограничений доступа к сети. Дополнительные сведения об использовании ключей API безопасно в приложениях см. в разделе "Ключи API" с помощью Azure Key Vault.
Дополнительные сведения о безопасности служб ИИ см. в статье "Проверка подлинности запросов к службам ИИ Azure".
Чтобы задать переменные среды для ключа ресурса службы "Речь" и региона, откройте окно консоли и следуйте инструкциям для вашей операционной системы и среды разработки.
- Чтобы задать
SPEECH_KEY
переменную среды, замените ваш-ключ на один из ключей вашего ресурса. - Чтобы задать
SPEECH_REGION
переменную среды, замените ваш-регион одним из регионов для вашего ресурса.
setx SPEECH_KEY your-key
setx SPEECH_REGION your-region
Примечание.
Если вам нужно получить доступ только к переменным среды в текущей консоли, можно задать переменную set
среды вместо setx
.
После добавления переменных среды может потребоваться перезапустить все программы, которые должны считывать переменные среды, включая окно консоли. Например, если вы используете Visual Studio в качестве редактора, перезапустите Visual Studio перед запуском примера.
Реализация диаризации из файла с транскрибированием беседы
Выполните следующие действия, чтобы создать консольное приложение и установить Speech SDK.
Создайте проект консоли C++ в Visual Studio Community 2022 с именем
ConversationTranscription
.Выберите инструменты>диспетчер пакетов Nuget>консоль диспетчера пакетов. В консоли диспетчер пакетов выполните следующую команду:
Install-Package Microsoft.CognitiveServices.Speech
Замените все содержимое
ConversationTranscription.cpp
следующим кодом:#include <iostream> #include <stdlib.h> #include <speechapi_cxx.h> #include <future> using namespace Microsoft::CognitiveServices::Speech; using namespace Microsoft::CognitiveServices::Speech::Audio; using namespace Microsoft::CognitiveServices::Speech::Transcription; std::string GetEnvironmentVariable(const char* name); int main() { // This example requires environment variables named "SPEECH_KEY" and "SPEECH_REGION" auto speechKey = GetEnvironmentVariable("SPEECH_KEY"); auto speechRegion = GetEnvironmentVariable("SPEECH_REGION"); if ((size(speechKey) == 0) || (size(speechRegion) == 0)) { std::cout << "Please set both SPEECH_KEY and SPEECH_REGION environment variables." << std::endl; return -1; } auto speechConfig = SpeechConfig::FromSubscription(speechKey, speechRegion); speechConfig->SetProperty(PropertyId::SpeechServiceResponse_DiarizeIntermediateResults, "true"); speechConfig->SetSpeechRecognitionLanguage("en-US"); auto audioConfig = AudioConfig::FromWavFileInput("katiesteve.wav"); auto conversationTranscriber = ConversationTranscriber::FromConfig(speechConfig, audioConfig); // promise for synchronization of recognition end. std::promise<void> recognitionEnd; // Subscribes to events. conversationTranscriber->Transcribing.Connect([](const ConversationTranscriptionEventArgs& e) { std::cout << "TRANSCRIBING:" << e.Result->Text << std::endl; std::cout << "Speaker ID=" << e.Result->SpeakerId << std::endl; }); conversationTranscriber->Transcribed.Connect([](const ConversationTranscriptionEventArgs& e) { if (e.Result->Reason == ResultReason::RecognizedSpeech) { std::cout << "\n" << "TRANSCRIBED: Text=" << e.Result->Text << std::endl; std::cout << "Speaker ID=" << e.Result->SpeakerId << "\n" << std::endl; } else if (e.Result->Reason == ResultReason::NoMatch) { std::cout << "NOMATCH: Speech could not be transcribed." << std::endl; } }); conversationTranscriber->Canceled.Connect([&recognitionEnd](const ConversationTranscriptionCanceledEventArgs& e) { auto cancellation = CancellationDetails::FromResult(e.Result); std::cout << "CANCELED: Reason=" << (int)cancellation->Reason << std::endl; if (cancellation->Reason == CancellationReason::Error) { std::cout << "CANCELED: ErrorCode=" << (int)cancellation->ErrorCode << std::endl; std::cout << "CANCELED: ErrorDetails=" << cancellation->ErrorDetails << std::endl; std::cout << "CANCELED: Did you set the speech resource key and region values?" << std::endl; } else if (cancellation->Reason == CancellationReason::EndOfStream) { std::cout << "CANCELED: Reach the end of the file." << std::endl; } }); conversationTranscriber->SessionStopped.Connect([&recognitionEnd](const SessionEventArgs& e) { std::cout << "Session stopped."; recognitionEnd.set_value(); // Notify to stop recognition. }); conversationTranscriber->StartTranscribingAsync().wait(); // Waits for recognition end. recognitionEnd.get_future().wait(); conversationTranscriber->StopTranscribingAsync().wait(); } std::string GetEnvironmentVariable(const char* name) { #if defined(_MSC_VER) size_t requiredSize = 0; (void)getenv_s(&requiredSize, nullptr, 0, name); if (requiredSize == 0) { return ""; } auto buffer = std::make_unique<char[]>(requiredSize); (void)getenv_s(&requiredSize, buffer.get(), requiredSize, name); return buffer.get(); #else auto value = getenv(name); return value ? value : ""; #endif }
Получите пример звукового файла или используйте собственный
.wav
файл. Заменитеkatiesteve.wav
на путь и имя вашего файла.wav
.Приложение распознает речь нескольких участников беседы. Звуковой файл должен содержать несколько динамиков.
Чтобы изменить язык распознавания речи, замените
en-US
на другой поддерживаемый язык. Например,es-ES
для испанского (Испания). Если язык не указан, по умолчанию используетсяen-US
. Дополнительные сведения о том, как определить один из нескольких языков, на которых могут говорить, см. в разделе Определение языка.Создайте и запустите приложение, чтобы начать транскрибирование бесед:
Внимание
Убедитесь, что заданы переменные
SPEECH_KEY
иSPEECH_REGION
среды. Если вы не зададите эти переменные, пример выдаёт сообщение об ошибке.
Транскрибированные беседы должны выводиться в виде текста:
TRANSCRIBING:good morning
Speaker ID=Unknown
TRANSCRIBING:good morning steve
Speaker ID=Unknown
TRANSCRIBING:good morning steve how are you doing
Speaker ID=Guest-1
TRANSCRIBING:good morning steve how are you doing today
Speaker ID=Guest-1
TRANSCRIBED: Text=Good morning, Steve. How are you doing today?
Speaker ID=Guest-1
TRANSCRIBING:good
Speaker ID=Unknown
TRANSCRIBING:good morning
Speaker ID=Unknown
TRANSCRIBING:good morning kat
Speaker ID=Unknown
TRANSCRIBING:good morning katie i hope you're having a
Speaker ID=Guest-2
TRANSCRIBING:good morning katie i hope you're having a great start to your day
Speaker ID=Guest-2
TRANSCRIBED: Text=Good morning, Katie. I hope you're having a great start to your day.
Speaker ID=Guest-2
TRANSCRIBING:have you
Speaker ID=Unknown
TRANSCRIBING:have you tried
Speaker ID=Unknown
TRANSCRIBING:have you tried the latest
Speaker ID=Unknown
TRANSCRIBING:have you tried the latest real
Speaker ID=Guest-1
TRANSCRIBING:have you tried the latest real time
Speaker ID=Guest-1
TRANSCRIBING:have you tried the latest real time diarization
Speaker ID=Guest-1
TRANSCRIBING:have you tried the latest real time diarization in
Speaker ID=Guest-1
TRANSCRIBING:have you tried the latest real time diarization in microsoft
Speaker ID=Guest-1
TRANSCRIBING:have you tried the latest real time diarization in microsoft speech
Speaker ID=Guest-1
TRANSCRIBING:have you tried the latest real time diarization in microsoft speech service
Speaker ID=Guest-1
TRANSCRIBING:have you tried the latest real time diarization in microsoft speech service which
Speaker ID=Guest-1
TRANSCRIBING:have you tried the latest real time diarization in microsoft speech service which can
Speaker ID=Guest-1
TRANSCRIBING:have you tried the latest real time diarization in microsoft speech service which can tell you
Speaker ID=Guest-1
TRANSCRIBING:have you tried the latest real time diarization in microsoft speech service which can tell you who said
Speaker ID=Guest-1
TRANSCRIBING:have you tried the latest real time diarization in microsoft speech service which can tell you who said what
Speaker ID=Guest-1
TRANSCRIBING:have you tried the latest real time diarization in microsoft speech service which can tell you who said what in
Speaker ID=Guest-1
TRANSCRIBING:have you tried the latest real time diarization in microsoft speech service which can tell you who said what in real time
Speaker ID=Guest-1
TRANSCRIBED: Text=Have you tried the latest real time diarization in Microsoft Speech Service which can tell you who said what in real time?
Speaker ID=Guest-1
TRANSCRIBING:not yet
Speaker ID=Unknown
TRANSCRIBING:not yet i
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch trans
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization function
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization functionality
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization functionality but
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization functionality but it
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization functionality but it produces
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization functionality but it produces di
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization functionality but it produces diarization
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization functionality but it produces diarization results
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization functionality but it produces diarization results after
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature able to
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature able to di
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature able to diarize
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature able to diarize in real
Speaker ID=Guest-2
TRANSCRIBING:not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature able to diarize in real time
Speaker ID=Guest-2
TRANSCRIBED: Text=Not yet. I've been using the batch transcription with diarization functionality, but it produces diarization results after the whole audio is processed. Is the new feature able to diarize in real time?
Speaker ID=Guest-2
TRANSCRIBING:absolutely
Speaker ID=Unknown
TRANSCRIBING:absolutely i
Speaker ID=Unknown
TRANSCRIBING:absolutely i recom
Speaker ID=Guest-1
TRANSCRIBING:absolutely i recommend
Speaker ID=Guest-1
TRANSCRIBING:absolutely i recommend you
Speaker ID=Guest-1
TRANSCRIBING:absolutely i recommend you give it a try
Speaker ID=Guest-1
TRANSCRIBED: Text=Absolutely, I recommend you give it a try.
Speaker ID=Guest-1
TRANSCRIBING:that's exc
Speaker ID=Unknown
TRANSCRIBING:that's exciting
Speaker ID=Unknown
TRANSCRIBING:that's exciting let me
Speaker ID=Guest-2
TRANSCRIBING:that's exciting let me try
Speaker ID=Guest-2
TRANSCRIBING:that's exciting let me try it right now
Speaker ID=Guest-2
TRANSCRIBED: Text=That's exciting. Let me try it right now.
Speaker ID=Guest-2
Участники определяются как Гость-1, Гость-2 и так далее в зависимости от количества участников в разговоре.
Примечание.
Вы можете увидеть Speaker ID=Unknown
в некоторых из ранних промежуточных результатов, когда спикер еще не определен. Без промежуточных результатов диаризации (если вы не установите свойство PropertyId::SpeechServiceResponse_DiarizeIntermediateResults
в "true"), идентификатор говорящего всегда будет "Неизвестно".
Очистка ресурсов
Для удаления созданного ресурса "Речь" можно использовать портал Azure или интерфейс командной строки (CLI) Azure.
Документация по справочным материалам | Пакет (Go) | Дополнительные примеры на GitHub
Пакет SDK для службы "Речь" на языке программирования Go не поддерживает функцию транскрипции разговоров. Выберите другой язык программирования или справочник и примеры по Go, приведенные в начале этой статьи.
Справочная документация | Дополнительные примеры на GitHub
В этом кратком руководстве вы запустите приложение для преобразования речи в текст с диаризацией в режиме реального времени. Диаризация определяет разных собеседников, участвующих в разговоре. Речевой сервис предоставляет сведения о том, кто из исполнителей говорил определенную часть транскрибированной речи.
Информация о говорящем включена в результат в поле ID говорящего. Идентификатор участника — это универсальный идентификатор, назначаемый каждому участнику разговора службой во время распознавания, по мере того как различные участники разговора идентифицируются из предоставленного аудиоконтента.
Совет
Вы можете попробовать речь в режиме реального времени на текст в Speech Studio без регистрации или написания кода. Тем не менее, в Speech Studio пока нет поддержки функции диаризации.
Предварительные условия
- Подписка Azure. Вы можете создать бесплатную учетную запись.
- Создайте ресурс служб Искусственного Интеллекта для работы с речью в Портале Azure.
- Получите ключ ресурса и регион для службы "Речь". После развертывания ресурса службы "Речь" выберите Перейти к ресурсу для просмотра ключей и управления ими.
Настройка среды
Чтобы настроить среду, установите Speech SDK. Пример, приведенный в этом кратком руководстве, работает со средой выполнения Java.
Установите Apache Maven. Затем выполните команду
mvn -v
, чтобы подтвердить успешную установку.В корне проекта создайте файл с именем
pom.xml
и скопируйте в него следующее содержимое:<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.microsoft.cognitiveservices.speech.samples</groupId> <artifactId>quickstart-eclipse</artifactId> <version>1.0.0-SNAPSHOT</version> <build> <sourceDirectory>src</sourceDirectory> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>com.microsoft.cognitiveservices.speech</groupId> <artifactId>client-sdk</artifactId> <version>1.43.0</version> </dependency> </dependencies> </project>
Установите пакет SDK для работы с речью и зависимости.
mvn clean dependency:copy-dependencies
Настройка переменных среды
Для доступа к службам ИИ Azure необходимо пройти проверку подлинности приложения. В этой статье показано, как использовать переменные среды для хранения учетных данных. Затем вы можете получить доступ к переменным среды из кода для проверки подлинности приложения. Для рабочей среды используйте более безопасный способ хранения и доступа к учетным данным.
Внимание
Мы рекомендуем использовать проверку подлинности Microsoft Entra ID с управляемыми удостоверениями для ресурсов Azure, чтобы избежать хранения учетных данных в ваших приложениях, работающих в облаке.
Используйте ключи API с осторожностью. Не включайте ключ API непосредственно в код и никогда не публикуйте его. При использовании ключей API безопасно храните их в Azure Key Vault, регулярно поворачивайте ключи и ограничьте доступ к Azure Key Vault с помощью управления доступом на основе ролей и ограничений доступа к сети. Дополнительные сведения об использовании ключей API безопасно в приложениях см. в разделе "Ключи API" с помощью Azure Key Vault.
Дополнительные сведения о безопасности служб ИИ см. в статье "Проверка подлинности запросов к службам ИИ Azure".
Чтобы задать переменные среды для ключа ресурса службы "Речь" и региона, откройте окно консоли и следуйте инструкциям для вашей операционной системы и среды разработки.
- Чтобы задать
SPEECH_KEY
переменную среды, замените ваш-ключ одним из ключей вашего ресурса. - Чтобы задать переменную среды
SPEECH_REGION
, замените ваш-регион одним из возможных регионов вашего ресурса.
setx SPEECH_KEY your-key
setx SPEECH_REGION your-region
Примечание.
Если вам нужно получить доступ только к переменным среды в текущей консоли, можно задать переменную set
среды вместо setx
.
После добавления переменных среды может потребоваться перезапустить все программы, которые должны считывать переменные среды, включая окно консоли. Например, если вы используете Visual Studio в качестве редактора, перезапустите Visual Studio перед запуском примера.
Реализация диаризации из файла с транскрибированием беседы
Выполните следующие действия, чтобы создать консольное приложение для транскрибирования бесед.
Создайте новый файл с именем
ConversationTranscription.java
в том же корневом каталоге проекта.Скопируйте в файл
ConversationTranscription.java
следующий код:import com.microsoft.cognitiveservices.speech.*; import com.microsoft.cognitiveservices.speech.audio.AudioConfig; import com.microsoft.cognitiveservices.speech.transcription.*; import java.util.concurrent.Semaphore; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; public class ConversationTranscription { // This example requires environment variables named "SPEECH_KEY" and "SPEECH_REGION" private static String speechKey = System.getenv("SPEECH_KEY"); private static String speechRegion = System.getenv("SPEECH_REGION"); public static void main(String[] args) throws InterruptedException, ExecutionException { SpeechConfig speechConfig = SpeechConfig.fromSubscription(speechKey, speechRegion); speechConfig.setSpeechRecognitionLanguage("en-US"); AudioConfig audioInput = AudioConfig.fromWavFileInput("katiesteve.wav"); speechConfig.setProperty(PropertyId.SpeechServiceResponse_DiarizeIntermediateResults, "true"); Semaphore stopRecognitionSemaphore = new Semaphore(0); ConversationTranscriber conversationTranscriber = new ConversationTranscriber(speechConfig, audioInput); { // Subscribes to events. conversationTranscriber.transcribing.addEventListener((s, e) -> { System.out.println("TRANSCRIBING: Text=" + e.getResult().getText() + " Speaker ID=" + e.getResult().getSpeakerId() ); }); conversationTranscriber.transcribed.addEventListener((s, e) -> { if (e.getResult().getReason() == ResultReason.RecognizedSpeech) { System.out.println(); System.out.println("TRANSCRIBED: Text=" + e.getResult().getText() + " Speaker ID=" + e.getResult().getSpeakerId() ); System.out.println(); } else if (e.getResult().getReason() == ResultReason.NoMatch) { System.out.println("NOMATCH: Speech could not be transcribed."); } }); conversationTranscriber.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 update the subscription info?"); } stopRecognitionSemaphore.release(); }); conversationTranscriber.sessionStarted.addEventListener((s, e) -> { System.out.println("\n Session started event."); }); conversationTranscriber.sessionStopped.addEventListener((s, e) -> { System.out.println("\n Session stopped event."); }); conversationTranscriber.startTranscribingAsync().get(); // Waits for completion. stopRecognitionSemaphore.acquire(); conversationTranscriber.stopTranscribingAsync().get(); } speechConfig.close(); audioInput.close(); conversationTranscriber.close(); System.exit(0); } }
Получите пример звукового файла или используйте собственный
.wav
файл. Заменитеkatiesteve.wav
на путь и имя вашего файла.wav
.Приложение распознает речь нескольких участников беседы. Звуковой файл должен содержать несколько динамиков.
Чтобы изменить язык распознавания речи, замените
en-US
на другой поддерживаемый язык. Например,es-ES
для испанского (Испания). Если язык не указан, по умолчанию используетсяen-US
. Дополнительные сведения о том, как определить один из нескольких языков, на которых могут говорить, см. в разделе Определение языка.Запустите новое консольное приложение, чтобы начать транскрибирование бесед:
javac ConversationTranscription.java -cp ".;target\dependency\*" java -cp ".;target\dependency\*" ConversationTranscription
Внимание
Убедитесь, что заданы SPEECH_KEY
и SPEECH_REGION
переменные среды. Если эти переменные не заданы, пример завершится с сообщением об ошибке.
Транскрибированные беседы должны выводиться в виде текста:
TRANSCRIBING: Text=good morning Speaker ID=Unknown
TRANSCRIBING: Text=good morning steve Speaker ID=Unknown
TRANSCRIBING: Text=good morning steve how Speaker ID=Guest-1
TRANSCRIBING: Text=good morning steve how are you doing Speaker ID=Guest-1
TRANSCRIBING: Text=good morning steve how are you doing today Speaker ID=Guest-1
TRANSCRIBED: Text=Good morning, Steve. How are you doing today? Speaker ID=Guest-1
TRANSCRIBING: Text=good morning katie i hope Speaker ID=Guest-2
TRANSCRIBING: Text=good morning katie i hope you're having a Speaker ID=Guest-2
TRANSCRIBING: Text=good morning katie i hope you're having a great Speaker ID=Guest-2
TRANSCRIBING: Text=good morning katie i hope you're having a great start to Speaker ID=Guest-2
TRANSCRIBING: Text=good morning katie i hope you're having a great start to your day Speaker ID=Guest-2
TRANSCRIBED: Text=Good morning, Katie. I hope you're having a great start to your day. Speaker ID=Guest-2
TRANSCRIBING: Text=have you tried Speaker ID=Unknown
TRANSCRIBING: Text=have you tried the latest Speaker ID=Unknown
TRANSCRIBING: Text=have you tried the latest real Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in microsoft Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in microsoft speech Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in microsoft speech service Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in microsoft speech service which Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in microsoft speech service which can Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in microsoft speech service which can tell you Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in microsoft speech service which can tell you who said Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in microsoft speech service which can tell you who said what Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in microsoft speech service which can tell you who said what in Speaker ID=Guest-1
TRANSCRIBING: Text=have you tried the latest real time diarization in microsoft speech service which can tell you who said what in real time Speaker ID=Guest-1
TRANSCRIBED: Text=Have you tried the latest real time diarization in Microsoft Speech Service which can tell you who said what in real time? Speaker ID=Guest-1
TRANSCRIBING: Text=not yet Speaker ID=Unknown
TRANSCRIBING: Text=not yet i Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch trans Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization function Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces di Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature able to Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature able to di Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature able to diarize in real Speaker ID=Guest-2
TRANSCRIBING: Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature able to diarize in real time Speaker ID=Guest-2
TRANSCRIBED: Text=Not yet. I've been using the batch transcription with diarization functionality, but it produces diarization results after the whole audio is processed. Is the new feature able to diarize in real time? Speaker ID=Guest-2
TRANSCRIBING: Text=absolutely Speaker ID=Unknown
TRANSCRIBING: Text=absolutely i recom Speaker ID=Guest-1
TRANSCRIBING: Text=absolutely i recommend Speaker ID=Guest-1
TRANSCRIBING: Text=absolutely i recommend you Speaker ID=Guest-1
TRANSCRIBING: Text=absolutely i recommend you give it a try Speaker ID=Guest-1
TRANSCRIBED: Text=Absolutely, I recommend you give it a try. Speaker ID=Guest-1
TRANSCRIBING: Text=that's exc Speaker ID=Unknown
TRANSCRIBING: Text=that's exciting Speaker ID=Unknown
TRANSCRIBING: Text=that's exciting let me try Speaker ID=Guest-2
TRANSCRIBING: Text=that's exciting let me try it right now Speaker ID=Guest-2
TRANSCRIBED: Text=That's exciting. Let me try it right now. Speaker ID=Guest-2
Участники определяются как Гость-1, Гость-2 и т. д. в зависимости от количества участников в беседе.
Примечание.
В некоторых из ранних промежуточных результатов могут быть видны Speaker ID=Unknown
, когда говорящий еще не определен. Без промежуточных результатов диаризации (если вы не установили свойство PropertyId.SpeechServiceResponse_DiarizeIntermediateResults
в "true"), идентификатор говорящего всегда "Неизвестно".
Очистка ресурсов
Для удаления ресурса "Речь", который вы создали, можно использовать портал Azure или интерфейс командной строки Azure (CLI).
Справочная документация | Пакет (npm) | Дополнительные примеры на GitHub | Исходный код библиотеки
В этом кратком руководстве вы запустите приложение для преобразования речи в текст с диаризации в режиме реального времени. Диаризация отличает различных участников разговора. Служба "Речь" предоставляет сведения о том, какой спикер говорил определённую часть транскрибированной речи.
Сведения о спикере включаются в результат в поле ID говорящего. Идентификатор говорящего — это универсальный идентификатор, назначаемый службой каждому участнику беседы во время распознавания, поскольку разные говорящие распознаются из предоставленного аудиоконтента.
Совет
Вы можете попробовать речь в режиме реального времени на текст в Speech Studio без регистрации или написания кода. Тем не менее, Speech Studio пока не поддерживает диаризацию.
Пререквизиты
- Подписка Azure. Вы можете создать бесплатную учетную запись.
- Создайте ресурс служб ИИ для службы «Речь» в портале Azure.
- Получите ключ ресурса речи и регион. После развертывания ресурса службы "Речь" выберите Перейти к ресурсу для просмотра ключей и управления ими.
Настройка среды
Чтобы настроить среду, установите Speech SDK для JavaScript. Если вам только нужно имя пакета для установки, выполните команду npm install microsoft-cognitiveservices-speech-sdk
. Подробные инструкции по установке см. в статье Руководство по установке пакета SDK.
Настройка переменных среды
Для доступа к службам ИИ Azure необходимо пройти проверку подлинности приложения. В этой статье показано, как использовать переменные среды для хранения учетных данных. Затем вы можете получить доступ к переменным среды из кода для проверки подлинности приложения. Для рабочей среды используйте более безопасный способ хранения и доступа к учетным данным.
Внимание
Мы рекомендуем использовать аутентификацию Microsoft Entra ID с управляемыми удостоверениями для ресурсов Azure, чтобы избежать необходимости хранения учетных данных в приложениях, работающих в облаке.
Используйте ключи API с осторожностью. Не включайте ключ API непосредственно в код и никогда не публикуйте его. При использовании ключей API безопасно храните их в Azure Key Vault, регулярно поворачивайте ключи и ограничьте доступ к Azure Key Vault с помощью управления доступом на основе ролей и ограничений доступа к сети. Дополнительные сведения об использовании ключей API безопасно в приложениях см. в разделе "Ключи API" с помощью Azure Key Vault.
Дополнительные сведения о безопасности служб ИИ см. в статье "Проверка подлинности запросов к службам ИИ Azure".
Чтобы задать переменные среды для ключа ресурса службы "Речь" и региона, откройте окно консоли и следуйте инструкциям для вашей операционной системы и среды разработки.
- Чтобы задать
SPEECH_KEY
переменную среды, замените «ваш-ключ» одним из ключей ресурса. - Чтобы задать
SPEECH_REGION
переменную среды, замените your-region на одно из значений региона для вашего ресурса.
setx SPEECH_KEY your-key
setx SPEECH_REGION your-region
Примечание.
Если вам нужно получить доступ только к переменным среды в текущей консоли, можно задать переменную set
среды вместо setx
.
После добавления переменных среды может потребоваться перезапустить все программы, которые должны считывать переменные среды, включая окно консоли. Например, если вы используете Visual Studio в качестве редактора, перезапустите Visual Studio перед запуском примера.
Реализация диаризации из файла с транскрибированием беседы
Выполните следующие действия, чтобы создать консольное приложение для транскрибирования бесед.
Откройте окно командной строки, в котором требуется новый проект, и создайте файл с именем
ConversationTranscription.js
.Установите Speech SDK для JavaScript.
npm install microsoft-cognitiveservices-speech-sdk
Скопируйте в файл
ConversationTranscription.js
следующий код:const fs = require("fs"); const sdk = require("microsoft-cognitiveservices-speech-sdk"); // This example requires environment variables named "SPEECH_KEY" and "SPEECH_REGION" const speechConfig = sdk.SpeechConfig.fromSubscription(process.env.SPEECH_KEY, process.env.SPEECH_REGION); function fromFile() { const filename = "katiesteve.wav"; let audioConfig = sdk.AudioConfig.fromWavFileInput(fs.readFileSync(filename)); let conversationTranscriber = new sdk.ConversationTranscriber(speechConfig, audioConfig); var pushStream = sdk.AudioInputStream.createPushStream(); fs.createReadStream(filename).on('data', function(arrayBuffer) { pushStream.write(arrayBuffer.slice()); }).on('end', function() { pushStream.close(); }); console.log("Transcribing from: " + filename); conversationTranscriber.sessionStarted = function(s, e) { console.log("SessionStarted event"); console.log("SessionId:" + e.sessionId); }; conversationTranscriber.sessionStopped = function(s, e) { console.log("SessionStopped event"); console.log("SessionId:" + e.sessionId); conversationTranscriber.stopTranscribingAsync(); }; conversationTranscriber.canceled = function(s, e) { console.log("Canceled event"); console.log(e.errorDetails); conversationTranscriber.stopTranscribingAsync(); }; conversationTranscriber.transcribed = function(s, e) { console.log("TRANSCRIBED: Text=" + e.result.text + " Speaker ID=" + e.result.speakerId); }; // Start conversation transcription conversationTranscriber.startTranscribingAsync( function () {}, function (err) { console.trace("err - starting transcription: " + err); } ); } fromFile();
Получите пример звукового файла или используйте собственный
.wav
файл. Заменитеkatiesteve.wav
на путь и имя вашего файла.wav
.Приложение распознает речь нескольких участников беседы. Звуковой файл должен содержать несколько динамиков.
Чтобы изменить язык распознавания речи, замените
en-US
на другой поддерживаемый язык. Например,es-ES
для испанского (Испания). Если язык не указан, по умолчанию используетсяen-US
. Дополнительные сведения о том, как определить один из нескольких языков, на которых могут говорить, см. в разделе Определение языка.Запустите новое консольное приложение, чтобы начать распознавание речи из файла:
node.exe ConversationTranscription.js
Внимание
Убедитесь, что заданы SPEECH_KEY
и SPEECH_REGION
переменные среды. Если вы не зададите эти переменные, пример выдаёт сообщение об ошибке.
Транскрибированные беседы должны выводиться в виде текста:
SessionStarted event
SessionId:E87AFBA483C2481985F6C9AF719F616B
TRANSCRIBED: Text=Good morning, Steve. Speaker ID=Unknown
TRANSCRIBED: Text=Good morning, Katie. Speaker ID=Unknown
TRANSCRIBED: Text=Have you tried the latest real time diarization in Microsoft Speech Service which can tell you who said what in real time? Speaker ID=Guest-1
TRANSCRIBED: Text=Not yet. I've been using the batch transcription with diarization functionality, but it produces diarization result until whole audio get processed. Speaker ID=Guest-2
TRANSCRIBED: Text=Is the new feature can diarize in real time? Speaker ID=Guest-2
TRANSCRIBED: Text=Absolutely. Speaker ID=Guest-1
TRANSCRIBED: Text=That's exciting. Let me try it right now. Speaker ID=Guest-2
Canceled event
undefined
SessionStopped event
SessionId:E87AFBA483C2481985F6C9AF719F616B
Участники определяются как Гость-1, Гость-2 и т. д. в зависимости от количества участников в беседе.
Очистка ресурсов
Для удаления созданного ресурса 'Speech' можно использовать портал Azure или интерфейс командной строки Azure (CLI).
Справочный пакет документации | (скачивание) | Дополнительные примеры на GitHub
Пакет SDK для работы с речью в Objective-C поддерживает транскрибацию разговоров, но мы еще не включили здесь руководство. Выберите другой язык программирования, чтобы приступить к работе и ознакомиться с основными понятиями, или обратитесь к справочнику и примерам для языка Objective-C, ссылки на которые приведены в начале этой статьи.
Справочный пакет документации | (скачивание) | Дополнительные примеры на GitHub
Пакет SDK для работы с речью на Swift поддерживает транскрипцию разговоров, но мы пока не включили сюда руководство. Выберите другой язык программирования, чтобы приступить к работе и ознакомиться с основными понятиями, или обратитесь к справочнику и примерам для языка Swift, ссылки на которые приведены в начале этой статьи.
Справочные примеры пакета документации | (PyPi) | Дополнительные примеры на GitHub
В этом кратком стартовом руководстве вы запустите приложение для преобразования речи в текст с функцией диаризации в режиме реального времени. Диаризация различает голоса разных собеседников, участвующих в беседе. Служба речевого сервиса предоставляет информацию о том, какой говорящий говорил определённую часть транскрибированной речи.
Сведения о говорящем включаются в результат в поле идентификатора говорящего. Идентификатор говорящего — это идентификатор, назначенный каждому участнику беседы службой во время распознавания, когда различные говорящие определяются из предоставленного звукового содержимого.
Совет
Вы можете попробовать речь в режиме реального времени на текст в Speech Studio без регистрации или написания кода. Тем не менее, Speech Studio пока не поддерживает диаризацию.
Предварительные условия
- Подписка Azure. Вы можете создать бесплатную учетную запись.
- Создайте ресурс служб ИИ для функции "Речь" в портале Azure.
- Получите ключ ресурса 'Speech' и регион. После развертывания ресурса службы "Речь" выберите Перейти к ресурсу для просмотра ключей и управления ими.
Настройка среды
Пакет SDK для Python доступен в виде модуля индекса пакетов Python (PyPI). SDK для Python совместим с Windows, Linux и macOS.
- Для вашей платформы необходимо установить Microsoft распространяемый пакет Visual C++ для Visual Studio 2015, 2017, 2019 и 2022. При первой установке этого пакета может потребоваться перезагрузка.
- В Linux необходимо использовать целевую архитектуру x64.
Установите версию Python с версии 3.7 или более поздней версии. Сначала ознакомьтесь со статьей Руководство по установке пакета SDK, чтобы узнать о дополнительных требованиях.
Настройка переменных среды
Для доступа к службам ИИ Azure необходимо пройти проверку подлинности приложения. В этой статье показано, как использовать переменные среды для хранения учетных данных. Затем вы можете получить доступ к переменным среды из кода для проверки подлинности приложения. Для рабочей среды используйте более безопасный способ хранения и доступа к учетным данным.
Внимание
Мы рекомендуем использовать аутентификацию с помощью идентификации Microsoft Entra ID и управляемыми удостоверениями для ресурсов Azure, чтобы избежать хранения учетных данных в приложениях, работающих в облаке.
Используйте ключи API с осторожностью. Не включайте ключ API непосредственно в код и никогда не публикуйте его. При использовании ключей API безопасно храните их в Azure Key Vault, регулярно поворачивайте ключи и ограничьте доступ к Azure Key Vault с помощью управления доступом на основе ролей и ограничений доступа к сети. Дополнительные сведения об использовании ключей API безопасно в приложениях см. в разделе "Ключи API" с помощью Azure Key Vault.
Дополнительные сведения о безопасности служб ИИ см. в статье "Проверка подлинности запросов к службам ИИ Azure".
Чтобы задать переменные среды для ключа ресурса службы "Речь" и региона, откройте окно консоли и следуйте инструкциям для вашей операционной системы и среды разработки.
- Чтобы задать
SPEECH_KEY
переменную среды, замените your-key на один из ключей вашего ресурса. - Чтобы задать
SPEECH_REGION
переменную среды, замените ваш-регион одним из регионов вашего ресурса.
setx SPEECH_KEY your-key
setx SPEECH_REGION your-region
Примечание.
Если вам нужно получить доступ только к переменным среды в текущей консоли, можно задать переменную set
среды вместо setx
.
После добавления переменных среды может потребоваться перезапустить все программы, которые должны считывать переменные среды, включая окно консоли. Например, если вы используете Visual Studio в качестве редактора, перезапустите Visual Studio перед запуском примера.
Реализация диаризации из файла с транскрибированием беседы
Чтобы создать новое консольное приложение, выполните указанные ниже действия.
Откройте окно командной строки, в котором требуется новый проект, и создайте файл с именем
conversation_transcription.py
.Выполните следующую команду для установки пакета SDK для службы "Речь".
pip install azure-cognitiveservices-speech
Скопируйте в файл
conversation_transcription.py
следующий код:import os import time import azure.cognitiveservices.speech as speechsdk def conversation_transcriber_recognition_canceled_cb(evt: speechsdk.SessionEventArgs): print('Canceled event') def conversation_transcriber_session_stopped_cb(evt: speechsdk.SessionEventArgs): print('SessionStopped event') def conversation_transcriber_transcribed_cb(evt: speechsdk.SpeechRecognitionEventArgs): print('\nTRANSCRIBED:') if evt.result.reason == speechsdk.ResultReason.RecognizedSpeech: print('\tText={}'.format(evt.result.text)) print('\tSpeaker ID={}\n'.format(evt.result.speaker_id)) elif evt.result.reason == speechsdk.ResultReason.NoMatch: print('\tNOMATCH: Speech could not be TRANSCRIBED: {}'.format(evt.result.no_match_details)) def conversation_transcriber_transcribing_cb(evt: speechsdk.SpeechRecognitionEventArgs): print('TRANSCRIBING:') print('\tText={}'.format(evt.result.text)) print('\tSpeaker ID={}'.format(evt.result.speaker_id)) def conversation_transcriber_session_started_cb(evt: speechsdk.SessionEventArgs): print('SessionStarted event') def recognize_from_file(): # This example requires environment variables named "SPEECH_KEY" and "SPEECH_REGION" speech_config = speechsdk.SpeechConfig(subscription=os.environ.get('SPEECH_KEY'), region=os.environ.get('SPEECH_REGION')) speech_config.speech_recognition_language="en-US" speech_config.set_property(property_id=speechsdk.PropertyId.SpeechServiceResponse_DiarizeIntermediateResults, value='true') audio_config = speechsdk.audio.AudioConfig(filename="katiesteve.wav") conversation_transcriber = speechsdk.transcription.ConversationTranscriber(speech_config=speech_config, audio_config=audio_config) transcribing_stop = False def stop_cb(evt: speechsdk.SessionEventArgs): #"""callback that signals to stop continuous recognition upon receiving an event `evt`""" print('CLOSING on {}'.format(evt)) nonlocal transcribing_stop transcribing_stop = True # Connect callbacks to the events fired by the conversation transcriber conversation_transcriber.transcribed.connect(conversation_transcriber_transcribed_cb) conversation_transcriber.transcribing.connect(conversation_transcriber_transcribing_cb) conversation_transcriber.session_started.connect(conversation_transcriber_session_started_cb) conversation_transcriber.session_stopped.connect(conversation_transcriber_session_stopped_cb) conversation_transcriber.canceled.connect(conversation_transcriber_recognition_canceled_cb) # stop transcribing on either session stopped or canceled events conversation_transcriber.session_stopped.connect(stop_cb) conversation_transcriber.canceled.connect(stop_cb) conversation_transcriber.start_transcribing_async() # Waits for completion. while not transcribing_stop: time.sleep(.5) conversation_transcriber.stop_transcribing_async() # Main try: recognize_from_file() except Exception as err: print("Encountered exception. {}".format(err))
Получите пример звукового файла или используйте собственный
.wav
файл. Заменитеkatiesteve.wav
на путь и имя вашего файла.wav
.Приложение распознает речь нескольких участников беседы. Звуковой файл должен содержать несколько динамиков.
Чтобы изменить язык распознавания речи, замените
en-US
на другой поддерживаемый язык. Например,es-ES
для испанского (Испания). Если язык не указан, по умолчанию используетсяen-US
. Дополнительные сведения о том, как определить один из нескольких языков, на которых могут говорить, см. в разделе Определение языка.Запустите новое консольное приложение, чтобы начать транскрибирование бесед:
python conversation_transcription.py
Внимание
Убедитесь, что заданы SPEECH_KEY
SPEECH_REGION
переменные среды. Если эти переменные не заданы, пример завершается с ошибкой и сообщением об ошибке.
Транскрибированные беседы должны выводиться в виде текста:
TRANSCRIBING:
Text=good morning
Speaker ID=Unknown
TRANSCRIBING:
Text=good morning steve
Speaker ID=Unknown
TRANSCRIBING:
Text=good morning steve how are
Speaker ID=Guest-1
TRANSCRIBING:
Text=good morning steve how are you doing today
Speaker ID=Guest-1
TRANSCRIBED:
Text=Good morning, Steve. How are you doing today?
Speaker ID=Guest-1
TRANSCRIBING:
Text=good morning katie
Speaker ID=Unknown
TRANSCRIBING:
Text=good morning katie i hope you're having a
Speaker ID=Guest-2
TRANSCRIBING:
Text=good morning katie i hope you're having a great start to
Speaker ID=Guest-2
TRANSCRIBING:
Text=good morning katie i hope you're having a great start to your day
Speaker ID=Guest-2
TRANSCRIBED:
Text=Good morning, Katie. I hope you're having a great start to your day.
Speaker ID=Guest-2
TRANSCRIBING:
Text=have you
Speaker ID=Unknown
TRANSCRIBING:
Text=have you tried
Speaker ID=Unknown
TRANSCRIBING:
Text=have you tried the latest
Speaker ID=Unknown
TRANSCRIBING:
Text=have you tried the latest real
Speaker ID=Guest-1
TRANSCRIBING:
Text=have you tried the latest real time
Speaker ID=Guest-1
TRANSCRIBING:
Text=have you tried the latest real time diarization
Speaker ID=Guest-1
TRANSCRIBING:
Text=have you tried the latest real time diarization in
Speaker ID=Guest-1
TRANSCRIBING:
Text=have you tried the latest real time diarization in microsoft
Speaker ID=Guest-1
TRANSCRIBING:
Text=have you tried the latest real time diarization in microsoft speech
Speaker ID=Guest-1
TRANSCRIBING:
Text=have you tried the latest real time diarization in microsoft speech service
Speaker ID=Guest-1
TRANSCRIBING:
Text=have you tried the latest real time diarization in microsoft speech service which
Speaker ID=Guest-1
TRANSCRIBING:
Text=have you tried the latest real time diarization in microsoft speech service which can
Speaker ID=Guest-1
TRANSCRIBING:
Text=have you tried the latest real time diarization in microsoft speech service which can tell you
Speaker ID=Guest-1
TRANSCRIBING:
Text=have you tried the latest real time diarization in microsoft speech service which can tell you who said
Speaker ID=Guest-1
TRANSCRIBING:
Text=have you tried the latest real time diarization in microsoft speech service which can tell you who said what
Speaker ID=Guest-1
TRANSCRIBING:
Text=have you tried the latest real time diarization in microsoft speech service which can tell you who said what in
Speaker ID=Guest-1
TRANSCRIBING:
Text=have you tried the latest real time diarization in microsoft speech service which can tell you who said what in real time
Speaker ID=Guest-1
TRANSCRIBED:
Text=Have you tried the latest real time diarization in Microsoft Speech Service which can tell you who said what in real time?
Speaker ID=Guest-1
TRANSCRIBING:
Text=not yet
Speaker ID=Unknown
TRANSCRIBING:
Text=not yet i
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch trans
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization function
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization functionality
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization functionality but
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization functionality but it
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization functionality but it produces
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization functionality but it produces di
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature able to
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature able to di
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature able to diarize in real
Speaker ID=Guest-2
TRANSCRIBING:
Text=not yet i've been using the batch transcription with diarization functionality but it produces diarization results after the whole audio is processed is the new feature able to diarize in real time
Speaker ID=Guest-2
TRANSCRIBED:
Text=Not yet. I've been using the batch transcription with diarization functionality, but it produces diarization results after the whole audio is processed. Is the new feature able to diarize in real time?
Speaker ID=Guest-2
TRANSCRIBING:
Text=absolutely
Speaker ID=Unknown
TRANSCRIBING:
Text=absolutely i
Speaker ID=Unknown
TRANSCRIBING:
Text=absolutely i recom
Speaker ID=Guest-1
TRANSCRIBING:
Text=absolutely i recommend
Speaker ID=Guest-1
TRANSCRIBING:
Text=absolutely i recommend you give it a try
Speaker ID=Guest-1
TRANSCRIBED:
Text=Absolutely, I recommend you give it a try.
Speaker ID=Guest-1
TRANSCRIBING:
Text=that's exc
Speaker ID=Unknown
TRANSCRIBING:
Text=that's exciting
Speaker ID=Unknown
TRANSCRIBING:
Text=that's exciting let me
Speaker ID=Guest-2
TRANSCRIBING:
Text=that's exciting let me try
Speaker ID=Guest-2
TRANSCRIBING:
Text=that's exciting let me try it right now
Speaker ID=Guest-2
TRANSCRIBED:
Text=That's exciting. Let me try it right now.
Speaker ID=Guest-2
Участники определяются как Гость-1, Гость-2 и т. д., в зависимости от количества участников в беседе.
Примечание.
Некоторые из ранних промежуточных результатов могут содержать Speaker ID=Unknown
, когда оратор еще не определен. Без промежуточных результатов диаризации (если свойству PropertyId.SpeechServiceResponse_DiarizeIntermediateResults
не присвоено значение "true"), идентификатор говорящего всегда "Неизвестно".
Очистка ресурсов
Для удаления созданного ресурса Speech можно использовать портал Azure или интерфейс командной строки (CLI) Azure.
Справочник по REST API преобразования речи в текст | REST API преобразования речи в текст для короткого аудио | Дополнительные примеры на GitHub
REST API не поддерживает транскрибирование бесед. Выберите другой язык программирования или средство в верхней части этой страницы.
Интерфейс командной строки службы "Речь" не поддерживает транскрибирование бесед. Выберите другой язык программирования или средство в верхней части этой страницы.