Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
API быстрого транскрибирования используется для распознавания аудиофайлов с возвратом результатов синхронно и быстрее, чем в реальном времени. Используйте быстрое транскрибирование в сценариях, когда необходима транскрипция аудиозаписи как можно быстрее с прогнозируемой задержкой, например:
- Быстрое транскрибирование звука или видео, субтитры и редактирование.
- Заметки о собрании
- Голосовую почту
В отличие от API пакетного транскрибирования, API быстрого транскрибирования создает только транскрибирование в форме отображения (не лексического). Форма отображения является более удобочитаемой формой транскрибирования, которая включает пунктуацию и прописную букву.
Совет
Вы также можете использовать новейшие технологии распознавания речи и перевода речи на базе LLM с помощью LLM.
Доступность компонентов
В этой таблице показаны функции транскрибирования, поддерживаемые API быстрого транскрибирования и без функции распознавания речи LLM (расширенный режим):
| Функция | Быстрое транскрибирование (по умолчанию) | Речь LLM (улучшенная) |
|---|---|---|
| Транскрипция | ✅ (модели транскрибирования речи) | ✅ (многомодальная модель) |
| Перевод | ❌ | ✅ (многомодальная модель) |
| Диаризация | ✅ | ✅ |
| Канал (стерео) | ✅ | ✅ |
| Фильтрация ненормативной лексики | ✅ | ✅ |
| Задать локаль | ✅ | ❌ (используйте подсказки для реализации) |
| Пользовательская подсказка | ❌ | ✅ |
| Список фраз | ✅ | ❌ (используйте запрос для реализации) |
Для LLM-речи используйте побуждение для направления стиля выхода вместо использования конкретных локалей или списков фраз.
Вы можете попробовать быстрое транскрибирование в Microsoft Foundry без написания кода.
Необходимые условия
- Подписка Azure. Создайте его бесплатно.
- Проект Foundry. Если вам нужно создать проект, см. раздел Создание проекта Microsoft Foundry.
Попробуйте быструю транскрипцию
- Войдите в Microsoft Foundry. Убедитесь, что переключатель New Foundry включен. Эти действия относятся к Foundry (new).
- Выберите "Сборка" в правом верхнем меню.
- Выберите модели на левой панели.
- На вкладке "Службы искусственного интеллекта" показаны модели Foundry, которые можно использовать из коробки в портале Foundry. Выберите Azure Speech — Речь в текст, чтобы открыть песочницу "Речь в текст".
- В верхнем раскрывающемся списке выберите быструю транскрипцию.
- При необходимости используйте раздел "Параметры " для изменения языка, политики ненормативной лексики и других параметров.
- Используйте раздел "Отправить файлы ", чтобы выбрать звуковой файл. Затем нажмите кнопку "Пуск".
- Просмотрите выходные данные транскрибирования на вкладке "Расшифровка ". При необходимости просмотрите выходные данные необработанного ответа API на вкладке JSON .
- Перейдите на вкладку "Код" , чтобы получить пример кода для использования быстрого транскрибирования в приложении.
Необходимые условия
Ресурс Azure Speech в одном из регионов, где доступен API быстрого транскрибирования. Текущий список поддерживаемых регионов см. в таблице регионов службы "Речь".
Звуковой файл (менее 5 часов и менее 500 МБ в размере) в одном из форматов и кодеков, поддерживаемых API пакетной транскрибирования: WAV, MP3, OPUS/OGG, FLAC, WMA, AAC, ALAW в контейнере WAV, MULAW в контейнере WAV, AMR, WebM и SPEEX. Дополнительные сведения о поддерживаемых аудиоформатах см. в поддерживаемых аудиоформатах.
Отправка звука
Вы можете предоставить звуковые данные для быстрого транскрибирования следующим образом:
- Встроенная передача звука
--form 'audio=@"YourAudioFile"'
- Звук из общедоступного URL-адреса
--form 'definition="{"audioUrl": "https://crbn.us/hello.wav"}"'
Совет
Для длинных звуковых файлов рекомендуется отправлять из общедоступного URL-адреса.
В следующих разделах в качестве примера используется загрузка встроенного аудио.
Использование API быстрого транскрибирования
Совет
Попробуйте быструю транскрипцию в портале Microsoft Foundry.
Мы узнаем, как использовать API для быстрой транскрипции (с помощью Transcriptions - Transcribe) со следующими сценариями:
- Указанный известный языковой стандарт: транскрибировать аудиофайл с указанным языковым стандартом. Если вы знаете местоположение аудиофайла, можно указать его, чтобы повысить точность транскрибирования и минимизировать задержку.
- Идентификация языка: транскрибирование звукового файла с помощью идентификации языка. Если вы не уверены в локали аудиофайла, вы можете включить определение языка, чтобы служба "Речь" могла идентифицировать локаль (одна локаль для каждого аудиофайла).
- Многоязычное транскрибирование: транскрибирование аудиофайла с помощью последней многоязычной модели транскрибирования речи. Если звук содержит многоязычное содержимое, которое вы хотите непрерывно и точно расшифровывать, можно использовать последнюю модель транскрибирования речи с несколькими языками, не указывая коды языкового стандарта.
- Diarization on: Расшифруйте аудиофайл с включенной диаризацией. Диаризация различает разных говорящих в беседе. Служба распознавания речи предоставляет сведения о том, какой докладчик говорил определенную часть транскрибированной речи.
- Включение нескольких каналов: транскрибирование звукового файла с одним или двумя каналами. Транскрибирование с несколькими каналами полезно для аудиофайлов с несколькими каналами, например аудиофайлов с несколькими динамиками или звуковыми файлами с фоновым шумом. По умолчанию API быстрого транскрибирования объединяет все входные каналы в один канал, а затем выполняет транскрибирование. Если это не желательно, каналы могут быть транскрибированы независимо без объединения.
- Указан известный языковой стандарт
- Включение идентификации языка
- Многоязычное транскрибирование
- Diarization on
- Многоканальное включение
Сделайте POST-запрос формата multipart/form-data к эндпоинту transcriptions, вместе с звуковым файлом и параметрами тела запроса.
В следующем примере показано, как транскрибировать аудиофайл с указанной локалью. Если вы знаете языковую локаль звукового файла, вы можете указать её, чтобы повысить точность транскрибирования и уменьшить задержку.
- Замените
YourSpeechResourceKeyключом ресурса распознавания речи. - Замените
YourServiceRegionрегион ресурсов службы "Речь". - Замените
YourAudioFileпуть к звуковому файлу.
Важно
Для рекомендуемой проверки подлинности без ключа с помощью Microsoft Entra ID замените --header 'Ocp-Apim-Subscription-Key: YourSpeechResourceKey' на --header "Authorization: Bearer YourAccessToken". Дополнительные сведения о проверке подлинности без ключа см. в руководстве по управлению доступом на основе ролей .
curl --location 'https://YourServiceRegion.api.cognitive.microsoft.com/speechtotext/transcriptions:transcribe?api-version=2025-10-15' \
--header 'Content-Type: multipart/form-data' \
--header 'Ocp-Apim-Subscription-Key: YourSpeechResourceKey' \
--form 'audio=@"YourAudioFile"' \
--form 'definition="{
"locales":["en-US"]}"'
Создайте определение формы в соответствии со следующими инструкциями:
- Задайте необязательное (но рекомендуемое)
localesсвойство, которое должно соответствовать ожидаемой локали аудиоданных для транскрибирования. В этом примере задана локальen-US. Дополнительную информацию о поддерживаемых языковых стандартах см. в разделе о поддерживаемых языках для технологии преобразования речи в текст.
Дополнительные сведения о locales и других свойствах API быстрого транскрибирования см. в разделе параметров конфигурации запроса далее в этом руководстве.
Ответ включает durationMillisecondsи offsetMillisecondsмногое другое. Свойство combinedPhrases содержит полные транскрибирования для всех выступающих.
{
"durationMilliseconds": 182439,
"combinedPhrases": [
{
"text": "Good afternoon. This is Sam. Thank you for calling Contoso. How can I help? Hi there. My name is Mary. I'm currently living in Los Angeles, but I'm planning to move to Las Vegas. I would like to apply for a loan. Okay. I see you're currently living in California. Let me make sure I understand you correctly. Uh You'd like to apply for a loan even though you'll be moving soon. Is that right? Yes, exactly. So I'm planning to relocate soon, but I would like to apply for the loan first so that I can purchase a new home once I move there. And are you planning to sell your current home? Yes, I will be listing it on the market soon and hopefully it'll sell quickly. That's why I'm applying for a loan now, so that I can purchase a new house in Nevada and close on it quickly as well once my current home sells. I see. Would you mind holding for a moment while I take your information down? Yeah, no problem. Thank you for your help. Mm-hmm. Just one moment. All right. Thank you for your patience, ma'am. May I have your first and last name, please? Yes, my name is Mary Smith. Thank you, Ms. Smith. May I have your current address, please? Yes. So my address is 123 Main Street in Los Angeles, California, and the zip code is 90923. Sorry, that was a 90 what? 90923. 90923 on Main Street. Got it. Thank you. May I have your phone number as well, please? Uh Yes, my phone number is 504-529-2351 and then yeah. 2351. Got it. And do you have an e-mail address we I can associate with this application? uh Yes, so my e-mail address is mary.a.sm78@gmail.com. Mary.a, was that a S-N as in November or M as in Mike? M as in Mike. Mike78, got it. Thank you. Ms. Smith, do you currently have any other loans? Uh Yes, so I currently have two other loans through Contoso. So my first one is my car loan and then my other is my student loan. They total about 1400 per month combined and my interest rate is 8%. I see. And you're currently paying those loans off monthly, is that right? Yes, of course I do. OK, thank you. Here's what I suggest we do. Let me place you on a brief hold again so that I can talk with one of our loan officers and get this started for you immediately. In the meantime, it would be great if you could take a few minutes and complete the remainder of the secure application online at www.contosoloans.com. Yeah, that sounds good. I can go ahead and get started. Thank you for your help. Thank you."
}
],
"phrases": [
{
"offsetMilliseconds": 960,
"durationMilliseconds": 640,
"text": "Good afternoon.",
"words": [
{
"text": "Good",
"offsetMilliseconds": 960,
"durationMilliseconds": 240
},
{
"text": "afternoon.",
"offsetMilliseconds": 1200,
"durationMilliseconds": 400
}
],
"locale": "en-US",
"confidence": 0.93554276
},
{
"offsetMilliseconds": 1600,
"durationMilliseconds": 640,
"text": "This is Sam.",
"words": [
{
"text": "This",
"offsetMilliseconds": 1600,
"durationMilliseconds": 240
},
{
"text": "is",
"offsetMilliseconds": 1840,
"durationMilliseconds": 120
},
{
"text": "Sam.",
"offsetMilliseconds": 1960,
"durationMilliseconds": 280
}
],
"locale": "en-US",
"confidence": 0.93554276
},
{
"offsetMilliseconds": 2240,
"durationMilliseconds": 1040,
"text": "Thank you for calling Contoso.",
"words": [
{
"text": "Thank",
"offsetMilliseconds": 2240,
"durationMilliseconds": 200
},
{
"text": "you",
"offsetMilliseconds": 2440,
"durationMilliseconds": 80
},
{
"text": "for",
"offsetMilliseconds": 2520,
"durationMilliseconds": 120
},
{
"text": "calling",
"offsetMilliseconds": 2640,
"durationMilliseconds": 200
},
{
"text": "Contoso.",
"offsetMilliseconds": 2840,
"durationMilliseconds": 440
}
],
"locale": "en-US",
"confidence": 0.93554276
},
{
"offsetMilliseconds": 3280,
"durationMilliseconds": 640,
"text": "How can I help?",
"words": [
{
"text": "How",
"offsetMilliseconds": 3280,
"durationMilliseconds": 120
},
{
"text": "can",
"offsetMilliseconds": 3440,
"durationMilliseconds": 120
},
{
"text": "I",
"offsetMilliseconds": 3560,
"durationMilliseconds": 40
},
{
"text": "help?",
"offsetMilliseconds": 3600,
"durationMilliseconds": 320
}
],
"locale": "en-US",
"confidence": 0.93554276
},
{
"offsetMilliseconds": 5040,
"durationMilliseconds": 400,
"text": "Hi there.",
"words": [
{
"text": "Hi",
"offsetMilliseconds": 5040,
"durationMilliseconds": 240
},
{
"text": "there.",
"offsetMilliseconds": 5280,
"durationMilliseconds": 160
}
],
"locale": "en-US",
"confidence": 0.93554276
},
{
"offsetMilliseconds": 5440,
"durationMilliseconds": 800,
"text": "My name is Mary.",
"words": [
{
"text": "My",
"offsetMilliseconds": 5440,
"durationMilliseconds": 80
},
{
"text": "name",
"offsetMilliseconds": 5520,
"durationMilliseconds": 120
},
{
"text": "is",
"offsetMilliseconds": 5640,
"durationMilliseconds": 80
},
{
"text": "Mary.",
"offsetMilliseconds": 5720,
"durationMilliseconds": 520
}
],
"locale": "en-US",
"confidence": 0.93554276
},
// More transcription results...
// Redacted for brevity
{
"offsetMilliseconds": 180320,
"durationMilliseconds": 680,
"text": "Thank you for your help.",
"words": [
{
"text": "Thank",
"offsetMilliseconds": 180320,
"durationMilliseconds": 160
},
{
"text": "you",
"offsetMilliseconds": 180480,
"durationMilliseconds": 80
},
{
"text": "for",
"offsetMilliseconds": 180560,
"durationMilliseconds": 120
},
{
"text": "your",
"offsetMilliseconds": 180680,
"durationMilliseconds": 120
},
{
"text": "help.",
"offsetMilliseconds": 180800,
"durationMilliseconds": 200
}
],
"locale": "en-US",
"confidence": 0.92022026
},
{
"offsetMilliseconds": 181960,
"durationMilliseconds": 280,
"text": "Thank you.",
"words": [
{
"text": "Thank",
"offsetMilliseconds": 181960,
"durationMilliseconds": 200
},
{
"text": "you.",
"offsetMilliseconds": 182160,
"durationMilliseconds": 80
}
],
"locale": "en-US",
"confidence": 0.92022026
}
]
}
Примечание
Служба синтеза речи является масштабируемой. Если вы получаете код ошибки 429 (превышено число запросов), следуйте передовым методам по смягчению ограничения во время автомасштабирования.
Параметры конфигурации запроса
Ниже приведены некоторые параметры свойств для настройки транскрипции при вызове операции Транскрипция — Транскрибировать.
| Свойство | Описание | Обязательный или необязательный |
|---|---|---|
channels |
Список отсчитываемых от нуля индексов каналов, которые необходимо транскрибировать отдельно. Поддерживается до двух каналов, если диаризация не включена. По умолчанию API быстрого транскрибирования объединяет все входные каналы в один канал, а затем выполняет транскрибирование. Если это не желательно, каналы могут быть транскрибированы независимо без объединения. Если вы хотите транскрибировать каналы из стереофонического звукового файла отдельно, необходимо указать [0,1], [0]или [1]. В противном случае стереофонический звук объединяется с моно и транскрибируется только один канал.Если звук стереофонический и включена диаризация, то невозможно установить свойство channels[0,1]. Служба распознавания речи не поддерживает разделение нескольких каналов.Для моно аудио channels свойство игнорируется, а звук всегда транскрибируется как один канал. |
Необязательный |
diarization |
Конфигурация диаризации. Диаризация — это процесс распознавания и разделения нескольких динамиков в одном звуковом канале. Например, укажите "diarization": {"maxSpeakers": 2, "enabled": true}. Затем файл транскрипции содержит speaker запись (например, "speaker": 0 или "speaker": 1) для каждой транскрибированной фразы. |
Необязательный |
locales |
Список локалей, которые должны соответствовать ожидаемой локали звуковых данных для транскрибирования. Если вы знаете языковую локаль звукового файла, вы можете указать её, чтобы повысить точность транскрибирования и уменьшить задержку. Если указана одна локаль, эта локаль используется для транскрипции. Но если вы не уверены в языковом стандарте, можно указать несколько языковых стандартов для использования идентификации языка. Идентификация языка может быть более точной с более детализированным списком кандидатных локалей. Если языковой стандарт не указан, Служба распознавания речи будет использовать последнюю многоязычную модель для непрерывного транскрибирования и определения языкового стандарта. Самые последние поддерживаемые языки можно получить с помощью REST API Transcriptions - Список поддерживаемых регионов (API версии 2024-11-15 или более поздней). Дополнительные сведения о локалях см. в документации службы речи по поддержке языков. |
Необязательно, но рекомендуется, если вы знаете предполагаемую локаль. |
phraseList |
Список фраз — это список слов или фраз, предоставляемых заранее, чтобы улучшить их распознавание. Добавление фразы в список фраз увеличивает его важность, что делает его более вероятным для распознавания. Например, укажите phraseList":{"phrases":["Contoso","Jessie","Rehaan"]}. Список фраз поддерживается через API версии 2025-10-15. Дополнительные сведения см. в разделе "Улучшение точности распознавания" со списком фраз. |
Необязательный |
profanityFilterMode |
Указывает способ обработки ненормативной лексики в результатах распознавания. Допустимые значения — None отключить фильтрацию ненормативной лексики, Masked заменить ненормативную лексику звездочками, Removed удалить все ненормативные выражения из результата или Tags добавить теги ненормативной лексики. Значение по умолчанию — Masked. |
Необязательный |
документация Reference | Package (PyPi) | GitHub Samples
Необходимые условия
- Подписка Azure. Создайте его бесплатно.
- Python версии 3.9 или более поздней. Если у вас нет подходящей версии Python, вы можете выполнить инструкции, описанные в руководстве по VS Code Python для простого способа установки Python в операционной системе.
- Ресурс Microsoft Foundry создан в одном из поддерживаемых регионов. Дополнительные сведения о доступности регионов см. в разделе "Поддержка регионов".
- Пример
.wavзвукового файла для транскрипции.
предварительные требования Microsoft Entra ID
Для рекомендуемой проверки подлинности без ключа с помощью Microsoft Entra ID необходимо:
- Установите Azure CLI, который используется для безключевой аутентификации в Microsoft Entra ID.
- Назначьте
Cognitive Services Userроль вашей учетной записи пользователя. Роли можно назначить на портале Azure в разделе Access control (IAM)>Add role assignment.
Установка
Создайте новую папку с именем
transcription-quickstartи перейдите в папку быстрого запуска с помощью следующей команды:mkdir transcription-quickstart && cd transcription-quickstartСоздайте и активируйте виртуальную среду Python для установки пакетов, необходимых для этого руководства. Мы рекомендуем всегда использовать виртуальную или конда-среду при установке пакетов Python. В противном случае можно разорвать глобальную установку Python. Если у вас уже установлена Python 3.9 или более поздней версии, создайте виртуальную среду с помощью следующих команд:
При активации среды Python выполнение
pythonилиpipиз командной строки использует интерпретатор Python в папке.venvприложения. Используйте командуdeactivateдля выхода из виртуальной среды Python. При необходимости его можно повторно активировать.Создайте файл с именемrequirements.txt. Добавьте в файл следующие пакеты:
azure-ai-transcription azure-identityУстановите пакеты:
pip install -r requirements.txt
Получение сведений о ресурсе
Для проверки подлинности необходимо получить конечную точку ресурса и ключ API.
Войдите на портал Foundry.
Выберите центр управления в меню слева. В разделе Подключенные ресурсы выберите ресурс для работы с речью или многосервисный ресурс.
Выберите ключи и конечную точку.
Скопируйте значения конечной точки и ключа . Используйте эти значения для задания переменных среды.
Задайте следующие переменные среды:
Примечание
Для проверки подлинности Microsoft Entra ID (рекомендуется для рабочей среды), установите azure-identity и настройте проверку подлинности, как описано в разделе Microsoft Entra ID предварительные требования.
Код
Создайте файл с именем
transcribe_audio_file.pyсо следующим кодом:import os from azure.core.credentials import AzureKeyCredential from azure.ai.transcription import TranscriptionClient from azure.ai.transcription.models import TranscriptionContent, TranscriptionOptions # Get configuration from environment variables endpoint = os.environ["AZURE_SPEECH_ENDPOINT"] api_key = os.environ["AZURE_SPEECH_API_KEY"] # Create the transcription client client = TranscriptionClient(endpoint=endpoint, credential=AzureKeyCredential(api_key)) # Path to your audio file (replace with your own file path) audio_file_path = "<path-to-your-audio-file.wav>" # Open and read the audio file with open(audio_file_path, "rb") as audio_file: # Create transcription options options = TranscriptionOptions(locales=["en-US"]) # Specify the language # Create the request content request_content = TranscriptionContent(definition=options, audio=audio_file) # Transcribe the audio result = client.transcribe(request_content) # Print the transcription result print(f"Transcription: {result.combined_phrases[0].text}") # Print detailed phrase information if result.phrases: print("\nDetailed phrases:") for phrase in result.phrases: print( f" [{phrase.offset_milliseconds}ms - " f"{phrase.offset_milliseconds + phrase.duration_milliseconds}ms]: " f"{phrase.text}" )Справочник. ТранскрипцияClient | ТранскрипцияContent | ТранскрипцияOptions | AzureKeyCredential
Замените
<path-to-your-audio-file.wav>путь к звуковому файлу. Служба поддерживает WAV, MP3, FLAC, OGG и другие распространенные звуковые форматы.Запустите скрипт Python:
python transcribe_audio_file.py
Выход
Скрипт выводит результат транскрибирования в консоль:
Transcription: Hi there! This is a sample voice recording created for speech synthesis testing. The quick brown fox jumps over the lazy dog. Just a fun way to include every letter of the alphabet. Numbers, like 1, 2, 3, are spoken clearly. Let's see how well this voice captures tone, timing, and natural rhythm. This audio is provided by samplefiles.com.
Detailed phrases:
[40ms - 4880ms]: Hi there! This is a sample voice recording created for speech synthesis testing.
[5440ms - 8400ms]: The quick brown fox jumps over the lazy dog.
[9040ms - 12240ms]: Just a fun way to include every letter of the alphabet.
[12720ms - 16720ms]: Numbers, like 1, 2, 3, are spoken clearly.
[17200ms - 22000ms]: Let's see how well this voice captures tone, timing, and natural rhythm.
[22480ms - 25920ms]: This audio is provided by samplefiles.com.
Параметры конфигурации запроса
Используется TranscriptionOptions для настройки поведения транскрибирования. В следующих разделах описана каждая поддерживаемая конфигурация и показано, как применить ее.
Обнаружение нескольких языков
Передайте несколько кандидатов локалей в locales для включения идентификации языка. Служба определяет, какой язык используется, и помечает каждую фразу обнаруженной локалью. Опустить locales полностью, чтобы служба автоматически обнаруживла все языки без списка кандидатов.
from azure.core.credentials import AzureKeyCredential
from azure.ai.transcription import TranscriptionClient
from azure.ai.transcription.models import TranscriptionContent, TranscriptionOptions
client = TranscriptionClient(
endpoint=endpoint, credential=AzureKeyCredential(api_key)
)
with open(audio_file_path, "rb") as audio_file:
# Provide candidate locales — the service selects the best match per phrase
options = TranscriptionOptions(locales=["en-US", "es-ES", "fr-FR", "de-DE"])
result = client.transcribe(TranscriptionContent(definition=options, audio=audio_file))
for phrase in result.phrases:
locale = phrase.locale if phrase.locale else "detected"
print(f"[{locale}] {phrase.text}")
Ссылка: TranscriptionOptions
Диаризация динамиков
Diarization обнаруживает и метки разных динамиков в одном звуковом канале.
TranscriptionDiarizationOptions Создайте объект с максимальным ожидаемым количеством спикеров (2–35) и передайте его в TranscriptionOptions. Каждая фраза в результате содержит speaker идентификатор.
from azure.core.credentials import AzureKeyCredential
from azure.ai.transcription import TranscriptionClient
from azure.ai.transcription.models import (
TranscriptionContent,
TranscriptionOptions,
TranscriptionDiarizationOptions,
)
client = TranscriptionClient(
endpoint=endpoint, credential=AzureKeyCredential(api_key)
)
with open(audio_file_path, "rb") as audio_file:
diarization_options = TranscriptionDiarizationOptions(
max_speakers=5 # Hint for maximum number of speakers (2-35)
)
options = TranscriptionOptions(
locales=["en-US"], diarization_options=diarization_options
)
result = client.transcribe(TranscriptionContent(definition=options, audio=audio_file))
for phrase in result.phrases:
speaker = phrase.speaker if phrase.speaker is not None else "Unknown"
print(f"Speaker {speaker} [{phrase.offset_milliseconds}ms]: {phrase.text}")
Примечание
Diarization поддерживается только в одноканальном (моно) аудиофайле. Если ваш звук в формате стерео, не устанавливайте свойство channels в значение [0, 1], если включена диаризация.
Справочник: TranscriptionDiarizationOptions, TranscriptionOptions
Список фраз
Список фраз повышает точность распознавания для конкретных терминов, правильных существительных и необычных слов. Установите biasing_weight между 1.0 и 20.0 чтобы контролировать, насколько сильно фразы благоприятны (более высокие значения увеличивают предвзятость).
from azure.core.credentials import AzureKeyCredential
from azure.ai.transcription import TranscriptionClient
from azure.ai.transcription.models import (
TranscriptionContent,
TranscriptionOptions,
PhraseListProperties,
)
client = TranscriptionClient(
endpoint=endpoint, credential=AzureKeyCredential(api_key)
)
with open(audio_file_path, "rb") as audio_file:
phrase_list = PhraseListProperties(
phrases=["Contoso", "Jessie", "Rehaan"],
biasing_weight=5.0, # Weight between 1.0 and 20.0
)
options = TranscriptionOptions(locales=["en-US"], phrase_list=phrase_list)
result = client.transcribe(TranscriptionContent(definition=options, audio=audio_file))
print(result.combined_phrases[0].text)
Дополнительные сведения см. в разделе "Улучшение точности распознавания" со списком фраз.
Справочник: PhraseListProperties, TranscriptionOptions
Фильтрация ненормативной лексики
Контролируйте отображение ненормативной лексики в результатах транскрипции с помощью параметра profanity_filter_mode. Доступны следующие режимы:
| Режим | Поведение |
|---|---|
"None" |
Ненормативная лексика проходит без изменений. |
"Masked" |
Ненормативность заменяется звездочками (по умолчанию). |
"Removed" |
Ненормативная лексика полностью удаляется из выходных данных. |
"Tags" |
Ненормативность упаковывается в <profanity> XML-теги. |
from azure.core.credentials import AzureKeyCredential
from azure.ai.transcription import TranscriptionClient
from azure.ai.transcription.models import TranscriptionContent, TranscriptionOptions
client = TranscriptionClient(
endpoint=endpoint, credential=AzureKeyCredential(api_key)
)
with open(audio_file_path, "rb") as audio_file:
options = TranscriptionOptions(
locales=["en-US"],
profanity_filter_mode="Masked" # Options: "None", "Removed", "Masked", "Tags"
)
result = client.transcribe(TranscriptionContent(definition=options, audio=audio_file))
print(result.combined_phrases[0].text)
Ссылка: TranscriptionOptions
справочная документация
Необходимые условия
- Подписка Azure. Создайте его бесплатно.
- SDK .NET 8.0 или более поздней версии.
- Ресурс Microsoft Foundry создан в одном из поддерживаемых регионов. Дополнительные сведения о доступности регионов см. в разделе "Поддержка регионов".
- Пример
.wavзвукового файла для транскрипции.
предварительные требования Microsoft Entra ID
Для рекомендуемой проверки подлинности без ключа с помощью Microsoft Entra ID необходимо:
- Установите Azure CLI, который используется для безключевой аутентификации в Microsoft Entra ID.
- Войдите с помощью Azure CLI, выполнив
az login. - Назначьте
Cognitive Services Userроль вашей учетной записи пользователя. Роли можно назначить на портале Azure в разделе Access control (IAM)>Add role assignment.
Настройка проекта
Создайте консольное приложение с помощью интерфейса командной строки .NET:
dotnet new console -n transcription-quickstart cd transcription-quickstartУстановите необходимые пакеты:
dotnet add package Azure.AI.Speech.Transcription --prerelease dotnet add package Azure.Identity
Получение сведений о ресурсе
Для аутентификации необходимо получить конечную точку ресурса.
Войдите на портал Foundry.
Выберите центр управления в меню слева. В разделе Подключенные ресурсы выберите ресурс для работы с речью или многосервисный ресурс.
Выберите ключи и конечную точку.
Скопируйте значение конечной точки и задайте его в качестве переменной среды:
$env:AZURE_SPEECH_ENDPOINT="<your-speech-endpoint>"
Транскрибирование звука
Замените содержимое Program.cs следующим кодом:
using System;
using System.ClientModel;
using System.Linq;
using System.Threading.Tasks;
using Azure.AI.Speech.Transcription;
using Azure.Identity;
Uri endpoint = new Uri(Environment.GetEnvironmentVariable("AZURE_SPEECH_ENDPOINT")
?? throw new InvalidOperationException("Set the AZURE_SPEECH_ENDPOINT environment variable."));
// Use DefaultAzureCredential for keyless authentication (recommended).
// To use an API key instead, replace with:
// ApiKeyCredential credential = new ApiKeyCredential("<your-api-key>");
var credential = new DefaultAzureCredential();
TranscriptionClient client = new TranscriptionClient(endpoint, credential);
string audioFilePath = "<path-to-your-audio-file.wav>";
using FileStream audioStream = File.OpenRead(audioFilePath);
TranscriptionOptions options = new TranscriptionOptions(audioStream);
ClientResult<TranscriptionResult> response = await client.TranscribeAsync(options);
var channelPhrases = response.Value.PhrasesByChannel.First();
Console.WriteLine(channelPhrases.Text);
Запустите приложение:
dotnet run
Транскрибированные тексты из звукового файла печатаются в консоли.
Доступ к деталям на уровне слов
Чтобы получить доступ к меткам времени, оценке достоверности и отдельным словам, выполните итерацию по фразам:
var channelPhrases = response.Value.PhrasesByChannel.First();
foreach (TranscribedPhrase phrase in channelPhrases.Phrases)
{
Console.WriteLine($"\nPhrase: {phrase.Text}");
Console.WriteLine($" Offset: {phrase.Offset} | Duration: {phrase.Duration}");
Console.WriteLine($" Confidence: {phrase.Confidence:F2}");
foreach (TranscribedWord word in phrase.Words)
{
Console.WriteLine(
$" Word: '{word.Text}' | " +
$"Confidence: {word.Confidence:F2} | " +
$"Offset: {word.Offset}");
}
}
Справочник: TranscribedPhrase, TranscribedWord
Идентификация спикеров с диаризацией
Диаризация динамиков определяет, кто говорил при использовании аудио с несколькими динамиками:
TranscriptionOptions options = new TranscriptionOptions(audioStream)
{
DiarizationOptions = new TranscriptionDiarizationOptions
{
MaxSpeakers = 4
}
};
ClientResult<TranscriptionResult> response = await client.TranscribeAsync(options);
var channelPhrases = response.Value.PhrasesByChannel.First();
foreach (TranscribedPhrase phrase in channelPhrases.Phrases)
{
Console.WriteLine($"Speaker {phrase.Speaker}: {phrase.Text}");
}
Ссылка: TranscriptionDiarizationOptions
Справочная документация | Пакет (npm) | Примеры GitHub
Необходимые условия
- Подписка Azure. Создайте его бесплатно.
- Node.js LTS.
- Ресурс Microsoft Foundry создан в одном из поддерживаемых регионов. Дополнительные сведения о доступности регионов см. в разделе "Поддержка регионов".
- Пример
.wavзвукового файла для транскрипции.
предварительные требования Microsoft Entra ID
Для рекомендуемой проверки подлинности без ключа с помощью Microsoft Entra ID необходимо:
- Установите Azure CLI, который используется для безключевой аутентификации в Microsoft Entra ID.
- Войдите с помощью Azure CLI, выполнив
az login. - Назначьте
Cognitive Services Userроль вашей учетной записи пользователя. Роли можно назначить на портале Azure в разделе Access control (IAM)>Add role assignment.
Настройка проекта
Создайте папку и инициализируйте проект Node.js:
mkdir transcription-quickstart cd transcription-quickstart npm init -yУстановите необходимые пакеты:
npm install @azure/ai-speech-transcription @azure/identityНастройте проект для использования модулей ES, добавив тип модуля в ваш
package.json:npm pkg set type=moduleИли вручную добавьте
"type": "module"вpackage.jsonфайл. Это необходимо для того, чтобыimportоператоры в примере кода работали.
Получение сведений о ресурсе
Для аутентификации необходимо получить конечную точку ресурса.
Войдите на портал Foundry.
Выберите центр управления в меню слева. В разделе Подключенные ресурсы выберите ресурс для работы с речью или многосервисный ресурс.
Выберите ключи и конечную точку.
Скопируйте значение конечной точки и задайте его в качестве переменной среды:
Транскрибирование звука
Создайте файл с именем
transcribe-audio-file.jsсо следующим кодом:import { readFileSync } from "node:fs"; import { DefaultAzureCredential } from "@azure/identity"; import { TranscriptionClient } from "@azure/ai-speech-transcription"; const endpoint = process.env.AZURE_SPEECH_ENDPOINT; if (!endpoint) { throw new Error("Set the AZURE_SPEECH_ENDPOINT environment variable."); } // Use DefaultAzureCredential for keyless authentication (recommended). const client = new TranscriptionClient(endpoint, new DefaultAzureCredential()); const audioFile = readFileSync("<path-to-your-audio-file.wav>"); const result = await client.transcribe(audioFile, { locales: ["en-US"], }); console.log("Transcription:", result.combinedPhrases[0]?.text ?? "No text");Референс: TranscriptionClient | DefaultAzureCredential
Замените
<path-to-your-audio-file.wav>путь к звуковому файлу.Запустите приложение:
node transcribe-audio-file.js
Выход
Приложение выводит транскрибированные тексты в консоль:
Transcription: Hi there! This is a sample voice recording.
Распространенные параметры запроса
Идентификация спикеров с диаризацией
const result = await client.transcribe(audioFile, {
locales: ["en-US"],
diarizationOptions: {
maxSpeakers: 4,
},
});
for (const phrase of result.phrases) {
console.log(`Speaker ${phrase.speaker}: ${phrase.text}`);
}
Справочник: ТранскрибированиеОпцииДиаризации
Настройка фильтрации ненормативной лексики
import {
KnownProfanityFilterModes,
} from "@azure/ai-speech-transcription";
const result = await client.transcribe(audioFile, {
locales: ["en-US"],
profanityFilterMode: KnownProfanityFilterModes.Masked,
});
Справочник: KnownProfanityFilterModes
Добавление списка фраз
Используйте список фраз для улучшения распознавания терминов, правильных существительных и акронимов:
const result = await client.transcribe(audioFile, {
locales: ["en-US"],
phraseList: {
phrases: ["Contoso", "Jessie", "Rehaan"],
},
});
console.log("Transcription:", result.combinedPhrases[0]?.text ?? "No text");
Справочник: PhraseListProperties
Включение многоязычного обнаружения
Если вы не уверены, какой язык используется, передайте несколько возможных локалей. Сервис определяет язык и возвращает региональные параметры для каждой фразы.
const result = await client.transcribe(audioFile, {
locales: ["en-US", "es-ES"],
});
for (const phrase of result.phrases) {
console.log(`[${phrase.locale}] ${phrase.text}`);
}
Справочник: TranscribedPhrase
документация Reference | Package (Maven) | GitHub Samples
Необходимые условия
- Подписка Azure. Создайте его бесплатно.
- Java комплект средств разработки (JDK) 8 или более поздней версии.
- Apache Maven для управления зависимостями и создания проекта.
- Ресурс Microsoft Foundry в одном из поддерживаемых регионов. Для получения дополнительной информации о доступности регионов см. в разделе Поддерживаемые регионы службы "Речь".
- Пример
.wavзвукового файла для транскрипции.
Настройка среды
Создайте новую папку с именем
transcription-quickstartи перейдите к ней:mkdir transcription-quickstart && cd transcription-quickstartpom.xmlСоздайте файл в корневом каталоге проекта со следующим содержимым:<?xml version="1.0" encoding="UTF-8"?> <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.example</groupId> <artifactId>transcription-quickstart</artifactId> <version>1.0.0</version> <packaging>jar</packaging> <name>Speech Transcription Quickstart</name> <description>Quickstart sample for Azure Speech Transcription client library.</description> <url>https://github.com/Azure/azure-sdk-for-java</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>com.azure</groupId> <artifactId>azure-ai-speech-transcription</artifactId> <version>1.0.0-beta.2</version> </dependency> <dependency> <groupId>com.azure</groupId> <artifactId>azure-identity</artifactId> <version>1.18.1</version> </dependency> </dependencies> <build> <sourceDirectory>.</sourceDirectory> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.1.0</version> <configuration> <mainClass>TranscriptionQuickstart</mainClass> </configuration> </plugin> </plugins> </build> </project>Примечание
Конфигурация
<sourceDirectory>.</sourceDirectory>указывает Maven искать Java исходные файлы в текущем каталоге вместо структурыsrc/main/javaпо умолчанию. Это изменение конфигурации позволяет упростить структуру неструктурированного проекта.Установите необходимые зависимости:
mvn clean install
Задание переменных среды
Приложение должно пройти проверку подлинности для доступа к службе "Речь". Пакет SDK поддерживает как проверку подлинности с помощью ключа API, так и Microsoft Entra ID. Он автоматически определяет метод, используемый на основе заданных переменных среды.
Сначала задайте конечную точку для ресурса распознавания речи. Замените <your-speech-endpoint> фактическим именем ресурса:
Затем выберите один из следующих методов проверки подлинности:
Вариант 1. Проверка подлинности ключа API (рекомендуется для начала работы)
Задайте переменную среды ключа API:
Вариант 2. Проверка подлинности Microsoft Entra ID (рекомендуется для рабочей среды)
Вместо параметра AZURE_SPEECH_API_KEYнастройте один из следующих источников учетных данных:
-
Azure CLI: запустите
az loginна компьютере разработки. - Managed Identity: для приложений, работающих в Azure (служба приложений, Функции Azure, виртуальные машины).
-
Переменные среды: установите
AZURE_TENANT_ID,AZURE_CLIENT_ID, иAZURE_CLIENT_SECRET. - Visual Studio Code или IntelliJ: войдите через интегрированную среду разработки.
Вам также необходимо назначить роль Cognitive Services User вашему удостоверению:
az role assignment create --assignee <your-identity> \
--role "Cognitive Services User" \
--scope /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<speech-resource-name>
Примечание
После задания переменных среды в Windows перезапустите все запущенные программы, которые должны читать их, включая окно консоли. В Linux или macOS запустите source ~/.bashrc (или эквивалентный файл конфигурации оболочки), чтобы внести изменения в силу.
Создание приложения
Создайте файл с именем TranscriptionQuickstart.java в каталоге проекта с помощью следующего кода:
import com.azure.ai.speech.transcription.TranscriptionClient;
import com.azure.ai.speech.transcription.TranscriptionClientBuilder;
import com.azure.ai.speech.transcription.models.AudioFileDetails;
import com.azure.ai.speech.transcription.models.TranscriptionOptions;
import com.azure.ai.speech.transcription.models.TranscriptionResult;
import com.azure.core.credential.KeyCredential;
import com.azure.core.util.BinaryData;
import com.azure.identity.DefaultAzureCredentialBuilder;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class TranscriptionQuickstart {
public static void main(String[] args) {
try {
// Get credentials from environment variables
String endpoint = System.getenv("AZURE_SPEECH_ENDPOINT");
String apiKey = System.getenv("AZURE_SPEECH_API_KEY");
// Create client with API key or Entra ID authentication
TranscriptionClientBuilder builder = new TranscriptionClientBuilder()
.endpoint(endpoint);
TranscriptionClient client;
if (apiKey != null && !apiKey.isEmpty()) {
// Use API key authentication
client = builder.credential(new KeyCredential(apiKey)).buildClient();
} else {
// Use Entra ID authentication
client = builder.credential(new DefaultAzureCredentialBuilder().build()).buildClient();
}
// Load audio file
String audioFilePath = "<path-to-your-audio-file.wav>";
byte[] audioData = Files.readAllBytes(Paths.get(audioFilePath));
// Create audio file details
AudioFileDetails audioFileDetails = new AudioFileDetails(BinaryData.fromBytes(audioData));
// Transcribe
TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
TranscriptionResult result = client.transcribe(options);
// Print result
System.out.println("Transcription:");
result.getCombinedPhrases().forEach(phrase ->
System.out.println(phrase.getText())
);
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
Замените <path-to-your-audio-file.wav> путь к звуковому файлу.
Запуск приложения
Запустите приложение с помощью Maven:
mvn compile exec:java
Параметры конфигурации запроса
Используется TranscriptionOptions для настройки поведения транскрибирования. В следующих разделах описана каждая поддерживаемая конфигурация и показано, как применить ее.
Обнаружение нескольких языков
Если языковой стандарт не указан, служба автоматически обнаруживает и транскрибирует все языки, присутствующие в звуке. Каждая возвращаемая фраза содержит locale поле, определяющее обнаруженный язык.
// No locale specified — service auto-detects all languages in the audio
TranscriptionOptions options = new TranscriptionOptions(audioFileDetails);
TranscriptionResult result = client.transcribe(options);
// Each phrase reports the detected locale
result.getPhrases().forEach(phrase ->
System.out.println(phrase.getLocale() + ": " + phrase.getText())
);
Примечание
Если языковой стандарт не указан, locale поле отдельных фраз может не всегда точно отражать точный язык конкретной фразы.
Для максимальной точности укажите ожидаемый языковой стандарт, если он вам известен.
Справочник: TranscriptionOptions, TranscribedPhrase.getLocale()
Диаризация динамиков
Diarization обнаруживает и метки разных динамиков в одном звуковом канале. Используется TranscriptionDiarizationOptions для включения и задания максимального ожидаемого количества динамиков (2–36). Каждая фраза в результате содержит speaker идентификатор.
import com.azure.ai.speech.transcription.models.TranscriptionDiarizationOptions;
// Configure diarization with a maximum of 5 speakers
TranscriptionDiarizationOptions diarizationOptions =
new TranscriptionDiarizationOptions()
.setMaxSpeakers(5);
TranscriptionOptions options = new TranscriptionOptions(audioFileDetails)
.setDiarizationOptions(diarizationOptions);
TranscriptionResult result = client.transcribe(options);
// Each phrase includes the detected speaker ID
result.getPhrases().forEach(phrase ->
System.out.println(
"[Speaker " + phrase.getSpeaker() + "] " + phrase.getText()
)
);
Примечание
Diarization поддерживается только в одноканальном (моно) аудиофайле. Если ваш звук в формате стерео, не устанавливайте свойство channels в значение [0,1], если включена диаризация.
Справочник: TranscriptionDiarizationOptions, TranscriptionOptions.setDiarizationOptions()TranscribedPhrase.getSpeaker()
Список фраз
Список фраз повышает точность распознавания для конкретных терминов, правильных существительных и необычных слов. Добавляемые фразы в значительной степени взвешиваются распознавателем, что увеличивает вероятность их правильной транскрипции.
import com.azure.ai.speech.transcription.models.PhraseListOptions;
import java.util.Arrays;
// Add terms that appear in your audio to improve recognition
PhraseListOptions phraseListOptions = new PhraseListOptions()
.setPhrases(Arrays.asList("Contoso", "Jessie", "Rehaan"));
TranscriptionOptions options = new TranscriptionOptions(audioFileDetails)
.setPhraseListOptions(phraseListOptions);
TranscriptionResult result = client.transcribe(options);
result.getCombinedPhrases().forEach(phrase ->
System.out.println(phrase.getText())
);
Дополнительные сведения см. в разделе "Улучшение точности распознавания" со списком фраз.
Справочник: PhraseListOptions, TranscriptionOptions.setPhraseListOptions()
Фильтрация ненормативной лексики
Настройте отображение ненормативной лексики в выходных данных транскрибирования с помощью ProfanityFilterMode. Доступны следующие режимы:
| Режим | Поведение |
|---|---|
NONE |
Ненормативная лексика проходит без изменений. |
MASKED |
Ненормативность заменяется звездочками (по умолчанию). |
REMOVED |
Ненормативная лексика полностью удаляется из выходных данных. |
TAGS |
Ненормативность упаковывается в XML-теги. |
import com.azure.ai.speech.transcription.models.ProfanityFilterMode;
TranscriptionOptions options = new TranscriptionOptions(audioFileDetails)
.setProfanityFilterMode(ProfanityFilterMode.MASKED);
TranscriptionResult result = client.transcribe(options);
System.out.println(result.getCombinedPhrases().get(0).getText());
Справочник: ProfanityFilterMode, TranscriptionOptions.setProfanityFilterMode()
Очистка ресурсов
Когда вы закончите работу с быстрым стартом, вы можете удалить папку проекта.
rm -rf transcription-quickstart
Обработка ошибок транскрибирования
При вызове API быстрого транскрибирования реализуйте логику повторных попыток для обработки временных ошибок и ограничения скорости. API применяет ограничения скорости, что может привести к ошибке во время операций с высоким параллелизмом.
Рекомендуемая конфигурация повторных попыток
Повторите попытку до пяти раз при временных ошибках.
Используйте экспоненциальный отступ: 2 секунды, 4 с, 8 с, 16 с, 32 с.
Общее время отката: 62 с.
Эта конфигурация предоставляет достаточно времени для восстановления API в интервалах ограничения скорости, особенно при выполнении пакетных операций с несколькими параллельными рабочими.
Когда следует использовать логику повторных попыток
Реализуйте логику повторных попыток для следующих категорий ошибок:
Ошибки HTTP — повторите попытку в:
- HTTP 429 (ограничение скорости)
- HTTP 500, 502, 503, 504 (ошибки сервера)
-
status_code=None(неполные загрузки данных ответов)
Azure SDK сетевые ошибки — повторите попытку:
ServiceRequestErrorServiceResponseError
Эти ошибки перехватывают исключения сети низкого уровня, такие как
urllib3.exceptions.ReadTimeoutError, сброс соединения и сбои TLS.Python сетевые исключения — повторить при:
ConnectionErrorTimeoutErrorOSError
Не повторяйте следующие ошибки, так как они указывают на проблемы на стороне клиента, требующие исправления:
- HTTP 400 (недопустимый запрос)
- HTTP 401 (несанкционированный)
- HTTP 422 (необрабатываемый объект)
- Другие ошибки клиента (коды состояния 4xx)
Заметки о реализации
Сбросьте поток аудиофайла (
seek(0)) перед каждой попыткой повтора.При использовании параллельных рабочих ролей время ожидания чтения HTTP по умолчанию (300 секунд) может быть превышено при ограничении высокой скорости.
API может принять запрос, но истекло время ожидания при создании ответа. Это условие может отображаться как ошибка, упаковаемая в пакет SDK, а не стандартная ошибка HTTP.