Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
API REST преобразования речи в текст: справка | API REST преобразования речи в текст для краткой аудиозаписи: справка | Дополнительные примеры на GitHub
Availability
REST API поддерживает перевод речи, но мы еще не включили в эту статью руководство по использованию REST API. Выберите другой язык программирования, чтобы приступить к работе и ознакомиться с основными понятиями.
Справочные примеры пакета документации | (PyPi) | Дополнительные примеры на GitHub
Из этого руководства вы узнаете, как распознать человеческую речь и перевести ее на другой язык.
В разделе с общими сведениями о переводе речи вы сможете получить дополнительную информацию по следующим темам:
- преобразование речи в текст;
- перевод речи на несколько целевых языков;
- Прямой перевод речи в речь
Конфиденциальные данные и переменные среды
Пример исходного кода в этой статье зависит от системных переменных для хранения конфиденциальных данных, таких как ключ подписки и регион ресурса Speech. Файл кода на языке Python содержит два значения, которые назначаются из переменных среды компьютера узла: SPEECH__SUBSCRIPTION__KEY и SPEECH__SERVICE__REGION. Обе эти переменные находятся в глобальной области видимости, что делает их доступными в определении функции в файле кода:
speech_key, service_region = os.environ['SPEECH__SUBSCRIPTION__KEY'], os.environ['SPEECH__SERVICE__REGION']
Дополнительные сведения о переменных среды см. в разделе Переменные среды и конфигурация приложения.
Внимание
Используйте ключи API с осторожностью. Не включайте ключ API непосредственно в код и никогда не публикуйте его. Если вы используете ключ API, сохраните его безопасно в Azure Key Vault. Дополнительные сведения об использовании ключей API безопасно в приложениях см. в разделе "Ключи API" с помощью Azure Key Vault.
Дополнительные сведения о безопасности служб ИИ см. в статье "Проверка подлинности запросов к службам ИИ Azure".
Создание конфигурации перевода речи
Чтобы вызвать службу "Речь" с помощью пакета SDK для службы "Речь", необходимо создать экземпляр SpeechTranslationConfig. Этот класс содержит сведения о ресурсе речевой службы, таких как ваш ключ и связанный регион, конечная точка, хост или маркер авторизации.
Совет
Независимо от того, используете ли вы распознавание речи, синтез речи, перевод или распознавание намерения, вы всегда создаете конфигурацию.
Инициализировать SpeechTranslationConfig можно несколькими способами:
- По подписке: введите ключ и соответствующую ему область.
- Укажите конечную точку службы распознавания речи. Ключ или маркер авторизации являются необязательными.
- Для узла: передайте адрес узла. Ключ или маркер авторизации являются необязательными.
- Используя токен авторизации, укажите его и сопутствующий регион.
Давайте посмотрим, как создать экземпляр SpeechTranslationConfig с помощью ключа и региона. Получите ключ и регион ресурса службы "Речь" на портале Azure.
from_language, to_language = 'en-US', 'de'
def translate_speech_to_text():
translation_config = speechsdk.translation.SpeechTranslationConfig(
subscription=speech_key, region=service_region)
Изменение исходного языка
Распространенной задачей перевода речи является определение языка ввода (или исходного языка). В следующем примере показано, как изменить язык ввода на итальянский. Во время работы с кодом взаимодействуйте с экземпляром SpeechTranslationConfig, присваивая его свойству speech_recognition_language.
def translate_speech_to_text():
translation_config = speechsdk.translation.SpeechTranslationConfig(
subscription=speech_key, region=service_region)
# Source (input) language
from_language = "it-IT"
translation_config.speech_recognition_language = from_language
Свойство speech_recognition_language принимает строку формата языкового стандарта. Ознакомьтесь со списком поддерживаемых локалей перевода речи.
Добавление языка перевода
Другой распространенной задачей перевода речи является указание целевых языков перевода. Необходимо указать по крайней мере один язык, при этом поддерживается и несколько языков. В следующем фрагменте кода в качестве целевых языков перевода задаются французский и немецкий языки:
def translate_speech_to_text():
translation_config = speechsdk.translation.SpeechTranslationConfig(
subscription=speech_key, region=service_region)
translation_config.speech_recognition_language = "it-IT"
# Translate to languages. See, https://aka.ms/speech/sttt-languages
translation_config.add_target_language("fr")
translation_config.add_target_language("de")
При каждом вызове метода add_target_language указывается новый целевой язык перевода. Иными словами, при распознавании речи на исходном языке каждый целевой перевод доступен как часть результирующей операции перевода.
Инициализация распознавателя перевода
После создания экземпляра SpeechTranslationConfig следующим шагом является инициализация TranslationRecognizer. При инициализации TranslationRecognizer необходимо передать ему экземпляр translation_config. Этот объект конфигурации предоставляет учетные данные, необходимые службе "Речь" для проверки запроса.
Если вы распознаете речь с помощью стандартного микрофона вашего устройства, вот как должен выглядеть TranslationRecognizer:
def translate_speech_to_text():
translation_config = speechsdk.translation.SpeechTranslationConfig(
subscription=speech_key, region=service_region)
translation_config.speech_recognition_language = from_language
translation_config.add_target_language(to_language)
translation_recognizer = speechsdk.translation.TranslationRecognizer(
translation_config=translation_config)
Если вы хотите указать входное аудиоустройство, необходимо создать экземпляр класса AudioConfig и указать параметр audio_config при инициализации TranslationRecognizer.
Во-первых, создайте ссылку на объект AudioConfig следующим образом:
def translate_speech_to_text():
translation_config = speechsdk.translation.SpeechTranslationConfig(
subscription=speech_key, region=service_region)
translation_config.speech_recognition_language = from_language
for lang in to_languages:
translation_config.add_target_language(lang)
audio_config = speechsdk.audio.AudioConfig(use_default_microphone=True)
translation_recognizer = speechsdk.translation.TranslationRecognizer(
translation_config=translation_config, audio_config=audio_config)
Если вы хотите предоставить звуковой файл, а не использовать микрофон, вам по-прежнему нужно указать параметр audioConfig. Однако при создании экземпляра класса AudioConfig вместо вызова use_default_microphone=True необходимо вызвать filename="path-to-file.wav" и передать параметр filename:
def translate_speech_to_text():
translation_config = speechsdk.translation.SpeechTranslationConfig(
subscription=speech_key, region=service_region)
translation_config.speech_recognition_language = from_language
for lang in to_languages:
translation_config.add_target_language(lang)
audio_config = speechsdk.audio.AudioConfig(filename="path-to-file.wav")
translation_recognizer = speechsdk.translation.TranslationRecognizer(
translation_config=translation_config, audio_config=audio_config)
Перевод речи
Чтобы перевести речь, пакет SDK для службы "Речь" использует микрофон или входной звуковой файл. Перед переводом речи выполняется распознавание речи. После инициализации всех объектов вызовите функцию распознавания один раз и получите результат.
import os
import azure.cognitiveservices.speech as speechsdk
speech_key, service_region = os.environ['SPEECH__SERVICE__KEY'], os.environ['SPEECH__SERVICE__REGION']
from_language, to_languages = 'en-US', 'de'
def translate_speech_to_text():
translation_config = speechsdk.translation.SpeechTranslationConfig(
subscription=speech_key, region=service_region)
translation_config.speech_recognition_language = from_language
translation_config.add_target_language(to_language)
translation_recognizer = speechsdk.translation.TranslationRecognizer(
translation_config=translation_config)
print('Say something...')
translation_recognition_result = translation_recognizer.recognize_once()
print(get_result_text(reason=translation_recognition_result.reason, result=translation_recognition_result))
def get_result_text(reason, translation_recognition_result):
reason_format = {
speechsdk.ResultReason.TranslatedSpeech:
f'RECOGNIZED "{from_language}": {translation_recognition_result.text}\n' +
f'TRANSLATED into "{to_language}"": {translation_recognition_result.translations[to_language]}',
speechsdk.ResultReason.RecognizedSpeech: f'Recognized: "{translation_recognition_result.text}"',
speechsdk.ResultReason.NoMatch: f'No speech could be recognized: {translation_recognition_result.no_match_details}',
speechsdk.ResultReason.Canceled: f'Speech Recognition canceled: {translation_recognition_result.cancellation_details}'
}
return reason_format.get(reason, 'Unable to recognize speech')
translate_speech_to_text()
Для получения дополнительной информации о преобразовании речи в текст см. основы распознавания речи.
Перевод на основе событий
Объект TranslationRecognizer предоставляет событие recognizing. Событие запускается несколько раз и предоставляет механизм получения промежуточных результатов перевода.
Примечание.
Промежуточные результаты перевода недоступны при использовании многоязычного перевода речи.
Следующий пример выводит промежуточные результаты перевода в консоль:
import os
import azure.cognitiveservices.speech as speechsdk
speech_key, service_region = os.environ['SPEECH__SERVICE__KEY'], os.environ['SPEECH__SERVICE__REGION']
from_language, to_language = 'en-US', 'de'
def translate_speech_continuous():
translation_config = speechsdk.translation.SpeechTranslationConfig(
subscription=speech_key, region=service_region)
translation_config.speech_recognition_language = from_language
translation_config.add_target_language(to_language)
audio_config = speechsdk.audio.AudioConfig(filename="whatstheweatherlike.wav")
translation_recognizer = speechsdk.translation.TranslationRecognizer(
translation_config=translation_config, audio_config=audio_config)
done = False
def recognizing_cb(evt):
print(f'RECOGNIZING in "{from_language}": Text={evt.result.text}')
for language, translation in evt.result.translations.items():
print(f' TRANSLATING into "{language}": {translation}')
def recognized_cb(evt):
if evt.result.reason == speechsdk.ResultReason.TranslatedSpeech:
print(f'RECOGNIZED in "{from_language}": Text={evt.result.text}')
for language, translation in evt.result.translations.items():
print(f' TRANSLATED into "{language}": {translation}')
elif evt.result.reason == speechsdk.ResultReason.RecognizedSpeech:
print(f'RECOGNIZED: Text={evt.result.text}')
print(' Speech not translated.')
elif evt.result.reason == speechsdk.ResultReason.NoMatch:
print('NOMATCH: Speech could not be recognized.')
def canceled_cb(evt):
print(f'CANCELED: Reason={evt.cancellation_details.reason}')
if evt.cancellation_details.reason == speechsdk.CancellationReason.Error:
print(f'CANCELED: ErrorDetails={evt.cancellation_details.error_details}')
nonlocal done
done = True
def session_stopped_cb(evt):
print('SESSION STOPPED')
nonlocal done
done = True
# Connect callbacks
translation_recognizer.recognizing.connect(recognizing_cb)
translation_recognizer.recognized.connect(recognized_cb)
translation_recognizer.canceled.connect(canceled_cb)
translation_recognizer.session_stopped.connect(session_stopped_cb)
# Start continuous recognition
print('Start translation...')
translation_recognizer.start_continuous_recognition()
# Wait for completion
while not done:
pass
# Stop recognition
translation_recognizer.stop_continuous_recognition()
translate_speech_continuous()
Синтезирование переводов
После успешного распознавания речи и перевода словарь будет содержать все переводы. Ключом словаря translations является целевой язык перевода, а значением — переведенный текст. Распознанная речь может быть переведена, а затем синтезирована на другом языке (речевое преобразование).
Синтез на основе событий
Объект TranslationRecognizer предоставляет событие Synthesizing. Это событие срабатывает несколько раз и предоставляет механизм для получения синтезированной речи из результата распознавания перевода. При переводе на несколько языков воспользуйтесь инструкциями по синтезу вручную.
Задайте синтетический голос, назначив экземпляр voice_name, и предоставьте обработчик событий для события Synthesizing, чтобы получить звук. В следующем примере переведенная речь сохраняется в виде файла .wav.
Внимание
Синтез на основе событий работает только с одноязычным переводом.
Не добавляйте несколько целевых языков перевода. Кроме того, значение voice_name должно иметь тот же язык, что и целевой язык перевода. Например, "de" может быть сопоставлено с "de-DE-Hedda".
import os
import azure.cognitiveservices.speech as speechsdk
speech_key, service_region = os.environ['SPEECH__SERVICE__KEY'], os.environ['SPEECH__SERVICE__REGION']
from_language, to_language = 'en-US', 'de'
def translate_speech_to_text():
translation_config = speechsdk.translation.SpeechTranslationConfig(
subscription=speech_key, region=service_region)
translation_config.speech_recognition_language = from_language
translation_config.add_target_language(to_language)
# See: https://aka.ms/speech/sdkregion#standard-and-neural-voices
translation_config.voice_name = "de-DE-Hedda"
translation_recognizer = speechsdk.translation.TranslationRecognizer(
translation_config=translation_config)
def synthesis_callback(evt):
size = len(evt.result.audio)
print(f'Audio synthesized: {size} byte(s) {"(COMPLETED)" if size == 0 else ""}')
if size > 0:
file = open('translation.wav', 'wb+')
file.write(evt.result.audio)
file.close()
translation_recognizer.synthesizing.connect(synthesis_callback)
print(f'Say something in "{from_language}" and we\'ll translate into "{to_language}".')
translation_recognition_result = translation_recognizer.recognize_once()
print(get_result_text(reason=translation_recognition_result.reason, result=translation_recognition_result))
def get_result_text(reason, translation_recognition_result):
reason_format = {
speechsdk.ResultReason.TranslatedSpeech:
f'Recognized "{from_language}": {translation_recognition_result.text}\n' +
f'Translated into "{to_language}"": {translation_recognition_result.translations[to_language]}',
speechsdk.ResultReason.RecognizedSpeech: f'Recognized: "{translation_recognition_result.text}"',
speechsdk.ResultReason.NoMatch: f'No speech could be recognized: {translation_recognition_result.no_match_details}',
speechsdk.ResultReason.Canceled: f'Speech Recognition canceled: {translation_recognition_result.cancellation_details}'
}
return reason_format.get(reason, 'Unable to recognize speech')
translate_speech_to_text()
Синтез вручную
Для синтезирования звука из текста перевода можно использовать словарь translations. Пройдите все переводы по очереди и синтезируйте переведенную речь. При создании экземпляра SpeechSynthesizer в качестве значения свойства SpeechConfig объекта speech_synthesis_voice_name необходимо указать желаемый голос.
В следующем примере выполняется перевод на пять языков. Затем для каждого перевода создаётся аудиофайл на соответствующем нейронном языке.
import os
import azure.cognitiveservices.speech as speechsdk
speech_key, service_region = os.environ['SPEECH__SERVICE__KEY'], os.environ['SPEECH__SERVICE__REGION']
from_language, to_languages = 'en-US', [ 'de', 'en', 'it', 'pt', 'zh-Hans' ]
def translate_speech_to_text():
translation_config = speechsdk.translation.SpeechTranslationConfig(
subscription=speech_key, region=service_region)
translation_config.speech_recognition_language = from_language
for lang in to_languages:
translation_config.add_target_language(lang)
recognizer = speechsdk.translation.TranslationRecognizer(
translation_config=translation_config)
print('Say something...')
translation_recognition_result = translation_recognizer.recognize_once()
synthesize_translations(result=translation_recognition_result)
def synthesize_translations(translation_recognition_result):
language_to_voice_map = {
"de": "de-DE-KatjaNeural",
"en": "en-US-AriaNeural",
"it": "it-IT-ElsaNeural",
"pt": "pt-BR-FranciscaNeural",
"zh-Hans": "zh-CN-XiaoxiaoNeural"
}
print(f'Recognized: "{translation_recognition_result.text}"')
for language in translation_recognition_result.translations:
translation = translation_recognition_result.translations[language]
print(f'Translated into "{language}": {translation}')
speech_config = speechsdk.SpeechConfig(subscription=speech_key, region=service_region)
speech_config.speech_synthesis_voice_name = language_to_voice_map.get(language)
audio_config = speechsdk.audio.AudioOutputConfig(filename=f'{language}-translation.wav')
speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)
speech_synthesizer.speak_text_async(translation).get()
translate_speech_to_text()
Дополнительные сведения о синтезе речи см. в разделе Основы синтеза речи.
Многоязычный перевод с идентификацией языка
Во многих случаях может быть неизвестно, какие языки ввода требуется указать. С помощью идентификации языка можно обнаружить до 10 возможных языков ввода и автоматически перевести на целевые языки.
Полный пример кода см. в разделе "Идентификация языка".
Справочная документация | Пакет (NuGet) | Дополнительные примеры на GitHub
Из этого руководства вы узнаете, как распознать человеческую речь и перевести ее на другой язык.
В разделе с общими сведениями о переводе речи вы сможете получить дополнительную информацию по следующим темам:
- преобразование речи в текст;
- перевод речи на несколько целевых языков;
- Прямой перевод речи в речь
Конфиденциальные данные и переменные среды
Пример исходного кода в этой статье зависит от переменных среды для сохранения конфиденциальных данных, таких как ключ и регион ресурса «Speech». Файл кода C# содержит два static readonly string значения, назначенные переменными среды хост-компьютера: SPEECH__SUBSCRIPTION__KEY и SPEECH__SERVICE__REGION. Оба эти поля относятся к области класса, что делает их доступными внутри тел методов класса.
public class Program
{
static readonly string SPEECH__SUBSCRIPTION__KEY =
Environment.GetEnvironmentVariable(nameof(SPEECH__SUBSCRIPTION__KEY));
static readonly string SPEECH__SERVICE__REGION =
Environment.GetEnvironmentVariable(nameof(SPEECH__SERVICE__REGION));
public static void Main(string[] args) { }
}
Дополнительные сведения о переменных среды см. в разделе Переменные среды и конфигурация приложения.
Внимание
Используйте ключи API с осторожностью. Не включайте ключ API непосредственно в код и никогда не публикуйте его. Если вы используете ключ API, сохраните его безопасно в Azure Key Vault. Дополнительные сведения об использовании ключей API безопасно в приложениях см. в разделе "Ключи API" с помощью Azure Key Vault.
Дополнительные сведения о безопасности служб ИИ см. в статье "Проверка подлинности запросов к службам ИИ Azure".
Создание конфигурации перевода речи
Чтобы вызвать службу "Речь" с помощью пакета SDK для службы "Речь", необходимо создать экземпляр SpeechTranslationConfig. Этот класс содержит сведения о ресурсе речевой службы, таких как ваш ключ и связанный регион, конечная точка, хост или маркер авторизации.
Совет
Независимо от того, используете ли вы распознавание речи, синтез речи, перевод или распознавание намерения, вы всегда создаете конфигурацию.
Инициализировать экземпляр SpeechTranslationConfig можно несколькими способами:
- По подписке: введите ключ и соответствующую ему область.
- Укажите конечную точку службы распознавания речи. Ключ или маркер авторизации являются необязательными.
- Для узла: передайте адрес узла. Ключ или маркер авторизации являются необязательными.
- Используя токен авторизации, укажите его и сопутствующий регион.
Давайте посмотрим, как создать экземпляр SpeechTranslationConfig с помощью ключа и региона. Получите ключ и регион ресурса службы "Речь" на портале Azure.
public class Program
{
static readonly string SPEECH__SUBSCRIPTION__KEY =
Environment.GetEnvironmentVariable(nameof(SPEECH__SUBSCRIPTION__KEY));
static readonly string SPEECH__SERVICE__REGION =
Environment.GetEnvironmentVariable(nameof(SPEECH__SERVICE__REGION));
public static void Main(string[] args)
{
try
{
TranslateSpeechAsync().Wait();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
static async Task TranslateSpeechAsync()
{
var speechTranslationConfig =
SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
}
}
Изменение исходного языка
Распространенной задачей перевода речи является определение языка ввода (или исходного языка). В следующем примере показано, как изменить язык ввода на итальянский. В своем коде взаимодействуйте с экземпляром SpeechTranslationConfig, назначьте его свойству SpeechRecognitionLanguage.
static async Task TranslateSpeechAsync()
{
var speechTranslationConfig =
SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
// Source (input) language
speechTranslationConfig.SpeechRecognitionLanguage = "it-IT";
}
Свойство SpeechRecognitionLanguage принимает строку формата языкового стандарта. Ознакомьтесь со списком поддерживаемых локалей перевода речи.
Добавление языка перевода
Другой распространенной задачей перевода речи является указание целевых языков перевода. Необходимо указать по крайней мере один язык, при этом поддерживается и несколько языков. В следующем фрагменте кода в качестве целевых языков перевода задаются французский и немецкий языки:
static async Task TranslateSpeechAsync()
{
var speechTranslationConfig =
SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
speechTranslationConfig.SpeechRecognitionLanguage = "it-IT";
speechTranslationConfig.AddTargetLanguage("fr");
speechTranslationConfig.AddTargetLanguage("de");
}
При каждом вызове метода AddTargetLanguage указывается новый целевой язык перевода. Иными словами, при распознавании речи на исходном языке каждый целевой перевод доступен как часть результирующей операции перевода.
Инициализация распознавателя перевода
После создания экземпляра SpeechTranslationConfig следующим шагом является инициализация TranslationRecognizer. При инициализации TranslationRecognizer необходимо передать ему экземпляр speechTranslationConfig. Этот объект конфигурации предоставляет учетные данные, необходимые службе "Речь" для проверки запроса.
Если вы распознаете речь с помощью стандартного микрофона вашего устройства, вот как должен выглядеть экземпляр TranslationRecognizer:
static async Task TranslateSpeechAsync()
{
var speechTranslationConfig =
SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
var fromLanguage = "en-US";
var toLanguages = new List<string> { "it", "fr", "de" };
speechTranslationConfig.SpeechRecognitionLanguage = fromLanguage;
toLanguages.ForEach(speechTranslationConfig.AddTargetLanguage);
using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig);
}
Если вы хотите указать входное аудиоустройство, необходимо создать экземпляр класса AudioConfig и указать параметр audioConfig при инициализации TranslationRecognizer.
Во-первых, создайте ссылку на объект AudioConfig следующим образом:
static async Task TranslateSpeechAsync()
{
var speechTranslationConfig =
SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
var fromLanguage = "en-US";
var toLanguages = new List<string> { "it", "fr", "de" };
speechTranslationConfig.SpeechRecognitionLanguage = fromLanguage;
toLanguages.ForEach(speechTranslationConfig.AddTargetLanguage);
using var audioConfig = AudioConfig.FromDefaultMicrophoneInput();
using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig, audioConfig);
}
Если вы хотите предоставить звуковой файл, а не использовать микрофон, вам по-прежнему нужно указать параметр audioConfig. Однако при создании экземпляра класса AudioConfig вместо вызова FromDefaultMicrophoneInput необходимо вызвать FromWavFileInput и передать параметр filename:
static async Task TranslateSpeechAsync()
{
var speechTranslationConfig =
SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
var fromLanguage = "en-US";
var toLanguages = new List<string> { "it", "fr", "de" };
speechTranslationConfig.SpeechRecognitionLanguage = fromLanguage;
toLanguages.ForEach(speechTranslationConfig.AddTargetLanguage);
using var audioConfig = AudioConfig.FromWavFileInput("YourAudioFile.wav");
using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig, audioConfig);
}
Перевод речи
Чтобы перевести речь, пакет SDK для службы "Речь" использует микрофон или входной звуковой файл. Перед переводом речи выполняется распознавание речи. После инициализации всех объектов вызовите функцию распознавания один раз и получите результат.
static async Task TranslateSpeechAsync()
{
var speechTranslationConfig =
SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
var fromLanguage = "en-US";
var toLanguages = new List<string> { "it", "fr", "de" };
speechTranslationConfig.SpeechRecognitionLanguage = fromLanguage;
toLanguages.ForEach(speechTranslationConfig.AddTargetLanguage);
using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig);
Console.Write($"Say something in '{fromLanguage}' and ");
Console.WriteLine($"we'll translate into '{string.Join("', '", toLanguages)}'.\n");
var result = await translationRecognizer.RecognizeOnceAsync();
if (result.Reason == ResultReason.TranslatedSpeech)
{
Console.WriteLine($"Recognized: \"{result.Text}\":");
foreach (var element in result.Translations)
{
Console.WriteLine($" TRANSLATED into '{element.Key}': {element.Value}");
}
}
}
Для получения дополнительной информации о преобразовании речи в текст см. основы распознавания речи.
Перевод на основе событий
Объект TranslationRecognizer предоставляет событие Recognizing. Событие запускается несколько раз и предоставляет механизм получения промежуточных результатов перевода.
Примечание.
Промежуточные результаты перевода недоступны при использовании многоязычного перевода речи без кандидатов на исходный язык.
Следующий пример выводит промежуточные результаты перевода в консоль:
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
using Microsoft.CognitiveServices.Speech.Translation;
public class Program
{
private static readonly string SPEECH__SUBSCRIPTION__KEY = Environment.GetEnvironmentVariable(nameof(SPEECH__SUBSCRIPTION__KEY));
private static readonly string SPEECH__SERVICE__REGION = Environment.GetEnvironmentVariable(nameof(SPEECH__SERVICE__REGION));
public static void Main(string[] args)
{
try
{
EventTranslationAsync().Wait();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
static async Task EventTranslationAsync()
{
var speechTranslationConfig =
SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
var fromLanguage = "en-US";
speechTranslationConfig.SpeechRecognitionLanguage = fromLanguage;
speechTranslationConfig.AddTargetLanguage("de");
speechTranslationConfig.AddTargetLanguage("fr");
var stopTranslation = new TaskCompletionSource<int>(TaskCreationOptions.RunContinuationsAsynchronously);
using (var audioInput = AudioConfig.FromWavFileInput(@"whatstheweatherlike.wav"))
{
using (var translationRecognizer = new TranslationRecognizer(speechTranslationConfig, audioInput))
{
// Subscribes to events.
translationRecognizer.Recognizing += (s, e) =>
{
Console.WriteLine($"RECOGNIZING in '{fromLanguage}': Text={e.Result.Text}");
foreach (var element in e.Result.Translations)
{
Console.WriteLine($" TRANSLATING into '{element.Key}': {element.Value}");
}
};
translationRecognizer.Recognized += (s, e) => {
if (e.Result.Reason == ResultReason.TranslatedSpeech)
{
Console.WriteLine($"RECOGNIZED in '{fromLanguage}': Text={e.Result.Text}");
foreach (var element in e.Result.Translations)
{
Console.WriteLine($" TRANSLATED into '{element.Key}': {element.Value}");
}
}
else if (e.Result.Reason == ResultReason.RecognizedSpeech)
{
Console.WriteLine($"RECOGNIZED: Text={e.Result.Text}");
Console.WriteLine($" Speech not translated.");
}
else if (e.Result.Reason == ResultReason.NoMatch)
{
Console.WriteLine($"NOMATCH: Speech could not be recognized.");
}
};
translationRecognizer.Canceled += (s, e) =>
{
Console.WriteLine($"CANCELED: Reason={e.Reason}");
if (e.Reason == CancellationReason.Error)
{
Console.WriteLine($"CANCELED: ErrorDetails={e.ErrorDetails}");
Console.WriteLine($"CANCELED: Did you set the speech resource key and region values?");
}
stopTranslation.TrySetResult(0);
};
translationRecognizer.SessionStopped += (s, e) =>
{
Console.WriteLine("Session stopped.");
stopTranslation.TrySetResult(0);
};
// Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
Console.WriteLine("Start translation...");
await translationRecognizer.StartContinuousRecognitionAsync();
// Waits for completion.
// Use Task.WaitAny to keep the task rooted.
Task.WaitAny(new[] { stopTranslation.Task });
// Stops translation.
await translationRecognizer.StopContinuousRecognitionAsync();
}
}
}
}
Синтезирование переводов
После успешного распознавания речи и перевода словарь будет содержать все переводы. Ключом словаря Translations является целевой язык перевода, а значением — переведенный текст. Распознанная речь может быть переведена, а затем синтезирована на другом языке (речевое преобразование).
Синтез на основе событий
Объект TranslationRecognizer предоставляет событие Synthesizing. Это событие срабатывает несколько раз и предоставляет механизм для получения синтезированной речи из результата распознавания перевода. При переводе на несколько языков воспользуйтесь инструкциями по синтезу вручную.
Задайте синтетический голос, назначив экземпляр VoiceName, и предоставьте обработчик событий для события Synthesizing, чтобы получить звук. В следующем примере переведенная речь сохраняется в виде файла .wav.
Внимание
Синтез на основе событий работает только с одноязычным переводом.
Не добавляйте несколько целевых языков перевода. Кроме того, значение VoiceName должно иметь тот же язык, что и целевой язык перевода. Например, "de" может быть сопоставлено с "de-DE-Hedda".
static async Task TranslateSpeechAsync()
{
var speechTranslationConfig =
SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
var fromLanguage = "en-US";
var toLanguage = "de";
speechTranslationConfig.SpeechRecognitionLanguage = fromLanguage;
speechTranslationConfig.AddTargetLanguage(toLanguage);
speechTranslationConfig.VoiceName = "de-DE-Hedda";
using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig);
translationRecognizer.Synthesizing += (_, e) =>
{
var audio = e.Result.GetAudio();
Console.WriteLine($"Audio synthesized: {audio.Length:#,0} byte(s) {(audio.Length == 0 ? "(Complete)" : "")}");
if (audio.Length > 0)
{
File.WriteAllBytes("YourAudioFile.wav", audio);
}
};
Console.Write($"Say something in '{fromLanguage}' and ");
Console.WriteLine($"we'll translate into '{toLanguage}'.\n");
var result = await translationRecognizer.RecognizeOnceAsync();
if (result.Reason == ResultReason.TranslatedSpeech)
{
Console.WriteLine($"Recognized: \"{result.Text}\"");
Console.WriteLine($"Translated into '{toLanguage}': {result.Translations[toLanguage]}");
}
}
Синтез вручную
Для синтезирования звука из текста перевода можно использовать словарь Translations. Пройдите все переводы по очереди и синтезируйте переведенную речь. При создании экземпляра SpeechSynthesizer в качестве значения свойства SpeechConfig объекта SpeechSynthesisVoiceName необходимо указать желаемый голос.
В следующем примере выполняется перевод на пять языков. Затем для каждого перевода создаётся аудиофайл на соответствующем нейронном языке.
static async Task TranslateSpeechAsync()
{
var speechTranslationConfig =
SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
var fromLanguage = "en-US";
var toLanguages = new List<string> { "de", "en", "it", "pt", "zh-Hans" };
speechTranslationConfig.SpeechRecognitionLanguage = fromLanguage;
toLanguages.ForEach(speechTranslationConfig.AddTargetLanguage);
using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig);
Console.Write($"Say something in '{fromLanguage}' and ");
Console.WriteLine($"we'll translate into '{string.Join("', '", toLanguages)}'.\n");
var result = await translationRecognizer.RecognizeOnceAsync();
if (result.Reason == ResultReason.TranslatedSpeech)
{
var languageToVoiceMap = new Dictionary<string, string>
{
["de"] = "de-DE-KatjaNeural",
["en"] = "en-US-AriaNeural",
["it"] = "it-IT-ElsaNeural",
["pt"] = "pt-BR-FranciscaNeural",
["zh-Hans"] = "zh-CN-XiaoxiaoNeural"
};
Console.WriteLine($"Recognized: \"{result.Text}\"");
foreach (var (language, translation) in result.Translations)
{
Console.WriteLine($"Translated into '{language}': {translation}");
var speechConfig =
SpeechConfig.FromSubscription(
SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
speechConfig.SpeechSynthesisVoiceName = languageToVoiceMap[language];
using var audioConfig = AudioConfig.FromWavFileOutput($"{language}-translation.wav");
using var speechSynthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
await speechSynthesizer.SpeakTextAsync(translation);
}
}
}
Дополнительные сведения о синтезе речи см. в разделе Основы синтеза речи.
Многоязычный перевод с идентификацией языка
Во многих случаях может быть неизвестно, какие языки ввода требуется указать. С помощью идентификации языка можно обнаружить до 10 возможных языков ввода и автоматически перевести на целевые языки.
В следующем примере предполагается, что следует обнаружить en-US или zh-CN, потому что они определены в AutoDetectSourceLanguageConfig. Затем речь переводится на de и fr, как указано в вызовах функции AddTargetLanguage().
speechTranslationConfig.AddTargetLanguage("de");
speechTranslationConfig.AddTargetLanguage("fr");
var autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig.FromLanguages(new string[] { "en-US", "zh-CN" });
var translationRecognizer = new TranslationRecognizer(speechTranslationConfig, autoDetectSourceLanguageConfig, audioConfig);
Полный пример кода см. в разделе "Идентификация языка".
Многоязычный перевод речи без указания исходного языка
Многоязычный перевод речи реализует новый уровень технологии перевода речи, которая разблокирует различные возможности, включая отсутствие указанного языка ввода и обработку языковых коммутаторов в рамках одного сеанса. Эти функции обеспечивают новый уровень возможностей перевода речи, которые могут быть реализованы в ваших продуктах.
В настоящее время при использовании идентификатора языка с переводом речи необходимо создать SpeechTranslationConfig объект из конечной точки версии 2. Замените строку "YourServiceRegion" регионом вашего ресурса службы "Speech" (например, "westus"). Замените "YourSpeechResourceKey" ключом ресурса "Речь".
var v2EndpointInString = String.Format("wss://{0}.stt.speech.microsoft.com/speech/universal/v2", "YourServiceRegion");
var v2EndpointUrl = new Uri(v2EndpointInString);
var speechTranslationConfig = SpeechTranslationConfig.FromEndpoint(v2EndpointUrl, "YourSpeechResourceKey");
Укажите целевые языки перевода. Замените выбранными языками. Вы можете добавить дополнительные строки.
speechTranslationConfig.AddTargetLanguage("de");
speechTranslationConfig.AddTargetLanguage("fr");
Ключевой элемент, отличающийся от многоязычного перевода речи, заключается в том, что не нужно указывать исходный язык. Это связано с тем, что служба автоматически обнаруживает исходный язык.
AutoDetectSourceLanguageConfig Создайте объект с FromOpenRange помощью метода, чтобы сообщить службе, что вы хотите использовать многоязычный перевод речи без указанного исходного языка.
AutoDetectSourceLanguageConfig autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig.FromOpenRange();
var translationRecognizer = new TranslationRecognizer(speechTranslationConfig, autoDetectSourceLanguageConfig, audioConfig);
Полный пример кода с использованием Speech SDK см. в разделе примеры перевода речи на GitHub.
Использование динамического интерпретатора для перевода речи в режиме реального времени с личным голосом
Динамический интерпретатор постоянно идентифицирует язык, который произносится без необходимости задавать язык ввода и обеспечивает низкую задержку перевода речи в речь в естественном голосе, который сохраняет стиль и тон говорящего.
Чтобы использовать API динамического интерпретатора, сначала примените личный голосовой доступ и выберите "Личный голос" для вопроса 20. Для идентификатора ресурса убедитесь, что он находится в одном из регионов, поддерживающих динамический интерпретатор. См. таблицу регионов службы "Речь " для текущей региональной доступности.
После предоставления разрешения на доступ к личному голосу, вы можете включить функцию "Живой переводчик" со следующим кодом:
// Please replace the service region with your region
var v2EndpointInString = String.Format("wss://{0}.stt.speech.microsoft.com/speech/universal/v2", "YourRegion");
var v2EndpointUrl = new Uri(v2EndpointInString);
// Creates an instance of a speech translation config with specified subscription key and service region.
// Please replace the service subscription key with your subscription key
var speechTranslationConfig = SpeechTranslationConfig.FromEndpoint(v2EndpointUrl, "YourSubscriptionKey");
// Translation target language and enable personal voice
speechTranslationConfig.AddTargetLanguage("fr");
speechTranslationConfig.VoiceName = "personal-voice";
// You don't need to define any candidate languages to detect.
var autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig.FromOpenRange();
Ниже приведен более подробный пример:
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
using Microsoft.CognitiveServices.Speech.Translation;
using NAudio.Wave;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace LiveInterpreterDemo
{
class Program
{
public static async Task LiveInterpreterDemoAsync()
{
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// NOTICE!!!, set your test file here
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
string audioFile = "<TEST_FILE>";
string locale = "zh-CN";
Console.WriteLine("Start testing for " + audioFile);
Console.WriteLine("Test file " + audioFile);
Console.WriteLine("Target locale " + locale);
// Make sure the output in terminal can be displayed normally, not necessary if you do not want to print result in terminal
Console.OutputEncoding = Encoding.UTF8;
// When you use Multilingual Translation with language identification,
// you don't need to define any candidate languages to detect, but you must set a v2 endpoint and use
// SpeechTranslationConfig.FromEndpoint() to create the SpeechTranslationConfig object.
// This will be fixed in a future version of Speech SDK.
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// NOTICE!!!, set your region and key here
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
var speechTranslationConfig = SpeechTranslationConfig.FromEndpoint(new Uri("https://<REGION>.stt.speech.microsoft.com/speech/universal/v2"), "<KEY>");
speechTranslationConfig.AddTargetLanguage(locale);
speechTranslationConfig.VoiceName = "personal-voice";
// You don't need to define any candidate languages to detect.
var autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig.FromOpenRange();
var stopTranslation = new TaskCompletionSource<int>(TaskCreationOptions.RunContinuationsAsynchronously);
// index of output auido files
int i = 0;
Console.WriteLine($"Start time: {DateTime.UtcNow}");
using (var audioInput = AudioConfig.FromWavFileInput(audioFile))
{
using (var recognizer = new TranslationRecognizer(speechTranslationConfig, autoDetectSourceLanguageConfig, audioInput))
{
// Subscribes to events.
recognizer.Recognizing += (s, e) =>
{
var lidResult = e.Result.Properties.GetProperty(PropertyId.SpeechServiceConnection_AutoDetectSourceLanguageResult);
Console.WriteLine($"RECOGNIZING in '{lidResult}': Text={e.Result.Text}, Offset={e.Offset}, Duration={e.Result.Duration}");
if (e.Result.Reason == ResultReason.TranslatingSpeech)
{
foreach (var element in e.Result.Translations)
{
Console.WriteLine($" TRANSLATING into '{element.Key}': {element.Value}");
}
}
};
recognizer.Recognized += (s, e) => {
if (e.Result.Reason == ResultReason.TranslatedSpeech)
{
var lidResult = e.Result.Properties.GetProperty(PropertyId.SpeechServiceConnection_AutoDetectSourceLanguageResult);
Console.WriteLine($"RECOGNIZED in '{lidResult}': Text={e.Result.Text}, Offset={e.Offset}, Duration={e.Result.Duration}");
foreach (var element in e.Result.Translations)
{
Console.WriteLine($" TRANSLATED into '{element.Key}': {element.Value}");
}
}
else if (e.Result.Reason == ResultReason.RecognizedSpeech)
{
Console.WriteLine($"RECOGNIZED: Text={e.Result.Text}");
Console.WriteLine($" Speech not translated.");
}
else if (e.Result.Reason == ResultReason.NoMatch)
{
Console.WriteLine($"NOMATCH: Speech could not be recognized.");
}
};
recognizer.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 update the subscription info?");
}
stopTranslation.TrySetResult(0);
};
recognizer.Synthesizing += (_, e) =>
{
var audio = e.Result.GetAudio();
Console.WriteLine($"{e.SessionId} Audio synthesized: {audio.Length:#,0} byte(s) Current time: {DateTime.UtcNow} {(audio.Length == 0 ? "(Complete)" : "")}");
if (audio.Length > 0)
{
File.WriteAllBytes(string.Format("YourAudioFile-{0}.wav", ++i), audio);
}
if (audio.Length == 0)
{
stopTranslation.TrySetResult(0);
}
};
Console.WriteLine("Start translation...");
await recognizer.StartContinuousRecognitionAsync();
// Waits for completion.
// Use Task.WaitAny to keep the task rooted.
Task.WaitAny(new[] { stopTranslation.Task });
// Stops translation.
await recognizer.StopContinuousRecognitionAsync();
}
}
Console.WriteLine($"End time: {DateTime.UtcNow}");
}
static async Task Main()
{
await LiveInterpreterDemoAsync();
}
}
}
Использование пользовательского перевода в переводе речи
Функция пользовательского перевода в переводе речи легко интегрируется со службой пользовательского перевода Azure, что позволяет добиться более точных и адаптированных переводов. Так как интеграция напрямую использует возможности пользовательской службы перевода Azure, необходимо использовать ресурс с несколькими службами, чтобы обеспечить правильную работу полного набора функций. Подробные инструкции см. в руководстве по созданию ресурса с несколькими службами для средств Foundry.
Кроме того, для автономного обучения настраиваемого переводчика и получения "Category ID" см. сценарий с пошаговыми указаниями, приведенный в кратком руководстве: Создание, развертывание и использование пользовательской модели — Custom Translator.
// Creates an instance of a translation recognizer using speech translation configuration
// You should use the same subscription key, which you used to generate the custom model before.
// V2 endpoint is required for the "Custom Translation" feature. Example: "wss://westcentralus.stt.speech.microsoft.com/speech/universal/v2"
var v2EndpointInString = "wss://westcentralus.stt.speech.microsoft.com/speech/universal/v2";
var v2EndpointUrl = new Uri(v2EndpointInString);
var speechTranslationConfig = SpeechTranslationConfig.FromEndpoint(v2EndpointUrl, "YourSpeechSubscriptionKey");
// Sets source and target language(s).
speechTranslationConfig.SpeechRecognitionLanguage = "en-US";
speechTranslationConfig.AddTargetLanguage("de");
// Set the category id
speechTranslationConfig.SetProperty(PropertyId.SpeechServiceConnection_TranslationCategory, "yourCategoryId");
Справочная документация | Пакет (npm) | Дополнительные примеры на GitHub | Исходный код библиотеки
Из этого руководства вы узнаете, как распознать человеческую речь и перевести ее на другой язык.
В разделе с общими сведениями о переводе речи вы сможете получить дополнительную информацию по следующим темам:
- преобразование речи в текст;
- перевод речи на несколько целевых языков;
- Прямой перевод речи в речь
Создание конфигурации перевода
Чтобы вызвать службу перевода с помощью Speech SDK, необходимо создать экземпляр SpeechTranslationConfig. Этот класс содержит сведения о ресурсе речевой службы, таких как ваш ключ и связанный регион, конечная точка, хост или маркер авторизации.
Примечание.
Независимо от того, используете ли вы распознавание речи, синтез речи, перевод или распознавание намерения, вы всегда создаете конфигурацию.
Инициализировать SpeechTranslationConfig можно несколькими способами:
- По подписке: введите ключ и соответствующую ему область.
- Укажите конечную точку службы распознавания речи. Ключ или маркер авторизации являются необязательными.
- Для узла: передайте адрес узла. Ключ или маркер авторизации являются необязательными.
- Используя токен авторизации, укажите его и сопутствующий регион.
Давайте посмотрим, как создать экземпляр SpeechTranslationConfig с помощью ключа и региона. Получите ключ и регион ресурса службы "Речь" на портале Azure.
const speechTranslationConfig = SpeechTranslationConfig.fromSubscription("YourSpeechResourceKey", "YourServiceRegion");
Инициализация переводчика
После создания экземпляра SpeechTranslationConfig следующим шагом является инициализация TranslationRecognizer. При инициализации TranslationRecognizer необходимо передать ему экземпляр speechTranslationConfig. Этот объект конфигурации предоставляет учетные данные, необходимые службе перевода для проверки запроса.
Если вы переводите речь, полученную с помощью стандартного микрофона вашего устройства, вот как должен выглядеть TranslationRecognizer:
const translationRecognizer = new TranslationRecognizer(speechTranslationConfig);
Если вы хотите указать входное аудиоустройство, необходимо создать экземпляр класса AudioConfig и указать параметр audioConfig при инициализации TranslationRecognizer.
Создайте ссылку на объект AudioConfig следующим образом:
const audioConfig = AudioConfig.fromDefaultMicrophoneInput();
const translationRecognizer = new TranslationRecognizer(speechTranslationConfig, audioConfig);
Если вы хотите предоставить звуковой файл, а не использовать микрофон, вам по-прежнему нужно указать параметр audioConfig. Однако вы можете сделать это только когда вы нацелены на Node.js. При создании экземпляра класса AudioConfig вместо вызова fromDefaultMicrophoneInput необходимо вызвать fromWavFileOutput и передать параметр filename:
const audioConfig = AudioConfig.fromWavFileInput("YourAudioFile.wav");
const translationRecognizer = new TranslationRecognizer(speechTranslationConfig, audioConfig);
Перевод речи
Класс TranslationRecognizer для пакета SDK службы "Речь" для JavaScript предоставляет методы, которые можно использовать для перевода речи:
- Одноразовый перевод (асинхр.) — выполняет перевод в неблокирующем (асинхронном) режиме. В этом режиме переводится один речевой фрагмент. Конец одного речевого фрагмента определяется путем отслеживания тишины в конце или до обработки до 15 секунд звука.
-
Непрерывный перевод (асинхр.) — асинхронно инициирует операцию непрерывного перевода. Пользователь регистрируется на события и обрабатывает различные состояния приложения. Чтобы отключить асинхронный непрерывный перевод, вызовите
stopContinuousRecognitionAsync.
Дополнительные сведения о том, как выбрать режим распознавания речи, см. в статье "Начало работы с речью в тексте".
Укажите целевой язык
Для перевода необходимо указать как исходный язык, так и хотя бы один целевой язык.
Вы можете выбрать исходный язык, используя локаль, представленную в Таблице перевода речи. Найдите по той же ссылке параметры для переведенного языка.
Параметры для целевых языков различаются в зависимости от того, нужно ли просмотреть текст или услышать синтезированную переведенную речь. Для перевода с английского языка на немецкий измените объект конфигурации перевода:
speechTranslationConfig.speechRecognitionLanguage = "en-US";
speechTranslationConfig.addTargetLanguage("de");
Одноразовое распознавание
Ниже приведен пример асинхронного одноразового перевода с помощью recognizeOnceAsync:
translationRecognizer.recognizeOnceAsync(result => {
// Interact with result
});
Вам будет необходимо написать код для обработки результата. В этом примере оценивается result.reason для перевода на немецкий язык:
translationRecognizer.recognizeOnceAsync(
function (result) {
let translation = result.translations.get("de");
window.console.log(translation);
translationRecognizer.close();
},
function (err) {
window.console.log(err);
translationRecognizer.close();
});
Ваш код также может обрабатывать обновления, предоставляемые во время обработки перевода. Эти обновления можно использовать для визуальной обратной связи о ходе перевода. Такие обновления показаны в этом примере для Node.js на языке JavaScript. Следующий код также выводит на экран данные, создаваемые в процессе перевода:
translationRecognizer.recognizing = function (s, e) {
var str = ("(recognizing) Reason: " + SpeechSDK.ResultReason[e.result.reason] +
" Text: " + e.result.text +
" Translation:");
str += e.result.translations.get("de");
console.log(str);
};
translationRecognizer.recognized = function (s, e) {
var str = "\r\n(recognized) Reason: " + SpeechSDK.ResultReason[e.result.reason] +
" Text: " + e.result.text +
" Translation:";
str += e.result.translations.get("de");
str += "\r\n";
console.log(str);
};
Перевод на основе событий
Перевод на основе событий является немного более сложным, чем одноразовое распознавание. Для получения результатов распознавания необходимо подписаться на события recognizing, recognizedи canceled. Чтобы остановить перевод, необходимо вызвать stopContinuousRecognitionAsync.
Примечание.
Промежуточные результаты перевода недоступны при использовании многоязычного перевода речи.
Ниже приведен пример того, как выполняется перевод на основе событий в звуковом файле ввода. Начнем с определения входных данных и инициализации TranslationRecognizer:
const translationRecognizer = new TranslationRecognizer(speechTranslationConfig);
В следующем коде вы подписываетесь на события, отправленные из TranslationRecognizer:
-
recognizing: сигнал для событий, содержащих промежуточные результаты перевода. -
recognized: сигнал для событий, содержащих окончательные результаты перевода. Эти результаты указывают на то, что попытка перевода была выполнена успешно. -
sessionStopped: сигнал для событий, указывающих на окончание сеанса (операции) перевода. -
canceled: сигнал для событий, содержащих отмененные результаты перевода. Эти события указывают на попытку перевода, которая была отменена в результате прямой отмены. Они также могут указывать на сбой транспорта или протокола.
translationRecognizer.recognizing = (s, e) => {
console.log(`TRANSLATING: Text=${e.result.text}`);
};
translationRecognizer.recognized = (s, e) => {
if (e.result.reason == ResultReason.RecognizedSpeech) {
console.log(`TRANSLATED: Text=${e.result.text}`);
}
else if (e.result.reason == ResultReason.NoMatch) {
console.log("NOMATCH: Speech could not be translated.");
}
};
translationRecognizer.canceled = (s, e) => {
console.log(`CANCELED: Reason=${e.reason}`);
if (e.reason == CancellationReason.Error) {
console.log(`"CANCELED: ErrorCode=${e.errorCode}`);
console.log(`"CANCELED: ErrorDetails=${e.errorDetails}`);
console.log("CANCELED: Did you set the speech resource key and region values?");
}
translationRecognizer.stopContinuousRecognitionAsync();
};
translationRecognizer.sessionStopped = (s, e) => {
console.log("\n Session stopped event.");
translationRecognizer.stopContinuousRecognitionAsync();
};
Если все настроено, можно вызвать startContinuousRecognitionAsync:
// Starts continuous recognition. Uses stopContinuousRecognitionAsync() to stop recognition.
translationRecognizer.startContinuousRecognitionAsync();
// Something later can call. Stops recognition.
// translationRecognizer.StopContinuousRecognitionAsync();
Выбор исходного языка
Типовой задачей перевода речи является задание языка ввода (или исходного языка). В следующем примере показано, как изменить язык ввода на итальянский. В своем коде найдите экземпляр SpeechTranslationConfig, а затем добавьте непосредственно под ним следующую строку:
speechTranslationConfig.speechRecognitionLanguage = "it-IT";
Свойство speechRecognitionLanguage принимает строку формата языкового стандарта. Ознакомьтесь со списком поддерживаемых локалей перевода речи.
Выбор одного или нескольких целевых языков
SDK распознавания речи может переводить одновременно на несколько целевых языков. Доступные целевые языки немного отличаются от списка исходных языков. Целевые языки указываются с помощью кода языка, а не локали.
Список кодов языков для целевых языков см. в таблице перевода речи на странице поддержки языков. В этой таблице также можно найти сведения о переводе на синтезированные языки.
Следующий код добавляет немецкий язык в качестве целевого:
speechTranslationConfig.addTargetLanguage("de");
Поскольку возможен перевод на несколько целевых языков, в вашем коде при проверке результата должен быть указан целевой язык. Следующий код возвращает результаты перевода для немецкого языка:
translationRecognizer.recognized = function (s, e) {
var str = "\r\n(recognized) Reason: " +
sdk.ResultReason[e.result.reason] +
" Text: " + e.result.text + " Translations:";
var language = "de";
str += " [" + language + "] " + e.result.translations.get(language);
str += "\r\n";
// show str somewhere
};
Синтезирование переводов
После успешного распознавания речи и перевода словарь будет содержать все переводы. Свойство translations возвращает словарь с ключом в качестве целевого языка перевода и значение в виде переведенного текста. Распознанная речь может быть переведена, а затем синтезирована на другом языке (речевое преобразование).
Синтез на основе событий
Объект TranslationRecognizer предоставляет событие synthesizing. Это событие срабатывает несколько раз и предоставляет механизм для получения синтезированной речи из результата распознавания перевода. При переводе на несколько языков воспользуйтесь инструкциями по синтезу вручную.
Укажите голос синтеза, назначив свойству voiceName, и предоставьте обработчик для события synthesizing, чтобы получить звук. В следующем примере переведенная речь сохраняется в виде файла .wav.
Внимание
Синтез на основе событий работает только с одноязычным переводом.
Не добавляйте несколько целевых языков перевода. Кроме того, значение voiceName должно иметь тот же язык, что и целевой язык перевода. Например, "de" может быть сопоставлено с "de-DE-Hedda".
const speechTranslationConfig = SpeechTranslationConfig.fromSubscription("YourSpeechResourceKey", "YourServiceRegion");
speechTranslationConfig.speechRecognitionLanguage = "en-US";
speechTranslationConfig.addTargetLanguage("de");
// See: https://aka.ms/speech/sdkregion#standard-and-neural-voices
speechTranslationConfig.voiceName = "de-DE-Hedda";
const translationRecognizer = new TranslationRecognizer(speechTranslationConfig);
translationRecognizer.synthesizing = (s, e) => {
const audio = e.result.audio;
console.log(`Audio synthesized: ${audio.byteLength} byte(s) ${audio.byteLength === 0 ? "(COMPLETE)" : ""}`);
if (audio.byteLength > 0) {
// In Node.js, save to file
const fs = require("fs");
fs.writeFileSync("translation.wav", Buffer.from(audio));
}
};
console.log("Say something in English and we'll translate to German...");
translationRecognizer.recognizeOnceAsync(result => {
if (result.reason === ResultReason.TranslatedSpeech) {
console.log(`Recognized: "${result.text}"`);
console.log(`Translated into German: ${result.translations.get("de")}`);
}
translationRecognizer.close();
});
Синтез вручную
Для синтезирования звука из текста перевода можно использовать словарь translations. Пройдите все переводы по очереди и синтезируйте переведенную речь. При создании экземпляра SpeechSynthesizer в качестве значения свойства SpeechConfig объекта speechSynthesisVoiceName необходимо указать желаемый голос.
В следующем примере выполняется перевод на пять языков. Затем для каждого перевода создаётся аудиофайл на соответствующем нейронном языке.
const speechTranslationConfig = SpeechTranslationConfig.fromSubscription("YourSpeechResourceKey", "YourServiceRegion");
speechTranslationConfig.speechRecognitionLanguage = "en-US";
speechTranslationConfig.addTargetLanguage("de");
speechTranslationConfig.addTargetLanguage("fr");
speechTranslationConfig.addTargetLanguage("it");
speechTranslationConfig.addTargetLanguage("pt");
speechTranslationConfig.addTargetLanguage("zh-Hans");
const translationRecognizer = new TranslationRecognizer(speechTranslationConfig);
console.log("Say something...");
translationRecognizer.recognizeOnceAsync(async result => {
if (result.reason === ResultReason.TranslatedSpeech) {
const languageToVoiceMap = {
"de": "de-DE-KatjaNeural",
"fr": "fr-FR-DeniseNeural",
"it": "it-IT-ElsaNeural",
"pt": "pt-BR-FranciscaNeural",
"zh-Hans": "zh-CN-XiaoxiaoNeural"
};
console.log(`Recognized: "${result.text}"`);
for (const [language, translation] of result.translations) {
console.log(`Translated into '${language}': ${translation}`);
const speechConfig = SpeechConfig.fromSubscription("YourSpeechResourceKey", "YourServiceRegion");
speechConfig.speechSynthesisVoiceName = languageToVoiceMap[language];
const audioConfig = AudioConfig.fromAudioFileOutput(`${language}-translation.wav`);
const speechSynthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
await new Promise((resolve, reject) => {
speechSynthesizer.speakTextAsync(
translation,
synthesisResult => {
speechSynthesizer.close();
resolve();
},
error => {
speechSynthesizer.close();
reject(error);
}
);
});
}
}
translationRecognizer.close();
});
Дополнительные сведения о синтезе речи см. в разделе Основы синтеза речи.
Многоязычный перевод с идентификацией языка
Во многих случаях может быть неизвестно, какие языки ввода требуется указать. С помощью идентификации языка можно обнаружить до 10 возможных языков ввода и автоматически перевести на целевые языки.
В следующем примере предполагается, что следует обнаружить en-US или zh-CN, потому что они определены в AutoDetectSourceLanguageConfig. Затем речь переводится на de и fr, как указано в вызовах функции addTargetLanguage().
speechTranslationConfig.addTargetLanguage("de");
speechTranslationConfig.addTargetLanguage("fr");
const autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig.fromLanguages(["en-US", "zh-CN"]);
const translationRecognizer = TranslationRecognizer.FromConfig(speechTranslationConfig, autoDetectSourceLanguageConfig, audioConfig);
Полный пример кода см. в разделе "Идентификация языка".
Справочная документация | Дополнительные примеры на GitHub
Из этого руководства вы узнаете, как распознать человеческую речь и перевести ее на другой язык.
В разделе с общими сведениями о переводе речи вы сможете получить дополнительную информацию по следующим темам:
- преобразование речи в текст;
- перевод речи на несколько целевых языков;
- Прямой перевод речи в речь
Конфиденциальные данные и переменные среды
Пример исходного кода в этой статье зависит от переменных среды для сохранения конфиденциальных данных, таких как ключ и регион ресурса «Speech». Файл кода на языке Java содержит два значения static final String, которые назначаются из переменных среды компьютера узла: SPEECH__SUBSCRIPTION__KEY и SPEECH__SERVICE__REGION. Оба эти поля относятся к области класса, что делает их доступными внутри тел методов класса.
public class App {
static final String SPEECH__SUBSCRIPTION__KEY = System.getenv("SPEECH__SUBSCRIPTION__KEY");
static final String SPEECH__SERVICE__REGION = System.getenv("SPEECH__SERVICE__REGION");
public static void main(String[] args) { }
}
Дополнительные сведения о переменных среды см. в разделе Переменные среды и конфигурация приложения.
Внимание
Используйте ключи API с осторожностью. Не включайте ключ API непосредственно в код и никогда не публикуйте его. Если вы используете ключ API, сохраните его безопасно в Azure Key Vault. Дополнительные сведения об использовании ключей API безопасно в приложениях см. в разделе "Ключи API" с помощью Azure Key Vault.
Дополнительные сведения о безопасности служб ИИ см. в статье "Проверка подлинности запросов к службам ИИ Azure".
Создание конфигурации перевода речи
Чтобы вызвать службу "Речь" с помощью пакета SDK для службы "Речь", необходимо создать экземпляр SpeechTranslationConfig. Этот класс содержит сведения о ресурсе речевой службы, таких как ваш ключ и связанный регион, конечная точка, хост или маркер авторизации.
Совет
Независимо от того, используете ли вы распознавание речи, синтез речи, перевод или распознавание намерения, вы всегда создаете конфигурацию.
Инициализировать экземпляр SpeechTranslationConfig можно несколькими способами:
- По подписке: введите ключ и соответствующую ему область.
- Укажите конечную точку службы распознавания речи. Ключ или маркер авторизации являются необязательными.
- Для узла: передайте адрес узла. Ключ или маркер авторизации являются необязательными.
- Используя токен авторизации, укажите его и сопутствующий регион.
Давайте посмотрим, как создать экземпляр SpeechTranslationConfig с помощью ключа и региона. Получите ключ и регион ресурса службы "Речь" на портале Azure.
public class App {
static final String SPEECH__SUBSCRIPTION__KEY = System.getenv("SPEECH__SERVICE__KEY");
static final String SPEECH__SERVICE__REGION = System.getenv("SPEECH__SERVICE__REGION");
public static void main(String[] args) {
try {
translateSpeech();
System.exit(0);
} catch (Exception ex) {
System.out.println(ex);
System.exit(1);
}
}
static void translateSpeech() {
SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
}
}
Изменение исходного языка
Распространенной задачей перевода речи является определение языка ввода (или исходного языка). В следующем примере показано, как изменить язык ввода на итальянский. В вашем коде взаимодействуйте с экземпляром SpeechTranslationConfig, вызвав метод setSpeechRecognitionLanguage.
static void translateSpeech() {
SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
// Source (input) language
speechTranslationConfig.setSpeechRecognitionLanguage("it-IT");
}
Функция setSpeechRecognitionLanguage ожидает строку в формате язык-локаль. Ознакомьтесь со списком поддерживаемых локалей перевода речи.
Добавление языка перевода
Другой распространенной задачей перевода речи является указание целевых языков перевода. Необходимо указать по крайней мере один язык, при этом поддерживается и несколько языков. В следующем фрагменте кода в качестве целевых языков перевода задаются французский и немецкий языки:
static void translateSpeech() {
SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
speechTranslationConfig.setSpeechRecognitionLanguage("it-IT");
// Translate to languages. See https://aka.ms/speech/sttt-languages
speechTranslationConfig.addTargetLanguage("fr");
speechTranslationConfig.addTargetLanguage("de");
}
При каждом вызове метода addTargetLanguage указывается новый целевой язык перевода. Иными словами, при распознавании речи на исходном языке каждый целевой перевод доступен как часть результирующей операции перевода.
Инициализация распознавателя перевода
После создания экземпляра SpeechTranslationConfig следующим шагом является инициализация TranslationRecognizer. При инициализации TranslationRecognizer необходимо передать ему экземпляр speechTranslationConfig. Этот объект конфигурации предоставляет учетные данные, необходимые службе "Речь" для проверки запроса.
Если вы распознаете речь с помощью стандартного микрофона вашего устройства, вот как должен выглядеть TranslationRecognizer:
static void translateSpeech() {
SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
String fromLanguage = "en-US";
String[] toLanguages = { "it", "fr", "de" };
speechTranslationConfig.setSpeechRecognitionLanguage(fromLanguage);
for (String language : toLanguages) {
speechTranslationConfig.addTargetLanguage(language);
}
try (TranslationRecognizer translationRecognizer = new TranslationRecognizer(speechTranslationConfig)) {
}
}
Если вы хотите указать входное аудиоустройство, необходимо создать экземпляр класса AudioConfig и указать параметр audioConfig при инициализации TranslationRecognizer.
Во-первых, создайте ссылку на объект AudioConfig следующим образом:
static void translateSpeech() {
SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
String fromLanguage = "en-US";
String[] toLanguages = { "it", "fr", "de" };
speechTranslationConfig.setSpeechRecognitionLanguage(fromLanguage);
for (String language : toLanguages) {
speechTranslationConfig.addTargetLanguage(language);
}
AudioConfig audioConfig = AudioConfig.fromDefaultMicrophoneInput();
try (TranslationRecognizer translationRecognizer = new TranslationRecognizer(speechTranslationConfig, audioConfig)) {
}
}
Если вы хотите предоставить звуковой файл, а не использовать микрофон, вам по-прежнему нужно указать параметр audioConfig. Однако при создании экземпляра класса AudioConfig вместо вызова fromDefaultMicrophoneInput необходимо вызвать fromWavFileInput и передать параметр filename:
static void translateSpeech() {
SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
String fromLanguage = "en-US";
String[] toLanguages = { "it", "fr", "de" };
speechTranslationConfig.setSpeechRecognitionLanguage(fromLanguage);
for (String language : toLanguages) {
speechTranslationConfig.addTargetLanguage(language);
}
AudioConfig audioConfig = AudioConfig.fromWavFileInput("YourAudioFile.wav");
try (TranslationRecognizer translationRecognizer = new TranslationRecognizer(speechTranslationConfig, audioConfig)) {
}
}
Перевод речи
Чтобы перевести речь, пакет SDK для службы "Речь" использует микрофон или входной звуковой файл. Перед переводом речи выполняется распознавание речи. После инициализации всех объектов вызовите функцию распознавания один раз и получите результат.
static void translateSpeech() throws ExecutionException, InterruptedException {
SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
String fromLanguage = "en-US";
String[] toLanguages = { "it", "fr", "de" };
speechTranslationConfig.setSpeechRecognitionLanguage(fromLanguage);
for (String language : toLanguages) {
speechTranslationConfig.addTargetLanguage(language);
}
try (TranslationRecognizer translationRecognizer = new TranslationRecognizer(speechTranslationConfig)) {
System.out.printf("Say something in '%s' and we'll translate...", fromLanguage);
TranslationRecognitionResult translationRecognitionResult = translationRecognizer.recognizeOnceAsync().get();
if (translationRecognitionResult.getReason() == ResultReason.TranslatedSpeech) {
System.out.printf("Recognized: \"%s\"\n", translationRecognitionResult.getText());
for (Map.Entry<String, String> pair : translationRecognitionResult.getTranslations().entrySet()) {
System.out.printf("Translated into '%s': %s\n", pair.getKey(), pair.getValue());
}
}
}
}
Для получения дополнительной информации о преобразовании речи в текст см. основы распознавания речи.
Перевод на основе событий
Объект TranslationRecognizer предоставляет событие recognizing. Событие запускается несколько раз и предоставляет механизм получения промежуточных результатов перевода.
Примечание.
Промежуточные результаты перевода недоступны при использовании многоязычного перевода речи.
Следующий пример выводит промежуточные результаты перевода в консоль:
import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import com.microsoft.cognitiveservices.speech.translation.*;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Semaphore;
public class TranslationContinuous {
private static String SPEECH__SUBSCRIPTION__KEY = System.getenv("SPEECH__SUBSCRIPTION__KEY");
private static String SPEECH__SERVICE__REGION = System.getenv("SPEECH__SERVICE__REGION");
public static void main(String[] args) throws InterruptedException, ExecutionException {
SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
String fromLanguage = "en-US";
speechTranslationConfig.setSpeechRecognitionLanguage(fromLanguage);
speechTranslationConfig.addTargetLanguage("de");
speechTranslationConfig.addTargetLanguage("fr");
AudioConfig audioConfig = AudioConfig.fromWavFileInput("YourAudioFile.wav");
TranslationRecognizer translationRecognizer = new TranslationRecognizer(speechTranslationConfig, audioConfig);
Semaphore stopTranslationSemaphore = new Semaphore(0);
// Subscribes to events
translationRecognizer.recognizing.addEventListener((s, e) -> {
System.out.println("RECOGNIZING: Text=" + e.getResult().getText());
for (Map.Entry<String, String> pair : e.getResult().getTranslations().entrySet()) {
System.out.printf(" TRANSLATING into '%s': %s\n", pair.getKey(), pair.getValue());
}
});
translationRecognizer.recognized.addEventListener((s, e) -> {
if (e.getResult().getReason() == ResultReason.TranslatedSpeech) {
System.out.println("RECOGNIZED: Text=" + e.getResult().getText());
for (Map.Entry<String, String> pair : e.getResult().getTranslations().entrySet()) {
System.out.printf(" TRANSLATED into '%s': %s\n", pair.getKey(), pair.getValue());
}
} else if (e.getResult().getReason() == ResultReason.RecognizedSpeech) {
System.out.println("RECOGNIZED: Text=" + e.getResult().getText());
System.out.println(" Speech not translated.");
} else if (e.getResult().getReason() == ResultReason.NoMatch) {
System.out.println("NOMATCH: Speech could not be recognized.");
}
});
translationRecognizer.canceled.addEventListener((s, e) -> {
System.out.println("CANCELED: Reason=" + e.getReason());
if (e.getReason() == CancellationReason.Error) {
System.out.println("CANCELED: ErrorDetails=" + e.getErrorDetails());
}
stopTranslationSemaphore.release();
});
translationRecognizer.sessionStopped.addEventListener((s, e) -> {
System.out.println("Session stopped.");
stopTranslationSemaphore.release();
});
// Starts continuous recognition
System.out.println("Start translation...");
translationRecognizer.startContinuousRecognitionAsync().get();
// Waits for completion
stopTranslationSemaphore.acquire();
// Stops translation
translationRecognizer.stopContinuousRecognitionAsync().get();
}
}
Синтезирование переводов
После успешного распознавания речи и перевода словарь будет содержать все переводы. Функция getTranslations возвращает словарь, ключом которого является целевой язык перевода, а значением — переведенный текст. Распознанная речь может быть переведена, а затем синтезирована на другом языке (речевое преобразование).
Синтез на основе событий
Объект TranslationRecognizer предоставляет событие synthesizing. Это событие срабатывает несколько раз и предоставляет механизм для получения синтезированной речи из результата распознавания перевода. При переводе на несколько языков воспользуйтесь инструкциями по синтезу вручную.
Задайте синтетический голос, назначив экземпляр setVoiceName, и предоставьте обработчик событий для события synthesizing, чтобы получить звук. В следующем примере переведенная речь сохраняется в виде файла .wav.
Внимание
Синтез на основе событий работает только с одноязычным переводом.
Не добавляйте несколько целевых языков перевода. Кроме того, значение setVoiceName должно иметь тот же язык, что и целевой язык перевода. Например, "de" может быть сопоставлено с "de-DE-Hedda".
static void translateSpeech() throws ExecutionException, FileNotFoundException, InterruptedException, IOException {
SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
String fromLanguage = "en-US";
String toLanguage = "de";
speechTranslationConfig.setSpeechRecognitionLanguage(fromLanguage);
speechTranslationConfig.addTargetLanguage(toLanguage);
// See: https://aka.ms/speech/sdkregion#standard-and-neural-voices
speechTranslationConfig.setVoiceName("de-DE-Hedda");
try (TranslationRecognizer translationRecognizer = new TranslationRecognizer(speechTranslationConfig)) {
translationRecognizer.synthesizing.addEventListener((s, e) -> {
byte[] audio = e.getResult().getAudio();
int size = audio.length;
System.out.println("Audio synthesized: " + size + " byte(s)" + (size == 0 ? "(COMPLETE)" : ""));
if (size > 0) {
try (FileOutputStream file = new FileOutputStream("translation.wav")) {
file.write(audio);
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
System.out.printf("Say something in '%s' and we'll translate...", fromLanguage);
TranslationRecognitionResult translationRecognitionResult = translationRecognizer.recognizeOnceAsync().get();
if (translationRecognitionResult.getReason() == ResultReason.TranslatedSpeech) {
System.out.printf("Recognized: \"%s\"\n", translationRecognitionResult.getText());
for (Map.Entry<String, String> pair : translationRecognitionResult.getTranslations().entrySet()) {
String language = pair.getKey();
String translation = pair.getValue();
System.out.printf("Translated into '%s': %s\n", language, translation);
}
}
}
}
Синтез вручную
Функция getTranslations возвращает словарь, который можно использовать для синтезирования звука из текста перевода. Пройдите все переводы по очереди и синтезируйте переведенную речь. При создании экземпляра SpeechSynthesizer в качестве значения свойства SpeechConfig объекта setSpeechSynthesisVoiceName необходимо указать желаемый голос.
В следующем примере выполняется перевод на пять языков. Затем для каждого перевода создаётся аудиофайл на соответствующем нейронном языке.
static void translateSpeech() throws ExecutionException, InterruptedException {
SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
String fromLanguage = "en-US";
String[] toLanguages = { "de", "en", "it", "pt", "zh-Hans" };
speechTranslationConfig.setSpeechRecognitionLanguage(fromLanguage);
for (String language : toLanguages) {
speechTranslationConfig.addTargetLanguage(language);
}
try (TranslationRecognizer translationRecognizer = new TranslationRecognizer(speechTranslationConfig)) {
System.out.printf("Say something in '%s' and we'll translate...", fromLanguage);
TranslationRecognitionResult translationRecognitionResult = translationRecognizer.recognizeOnceAsync().get();
if (translationRecognitionResult.getReason() == ResultReason.TranslatedSpeech) {
// See: https://aka.ms/speech/sdkregion#standard-and-neural-voices
Map<String, String> languageToVoiceMap = new HashMap<String, String>();
languageToVoiceMap.put("de", "de-DE-KatjaNeural");
languageToVoiceMap.put("en", "en-US-AriaNeural");
languageToVoiceMap.put("it", "it-IT-ElsaNeural");
languageToVoiceMap.put("pt", "pt-BR-FranciscaNeural");
languageToVoiceMap.put("zh-Hans", "zh-CN-XiaoxiaoNeural");
System.out.printf("Recognized: \"%s\"\n", translationRecognitionResult.getText());
for (Map.Entry<String, String> pair : translationRecognitionResult.getTranslations().entrySet()) {
String language = pair.getKey();
String translation = pair.getValue();
System.out.printf("Translated into '%s': %s\n", language, translation);
SpeechConfig speechConfig =
SpeechConfig.fromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
speechConfig.setSpeechSynthesisVoiceName(languageToVoiceMap.get(language));
AudioConfig audioConfig = AudioConfig.fromWavFileOutput(language + "-translation.wav");
try (SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(speechConfig, audioConfig)) {
speechSynthesizer.SpeakTextAsync(translation).get();
}
}
}
}
}
Дополнительные сведения о синтезе речи см. в разделе Основы синтеза речи.
Многоязычный перевод с идентификацией языка
Во многих случаях может быть неизвестно, какие языки ввода требуется указать. С помощью идентификации языка можно обнаружить до 10 возможных языков ввода и автоматически перевести на целевые языки.
В следующем примере предполагается, что следует обнаружить en-US или zh-CN, потому что они определены в AutoDetectSourceLanguageConfig. Затем речь переводится на de и fr, как указано в вызовах функции addTargetLanguage().
speechTranslationConfig.addTargetLanguage("de");
speechTranslationConfig.addTargetLanguage("fr");
AutoDetectSourceLanguageConfig autoDetectSourceLanguageConfig =
AutoDetectSourceLanguageConfig.fromLanguages(Arrays.asList("en-US", "zh-CN"));
TranslationRecognizer translationRecognizer =
new TranslationRecognizer(speechTranslationConfig, autoDetectSourceLanguageConfig, audioConfig);
Полный пример кода см. в разделе "Идентификация языка".
Справочная документация | Пакет (NuGet) | Дополнительные примеры на GitHub
Из этого руководства вы узнаете, как распознать человеческую речь и перевести ее на другой язык.
В разделе с общими сведениями о переводе речи вы сможете получить дополнительную информацию по следующим темам:
- преобразование речи в текст;
- перевод речи на несколько целевых языков;
- Прямой перевод речи в речь
Конфиденциальные данные и переменные среды
Пример исходного кода в этой статье зависит от переменных среды для сохранения конфиденциальных данных, таких как ключ и регион ресурса «Speech». Файл кода на языке C++ содержит два значения, которые назначаются из переменных среды компьютера узла: SPEECH__SUBSCRIPTION__KEY и SPEECH__SERVICE__REGION. Оба эти поля относятся к области класса, что делает их доступными внутри тел методов класса.
auto SPEECH__SUBSCRIPTION__KEY = getenv("SPEECH__SUBSCRIPTION__KEY");
auto SPEECH__SERVICE__REGION = getenv("SPEECH__SERVICE__REGION");
Дополнительные сведения о переменных среды см. в разделе Переменные среды и конфигурация приложения.
Внимание
Используйте ключи API с осторожностью. Не включайте ключ API непосредственно в код и никогда не публикуйте его. Если вы используете ключ API, сохраните его безопасно в Azure Key Vault. Дополнительные сведения об использовании ключей API безопасно в приложениях см. в разделе "Ключи API" с помощью Azure Key Vault.
Дополнительные сведения о безопасности служб ИИ см. в статье "Проверка подлинности запросов к службам ИИ Azure".
Создание конфигурации перевода речи
Чтобы вызвать службу "Речь" с помощью пакета SDK для службы "Речь", необходимо создать экземпляр SpeechTranslationConfig. Этот класс содержит сведения о ресурсе речевой службы, таких как ваш ключ и связанный регион, конечная точка, хост или маркер авторизации.
Совет
Независимо от того, используете ли вы распознавание речи, синтез речи, перевод или распознавание намерения, вы всегда создаете конфигурацию.
Инициализировать SpeechTranslationConfig можно несколькими способами:
- По подписке: введите ключ и соответствующую ему область.
- Укажите конечную точку службы распознавания речи. Ключ или маркер авторизации являются необязательными.
- Для узла: передайте адрес узла. Ключ или маркер авторизации являются необязательными.
- Используя токен авторизации, укажите его и сопутствующий регион.
Давайте посмотрим, как создать экземпляр SpeechTranslationConfig с помощью ключа и региона. Получите ключ и регион ресурса службы "Речь" на портале Azure.
auto SPEECH__SUBSCRIPTION__KEY = getenv("SPEECH__SUBSCRIPTION__KEY");
auto SPEECH__SERVICE__REGION = getenv("SPEECH__SERVICE__REGION");
void translateSpeech() {
auto speechTranslationConfig =
SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
}
int main(int argc, char** argv) {
setlocale(LC_ALL, "");
translateSpeech();
return 0;
}
Изменение исходного языка
Распространенной задачей перевода речи является определение языка ввода (или исходного языка). В следующем примере показано, как изменить язык ввода на итальянский. В своем коде обратитесь к экземпляру SpeechTranslationConfig, вызвав метод SetSpeechRecognitionLanguage.
void translateSpeech() {
auto speechTranslationConfig =
SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
// Source (input) language
speechTranslationConfig->SetSpeechRecognitionLanguage("it-IT");
}
Свойство SpeechRecognitionLanguage принимает строку формата языкового стандарта. Ознакомьтесь со списком поддерживаемых локалей перевода речи.
Добавление языка перевода
Другой распространенной задачей перевода речи является указание целевых языков перевода. Необходимо указать по крайней мере один язык, при этом поддерживается и несколько языков. В следующем фрагменте кода в качестве целевых языков перевода задаются французский и немецкий языки:
void translateSpeech() {
auto speechTranslationConfig =
SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
speechTranslationConfig->SetSpeechRecognitionLanguage("it-IT");
speechTranslationConfig->AddTargetLanguage("fr");
speechTranslationConfig->AddTargetLanguage("de");
}
При каждом вызове метода AddTargetLanguage указывается новый целевой язык перевода. Иными словами, при распознавании речи на исходном языке каждый целевой перевод доступен как часть результирующей операции перевода.
Инициализация распознавателя перевода
После создания экземпляра SpeechTranslationConfig следующим шагом является инициализация TranslationRecognizer. При инициализации TranslationRecognizer необходимо передать ему экземпляр translationConfig. Этот объект конфигурации предоставляет учетные данные, необходимые службе "Речь" для проверки запроса.
Если вы распознаете речь с помощью стандартного микрофона вашего устройства, вот как должен выглядеть TranslationRecognizer:
void translateSpeech() {
auto speechTranslationConfig =
SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
auto fromLanguage = "en-US";
auto toLanguages = { "it", "fr", "de" };
speechTranslationConfig->SetSpeechRecognitionLanguage(fromLanguage);
for (auto language : toLanguages) {
speechTranslationConfig->AddTargetLanguage(language);
}
auto translationRecognizer = TranslationRecognizer::FromConfig(speechTranslationConfig);
}
Если вы хотите указать входное аудиоустройство, необходимо создать экземпляр класса AudioConfig и указать параметр audioConfig при инициализации TranslationRecognizer.
Во-первых, создайте ссылку на объект AudioConfig следующим образом:
void translateSpeech() {
auto speechTranslationConfig =
SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
auto fromLanguage = "en-US";
auto toLanguages = { "it", "fr", "de" };
speechTranslationConfig->SetSpeechRecognitionLanguage(fromLanguage);
for (auto language : toLanguages) {
speechTranslationConfig->AddTargetLanguage(language);
}
auto audioConfig = AudioConfig::FromDefaultMicrophoneInput();
auto translationRecognizer = TranslationRecognizer::FromConfig(speechTranslationConfig, audioConfig);
}
Если вы хотите предоставить звуковой файл, а не использовать микрофон, вам по-прежнему нужно указать параметр audioConfig. Однако при создании экземпляра класса AudioConfig вместо вызова FromDefaultMicrophoneInput необходимо вызвать FromWavFileInput и передать параметр filename:
void translateSpeech() {
auto speechTranslationConfig =
SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
auto fromLanguage = "en-US";
auto toLanguages = { "it", "fr", "de" };
speechTranslationConfig->SetSpeechRecognitionLanguage(fromLanguage);
for (auto language : toLanguages) {
speechTranslationConfig->AddTargetLanguage(language);
}
auto audioConfig = AudioConfig::FromWavFileInput("YourAudioFile.wav");
auto translationRecognizer = TranslationRecognizer::FromConfig(speechTranslationConfig, audioConfig);
}
Перевод речи
Чтобы перевести речь, пакет SDK для службы "Речь" использует микрофон или входной звуковой файл. Перед переводом речи выполняется распознавание речи. После инициализации всех объектов вызовите функцию распознавания один раз и получите результат.
void translateSpeech() {
auto speechTranslationConfig =
SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
string fromLanguage = "en-US";
string toLanguages[3] = { "it", "fr", "de" };
speechTranslationConfig->SetSpeechRecognitionLanguage(fromLanguage);
for (auto language : toLanguages) {
speechTranslationConfig->AddTargetLanguage(language);
}
auto translationRecognizer = TranslationRecognizer::FromConfig(speechTranslationConfig);
cout << "Say something in '" << fromLanguage << "' and we'll translate...\n";
auto result = translationRecognizer->RecognizeOnceAsync().get();
if (result->Reason == ResultReason::TranslatedSpeech)
{
cout << "Recognized: \"" << result->Text << "\"" << std::endl;
for (auto pair : result->Translations)
{
auto language = pair.first;
auto translation = pair.second;
cout << "Translated into '" << language << "': " << translation << std::endl;
}
}
}
Для получения дополнительной информации о преобразовании речи в текст см. основы распознавания речи.
Перевод на основе событий
Объект TranslationRecognizer предоставляет событие Recognizing. Событие запускается несколько раз и предоставляет механизм получения промежуточных результатов перевода.
Примечание.
Промежуточные результаты перевода недоступны при использовании многоязычного перевода речи.
Следующий пример выводит промежуточные результаты перевода в консоль:
void translateSpeechContinuous() {
auto speechTranslationConfig =
SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
auto fromLanguage = "en-US";
auto toLanguage = "de";
speechTranslationConfig->SetSpeechRecognitionLanguage(fromLanguage);
speechTranslationConfig->AddTargetLanguage(toLanguage);
auto audioConfig = AudioConfig::FromWavFileInput("whatstheweatherlike.wav");
auto translationRecognizer = TranslationRecognizer::FromConfig(speechTranslationConfig, audioConfig);
// Promise for synchronization of recognition end.
promise<void> recognitionEnd;
// Subscribes to events.
translationRecognizer->Recognizing.Connect([&fromLanguage](const TranslationRecognitionEventArgs& e) {
cout << "RECOGNIZING in '" << fromLanguage << "': Text=" << e.Result->Text << std::endl;
for (const auto& pair : e.Result->Translations) {
cout << " TRANSLATING into '" << pair.first << "': " << pair.second << std::endl;
}
});
translationRecognizer->Recognized.Connect([&fromLanguage](const TranslationRecognitionEventArgs& e) {
if (e.Result->Reason == ResultReason::TranslatedSpeech) {
cout << "RECOGNIZED in '" << fromLanguage << "': Text=" << e.Result->Text << std::endl;
for (const auto& pair : e.Result->Translations) {
cout << " TRANSLATED into '" << pair.first << "': " << pair.second << std::endl;
}
}
else if (e.Result->Reason == ResultReason::RecognizedSpeech) {
cout << "RECOGNIZED: Text=" << e.Result->Text << std::endl;
cout << " Speech not translated." << std::endl;
}
else if (e.Result->Reason == ResultReason::NoMatch) {
cout << "NOMATCH: Speech could not be recognized." << std::endl;
}
});
translationRecognizer->Canceled.Connect([&recognitionEnd](const TranslationRecognitionCanceledEventArgs& e) {
cout << "CANCELED: Reason=" << (int)e.Reason << std::endl;
if (e.Reason == CancellationReason::Error) {
cout << "CANCELED: ErrorDetails=" << e.ErrorDetails << std::endl;
}
recognitionEnd.set_value();
});
translationRecognizer->SessionStopped.Connect([&recognitionEnd](const SessionEventArgs& e) {
cout << "SESSION STOPPED" << std::endl;
recognitionEnd.set_value();
});
// Start continuous recognition
cout << "Start translation..." << std::endl;
translationRecognizer->StartContinuousRecognitionAsync().get();
// Wait for completion
recognitionEnd.get_future().get();
// Stop recognition
translationRecognizer->StopContinuousRecognitionAsync().get();
}
Синтезирование переводов
После успешного распознавания речи и перевода словарь будет содержать все переводы. Ключом словаря Translations является целевой язык перевода, а значением — переведенный текст. Распознанная речь может быть переведена, а затем синтезирована на другом языке (речевое преобразование).
Синтез на основе событий
Объект TranslationRecognizer предоставляет событие Synthesizing. Это событие срабатывает несколько раз и предоставляет механизм для получения синтезированной речи из результата распознавания перевода. При переводе на несколько языков воспользуйтесь инструкциями по синтезу вручную.
Задайте синтетический голос, назначив экземпляр SetVoiceName, и предоставьте обработчик событий для события Synthesizing, чтобы получить звук. В следующем примере переведенная речь сохраняется в виде файла .wav.
Внимание
Синтез на основе событий работает только с одноязычным переводом.
Не добавляйте несколько целевых языков перевода. Кроме того, значение SetVoiceName должно иметь тот же язык, что и целевой язык перевода. Например, "de" может быть сопоставлено с "de-DE-Hedda".
void translateSpeech() {
auto speechTranslationConfig =
SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
auto fromLanguage = "en-US";
auto toLanguage = "de";
speechTranslationConfig->SetSpeechRecognitionLanguage(fromLanguage);
speechTranslationConfig->AddTargetLanguage(toLanguage);
speechTranslationConfig->SetVoiceName("de-DE-Hedda");
auto translationRecognizer = TranslationRecognizer::FromConfig(speechTranslationConfig);
translationRecognizer->Synthesizing.Connect([](const TranslationSynthesisEventArgs& e)
{
auto audio = e.Result->Audio;
auto size = audio.size();
cout << "Audio synthesized: " << size << " byte(s)" << (size == 0 ? "(COMPLETE)" : "") << std::endl;
if (size > 0) {
ofstream file("translation.wav", ios::out | ios::binary);
auto audioData = audio.data();
file.write((const char*)audioData, sizeof(audio[0]) * size);
file.close();
}
});
cout << "Say something in '" << fromLanguage << "' and we'll translate...\n";
auto result = translationRecognizer->RecognizeOnceAsync().get();
if (result->Reason == ResultReason::TranslatedSpeech)
{
cout << "Recognized: \"" << result->Text << "\"" << std::endl;
for (auto pair : result->Translations)
{
auto language = pair.first;
auto translation = pair.second;
cout << "Translated into '" << language << "': " << translation << std::endl;
}
}
}
Синтез вручную
Для синтезирования звука из текста перевода можно использовать словарь Translations. Пройдите все переводы по очереди и синтезируйте переведенную речь. При создании экземпляра SpeechSynthesizer в качестве значения свойства SpeechConfig объекта SetSpeechSynthesisVoiceName необходимо указать желаемый голос.
В следующем примере выполняется перевод на пять языков. Затем для каждого перевода создаётся аудиофайл на соответствующем нейронном языке.
void translateSpeech() {
auto speechTranslationConfig =
SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
auto fromLanguage = "en-US";
auto toLanguages = { "de", "en", "it", "pt", "zh-Hans" };
speechTranslationConfig->SetSpeechRecognitionLanguage(fromLanguage);
for (auto language : toLanguages) {
speechTranslationConfig->AddTargetLanguage(language);
}
auto translationRecognizer = TranslationRecognizer::FromConfig(speechTranslationConfig);
cout << "Say something in '" << fromLanguage << "' and we'll translate...\n";
auto result = translationRecognizer->RecognizeOnceAsync().get();
if (result->Reason == ResultReason::TranslatedSpeech)
{
map<string, string> languageToVoiceMap;
languageToVoiceMap["de"] = "de-DE-KatjaNeural";
languageToVoiceMap["en"] = "en-US-AriaNeural";
languageToVoiceMap["it"] = "it-IT-ElsaNeural";
languageToVoiceMap["pt"] = "pt-BR-FranciscaNeural";
languageToVoiceMap["zh-Hans"] = "zh-CN-XiaoxiaoNeural";
cout << "Recognized: \"" << result->Text << "\"" << std::endl;
for (auto pair : result->Translations)
{
auto language = pair.first;
auto translation = pair.second;
cout << "Translated into '" << language << "': " << translation << std::endl;
auto speechConfig =
SpeechConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
speechConfig->SetSpeechSynthesisVoiceName(languageToVoiceMap[language]);
auto audioConfig = AudioConfig::FromWavFileOutput(language + "-translation.wav");
auto speechSynthesizer = SpeechSynthesizer::FromConfig(speechConfig, audioConfig);
speechSynthesizer->SpeakTextAsync(translation).get();
}
}
}
Дополнительные сведения о синтезе речи см. в разделе Основы синтеза речи.
Многоязычный перевод с идентификацией языка
Во многих случаях может быть неизвестно, какие языки ввода требуется указать. С помощью идентификации языка можно обнаружить до 10 возможных языков ввода и автоматически перевести на целевые языки.
В следующем примере предполагается, что следует обнаружить en-US или zh-CN, потому что они определены в AutoDetectSourceLanguageConfig. Затем речь будет переведена на языки de и fr, как указано в вызовах к AddTargetLanguage().
speechTranslationConfig->AddTargetLanguage("de");
speechTranslationConfig->AddTargetLanguage("fr");
auto autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig::FromLanguages({ "en-US", "zh-CN" });
auto translationRecognizer = TranslationRecognizer::FromConfig(speechTranslationConfig, autoDetectSourceLanguageConfig, audioConfig);
Полный пример кода см. в разделе "Идентификация языка".
Справочная документация | Пакет (Go) | Дополнительные примеры на GitHub
Из этого руководства вы узнаете, как распознать человеческую речь и перевести ее на другой язык.
В разделе с общими сведениями о переводе речи вы сможете получить дополнительную информацию по следующим темам:
- преобразование речи в текст;
- перевод речи на несколько целевых языков;
- Прямой перевод речи в речь
Конфиденциальные данные и переменные среды
Пример исходного кода в этой статье зависит от переменных среды для сохранения конфиденциальных данных, таких как ключ и регион ресурса «Speech». Файл кода Go содержит два значения, назначенные переменными среды хост-компьютера: SPEECH_KEY и SPEECH_REGION. Обе эти переменные находятся в области пакета, поэтому они доступны в функциях пакета:
speechKey := os.Getenv("SPEECH_KEY")
speechRegion := os.Getenv("SPEECH_REGION")
Дополнительные сведения о переменных среды см. в разделе Переменные среды и конфигурация приложения.
Внимание
Используйте ключи API с осторожностью. Не включайте ключ API непосредственно в код и никогда не публикуйте его. Если вы используете ключ API, сохраните его безопасно в Azure Key Vault. Дополнительные сведения об использовании ключей API безопасно в приложениях см. в разделе "Ключи API" с помощью Azure Key Vault.
Дополнительные сведения о безопасности служб ИИ см. в статье "Проверка подлинности запросов к службам ИИ Azure".
Создание конфигурации перевода речи
Чтобы вызвать службу "Речь" с помощью пакета SDK для службы "Речь", необходимо создать экземпляр SpeechTranslationConfig. Этот класс содержит сведения о ресурсе речевой службы, таких как ваш ключ и связанный регион, конечная точка, хост или маркер авторизации.
Совет
Независимо от того, используете ли вы распознавание речи, синтез речи, перевод или распознавание намерения, вы всегда создаете конфигурацию.
Инициализировать экземпляр SpeechTranslationConfig можно несколькими способами:
- По подписке: введите ключ и соответствующую ему область.
- Укажите конечную точку службы распознавания речи. Ключ или маркер авторизации являются необязательными.
- Для узла: передайте адрес узла. Ключ или маркер авторизации являются необязательными.
- Используя токен авторизации, укажите его и сопутствующий регион.
Давайте посмотрим, как создать экземпляр SpeechTranslationConfig с помощью ключа и региона. Получите ключ и регион ресурса службы "Речь" на портале Azure.
import (
"fmt"
"os"
"github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
"github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)
func translateSpeech() {
speechKey := os.Getenv("SPEECH_KEY")
speechRegion := os.Getenv("SPEECH_REGION")
translationConfig, err := speech.NewSpeechTranslationConfigFromSubscription(speechKey, speechRegion)
if err != nil {
fmt.Println("Error creating translation config:", err)
return
}
defer translationConfig.Close()
}
Изменение исходного языка
Распространенной задачей перевода речи является определение языка ввода (или исходного языка). В следующем примере показано, как изменить язык ввода на итальянский. В вашем коде взаимодействуйте с экземпляром SpeechTranslationConfig, вызвав метод SetSpeechRecognitionLanguage.
func translateSpeech() {
speechKey := os.Getenv("SPEECH_KEY")
speechRegion := os.Getenv("SPEECH_REGION")
translationConfig, err := speech.NewSpeechTranslationConfigFromSubscription(speechKey, speechRegion)
if err != nil {
fmt.Println("Error creating translation config:", err)
return
}
defer translationConfig.Close()
// Source (input) language
translationConfig.SetSpeechRecognitionLanguage("it-IT")
}
Метод SetSpeechRecognitionLanguage ожидает строку формата языковой локали. Ознакомьтесь со списком поддерживаемых локалей перевода речи.
Добавление языка перевода
Другой распространенной задачей перевода речи является указание целевых языков перевода. Необходимо указать по крайней мере один язык, при этом поддерживается и несколько языков. В следующем фрагменте кода в качестве целевых языков перевода задаются французский и немецкий языки:
func translateSpeech() {
speechKey := os.Getenv("SPEECH_KEY")
speechRegion := os.Getenv("SPEECH_REGION")
translationConfig, err := speech.NewSpeechTranslationConfigFromSubscription(speechKey, speechRegion)
if err != nil {
fmt.Println("Error creating translation config:", err)
return
}
defer translationConfig.Close()
translationConfig.SetSpeechRecognitionLanguage("it-IT")
// Translate to languages. See https://aka.ms/speech/sttt-languages
translationConfig.AddTargetLanguage("fr")
translationConfig.AddTargetLanguage("de")
}
При каждом вызове метода AddTargetLanguage указывается новый целевой язык перевода. Иными словами, при распознавании речи на исходном языке каждый целевой перевод доступен как часть результирующей операции перевода.
Инициализация распознавателя перевода
После создания экземпляра SpeechTranslationConfig следующим шагом является инициализация TranslationRecognizer. При инициализации TranslationRecognizer необходимо передать ему экземпляр translationConfig. Этот объект конфигурации предоставляет учетные данные, необходимые службе "Речь" для проверки запроса.
Если вы распознаете речь с помощью стандартного микрофона вашего устройства, вот как должен выглядеть TranslationRecognizer:
func translateSpeech() {
speechKey := os.Getenv("SPEECH_KEY")
speechRegion := os.Getenv("SPEECH_REGION")
translationConfig, err := speech.NewSpeechTranslationConfigFromSubscription(speechKey, speechRegion)
if err != nil {
fmt.Println("Error creating translation config:", err)
return
}
defer translationConfig.Close()
fromLanguage := "en-US"
toLanguages := []string{"it", "fr", "de"}
translationConfig.SetSpeechRecognitionLanguage(fromLanguage)
for _, language := range toLanguages {
translationConfig.AddTargetLanguage(language)
}
audioConfig, err := audio.NewAudioConfigFromDefaultMicrophoneInput()
if err != nil {
fmt.Println("Error creating audio config:", err)
return
}
defer audioConfig.Close()
translationRecognizer, err := speech.NewTranslationRecognizerFromConfig(translationConfig, audioConfig)
if err != nil {
fmt.Println("Error creating translation recognizer:", err)
return
}
defer translationRecognizer.Close()
}
Если вы хотите предоставить звуковой файл, а не использовать микрофон, вам по-прежнему нужно указать параметр audioConfig. Однако при создании экземпляра AudioConfig вместо вызова NewAudioConfigFromDefaultMicrophoneInput нужно вызвать NewAudioConfigFromWavFileInput и передать имя файла:
audioConfig, err := audio.NewAudioConfigFromWavFileInput("YourAudioFile.wav")
if err != nil {
fmt.Println("Error creating audio config:", err)
return
}
defer audioConfig.Close()
Перевод речи
Чтобы перевести речь, пакет SDK для службы "Речь" использует микрофон или входной звуковой файл. Перед переводом речи выполняется распознавание речи. После инициализации всех объектов вызовите функцию распознавания один раз и получите результат.
package main
import (
"fmt"
"os"
"github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
"github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)
func main() {
speechKey := os.Getenv("SPEECH_KEY")
speechRegion := os.Getenv("SPEECH_REGION")
translationConfig, err := speech.NewSpeechTranslationConfigFromSubscription(speechKey, speechRegion)
if err != nil {
fmt.Println("Error creating translation config:", err)
return
}
defer translationConfig.Close()
fromLanguage := "en-US"
toLanguages := []string{"it", "fr", "de"}
translationConfig.SetSpeechRecognitionLanguage(fromLanguage)
for _, language := range toLanguages {
translationConfig.AddTargetLanguage(language)
}
audioConfig, err := audio.NewAudioConfigFromDefaultMicrophoneInput()
if err != nil {
fmt.Println("Error creating audio config:", err)
return
}
defer audioConfig.Close()
translationRecognizer, err := speech.NewTranslationRecognizerFromConfig(translationConfig, audioConfig)
if err != nil {
fmt.Println("Error creating translation recognizer:", err)
return
}
defer translationRecognizer.Close()
fmt.Printf("Say something in '%s' and we'll translate...\n", fromLanguage)
outcome := <-translationRecognizer.RecognizeOnceAsync()
if outcome.Error != nil {
fmt.Println("Recognition error:", outcome.Error)
return
}
result := outcome.Result
defer result.Close()
translations := result.GetTranslations()
fmt.Printf("Recognized: \"%s\"\n", result.Text)
for lang, translation := range translations {
fmt.Printf("Translated into '%s': %s\n", lang, translation)
}
}
Для получения дополнительной информации о преобразовании речи в текст см. основы распознавания речи.
Перевод на основе событий
В предыдущем примере используется одноразовый перевод, который переводит одно высказывание. Вы также можете использовать событийно-ориентированный перевод для длительных сеансов. Перевод на основе событий требует подписки на события для получения результатов перевода.
Примечание.
Промежуточные результаты перевода недоступны при использовании многоязычного перевода речи.
В следующем примере показано, как использовать перевод на основе событий:
package main
import (
"bufio"
"fmt"
"os"
"github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
"github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)
func main() {
speechKey := os.Getenv("SPEECH_KEY")
speechRegion := os.Getenv("SPEECH_REGION")
translationConfig, err := speech.NewSpeechTranslationConfigFromSubscription(speechKey, speechRegion)
if err != nil {
fmt.Println("Error creating translation config:", err)
return
}
defer translationConfig.Close()
fromLanguage := "en-US"
toLanguages := []string{"de", "fr"}
translationConfig.SetSpeechRecognitionLanguage(fromLanguage)
for _, language := range toLanguages {
translationConfig.AddTargetLanguage(language)
}
audioConfig, err := audio.NewAudioConfigFromDefaultMicrophoneInput()
if err != nil {
fmt.Println("Error creating audio config:", err)
return
}
defer audioConfig.Close()
translationRecognizer, err := speech.NewTranslationRecognizerFromConfig(translationConfig, audioConfig)
if err != nil {
fmt.Println("Error creating translation recognizer:", err)
return
}
defer translationRecognizer.Close()
// Subscribe to events
translationRecognizer.Recognizing(func(event speech.TranslationRecognitionEventArgs) {
fmt.Printf("RECOGNIZING: %s\n", event.Result.Text)
})
translationRecognizer.Recognized(func(event speech.TranslationRecognitionEventArgs) {
if event.Result.Reason == speech.ResultReason.TranslatedSpeech {
fmt.Printf("RECOGNIZED: %s\n", event.Result.Text)
for lang, translation := range event.Result.GetTranslations() {
fmt.Printf("TRANSLATED into '%s': %s\n", lang, translation)
}
}
})
translationRecognizer.Canceled(func(event speech.TranslationRecognitionCanceledEventArgs) {
fmt.Printf("CANCELED: Reason=%d\n", event.Reason)
if event.Reason == speech.CancellationReason.Error {
fmt.Printf("CANCELED: ErrorDetails=%s\n", event.ErrorDetails)
}
})
translationRecognizer.SessionStopped(func(event speech.SessionEventArgs) {
fmt.Println("Session stopped.")
})
// Start continuous recognition
err = <-translationRecognizer.StartContinuousRecognitionAsync()
if err != nil {
fmt.Println("Error starting continuous recognition:", err)
return
}
fmt.Println("Event based translation started. Press Enter to stop...")
bufio.NewReader(os.Stdin).ReadBytes('\n')
// Stop continuous recognition
err = <-translationRecognizer.StopContinuousRecognitionAsync()
if err != nil {
fmt.Println("Error stopping continuous recognition:", err)
return
}
}
Синтезирование переводов
После успешного распознавания речи и перевода результат содержит все переводы на карте. Метод GetTranslations() возвращает карту с ключом в качестве целевого языка перевода и значение в виде переведенного текста. Распознанная речь может быть переведена, а затем синтезирована на другом языке (речевое преобразование).
Синтез на основе событий
Объект TranslationRecognizer реализует обратный Synthesizing вызов. Это событие срабатывает несколько раз и предоставляет механизм для получения синтезированной речи из результата распознавания перевода. При переводе на несколько языков воспользуйтесь инструкциями по синтезу вручную.
Укажите голос синтеза, вызвав метод SetVoiceName в конфигурации, и предоставьте функцию обратного вызова для события Synthesizing, чтобы получить звук. В следующем примере переведенная речь сохраняется в виде файла .wav.
Внимание
Синтез на основе событий работает только с одноязычным переводом.
Не добавляйте несколько целевых языков перевода. Кроме того, значение SetVoiceName должно иметь тот же язык, что и целевой язык перевода. Например, "de" может быть сопоставлено с "de-DE-Hedda".
package main
import (
"fmt"
"os"
"github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
"github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)
func main() {
speechKey := os.Getenv("SPEECH_KEY")
speechRegion := os.Getenv("SPEECH_REGION")
translationConfig, err := speech.NewSpeechTranslationConfigFromSubscription(speechKey, speechRegion)
if err != nil {
fmt.Println("Error creating translation config:", err)
return
}
defer translationConfig.Close()
fromLanguage := "en-US"
toLanguage := "de"
translationConfig.SetSpeechRecognitionLanguage(fromLanguage)
translationConfig.AddTargetLanguage(toLanguage)
// See: https://aka.ms/speech/sdkregion#standard-and-neural-voices
translationConfig.SetVoiceName("de-DE-Hedda")
audioConfig, err := audio.NewAudioConfigFromDefaultMicrophoneInput()
if err != nil {
fmt.Println("Error creating audio config:", err)
return
}
defer audioConfig.Close()
translationRecognizer, err := speech.NewTranslationRecognizerFromConfig(translationConfig, audioConfig)
if err != nil {
fmt.Println("Error creating translation recognizer:", err)
return
}
defer translationRecognizer.Close()
translationRecognizer.Synthesizing(func(event speech.TranslationSynthesisEventArgs) {
audioData := event.Result.GetAudio()
size := len(audioData)
fmt.Printf("Audio synthesized: %d byte(s) %s\n", size, map[bool]string{true: "(COMPLETE)", false: ""}[size == 0])
if size > 0 {
file, err := os.Create("translation.wav")
if err != nil {
fmt.Println("Error creating file:", err)
return
}
defer file.Close()
file.Write(audioData)
}
})
fmt.Printf("Say something in '%s' and we'll translate to '%s'...\n", fromLanguage, toLanguage)
outcome := <-translationRecognizer.RecognizeOnceAsync()
if outcome.Error != nil {
fmt.Println("Recognition error:", outcome.Error)
return
}
result := outcome.Result
defer result.Close()
if result.Reason == speech.ResultReason.TranslatedSpeech {
fmt.Printf("Recognized: \"%s\"\n", result.Text)
translations := result.GetTranslations()
fmt.Printf("Translated into '%s': %s\n", toLanguage, translations[toLanguage])
}
}
Синтез вручную
Вы можете использовать карту переводов для синтеза звука из текста перевода. Пройдите все переводы по очереди и синтезируйте переведенную речь. При создании экземпляра SpeechSynthesizer, необходимо вызвать метод SpeechConfig объекта SetSpeechSynthesisVoiceName с нужным голосом.
В следующем примере выполняется перевод на пять языков. Затем для каждого перевода создаётся аудиофайл на соответствующем нейронном языке.
package main
import (
"fmt"
"os"
"github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
"github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)
func main() {
speechKey := os.Getenv("SPEECH_KEY")
speechRegion := os.Getenv("SPEECH_REGION")
translationConfig, err := speech.NewSpeechTranslationConfigFromSubscription(speechKey, speechRegion)
if err != nil {
fmt.Println("Error creating translation config:", err)
return
}
defer translationConfig.Close()
fromLanguage := "en-US"
toLanguages := []string{"de", "fr", "it", "pt", "zh-Hans"}
translationConfig.SetSpeechRecognitionLanguage(fromLanguage)
for _, language := range toLanguages {
translationConfig.AddTargetLanguage(language)
}
audioConfig, err := audio.NewAudioConfigFromDefaultMicrophoneInput()
if err != nil {
fmt.Println("Error creating audio config:", err)
return
}
defer audioConfig.Close()
translationRecognizer, err := speech.NewTranslationRecognizerFromConfig(translationConfig, audioConfig)
if err != nil {
fmt.Println("Error creating translation recognizer:", err)
return
}
defer translationRecognizer.Close()
fmt.Println("Say something...")
outcome := <-translationRecognizer.RecognizeOnceAsync()
if outcome.Error != nil {
fmt.Println("Recognition error:", outcome.Error)
return
}
result := outcome.Result
defer result.Close()
if result.Reason == speech.ResultReason.TranslatedSpeech {
languageToVoiceMap := map[string]string{
"de": "de-DE-KatjaNeural",
"fr": "fr-FR-DeniseNeural",
"it": "it-IT-ElsaNeural",
"pt": "pt-BR-FranciscaNeural",
"zh-Hans": "zh-CN-XiaoxiaoNeural",
}
fmt.Printf("Recognized: \"%s\"\n", result.Text)
translations := result.GetTranslations()
for language, translation := range translations {
fmt.Printf("Translated into '%s': %s\n", language, translation)
speechConfig, err := speech.NewSpeechConfigFromSubscription(speechKey, speechRegion)
if err != nil {
fmt.Println("Error creating speech config:", err)
continue
}
speechConfig.SetSpeechSynthesisVoiceName(languageToVoiceMap[language])
outputFile := fmt.Sprintf("%s-translation.wav", language)
audioOutput, err := audio.NewAudioConfigFromWavFileOutput(outputFile)
if err != nil {
fmt.Println("Error creating audio output config:", err)
speechConfig.Close()
continue
}
synthesizer, err := speech.NewSpeechSynthesizerFromConfig(speechConfig, audioOutput)
if err != nil {
fmt.Println("Error creating synthesizer:", err)
audioOutput.Close()
speechConfig.Close()
continue
}
<-synthesizer.SpeakTextAsync(translation)
synthesizer.Close()
audioOutput.Close()
speechConfig.Close()
}
}
}
Дополнительные сведения о синтезе речи см. в разделе Основы синтеза речи.
Многоязычный перевод с идентификацией языка
Во многих случаях может быть неизвестно, какие языки ввода требуется указать. С помощью идентификации языка можно обнаружить до 10 возможных языков ввода и автоматически перевести на целевые языки.
В следующем примере предполагается, что следует обнаружить en-US или zh-CN, потому что они определены в AutoDetectSourceLanguageConfig. Затем речь переводится на de и fr, как указано в вызовах функции AddTargetLanguage().
translationConfig.AddTargetLanguage("de")
translationConfig.AddTargetLanguage("fr")
autoDetectSourceLanguageConfig, err := speech.NewAutoDetectSourceLanguageConfigFromLanguages([]string{"en-US", "zh-CN"})
if err != nil {
fmt.Println("Error creating auto detect config:", err)
return
}
defer autoDetectSourceLanguageConfig.Close()
translationRecognizer, err := speech.NewTranslationRecognizerFromAutoDetectSourceLangConfig(translationConfig, autoDetectSourceLanguageConfig, audioConfig)
Полный пример кода см. в разделе "Идентификация языка".
Очистите ресурсы
Для удаления созданного ресурса Speech можно использовать портал Azure или Azure CLI.
Справочный пакет документации | (скачивание) | Дополнительные примеры на GitHub
Availability
Пакет SDK для службы "Speech" на Objective-C поддерживает перевод речи, но руководство по его использованию еще не включено в эту статью. Выберите другой язык программирования, чтобы приступить к работе и ознакомиться с основными понятиями, или обратитесь к справочнику и примерам для языка Objective-C, ссылки на которые приведены в начале этой статьи.
Из этого руководства вы узнаете, как распознать человеческую речь и перевести ее на другой язык.
В разделе с общими сведениями о переводе речи вы сможете получить дополнительную информацию по следующим темам:
- преобразование речи в текст;
- перевод речи на несколько целевых языков;
- Прямой перевод речи в речь
Требования
- Подписка Azure. Вы можете создать бесплатную учетную запись.
- Создайте ресурс Foundry для функции «Речь» на портале Azure.
- Получите ключ ресурса 'Речь' и регион. После развертывания ресурса службы "Речь" выберите Перейти к ресурсу, чтобы просмотреть ключи и управлять ими.
Загрузка и установка
Выполните следующие действия и ознакомьтесь с кратким руководством по интерфейсу командной строки службы распознавания речи для других требований к вашей платформе.
Выполните следующую команду .NET CLI, чтобы установить Speech CLI.
dotnet tool install --global Microsoft.CognitiveServices.Speech.CLIВыполните следующие команды, чтобы настроить ключ вашего ресурса 'Speech' и регион. Замените
SUBSCRIPTION-KEYвашим ключом ресурса для сервиса 'Speech' иREGIONвашим регионом ресурса для сервиса 'Speech'.spx config @key --set SUBSCRIPTION-KEY spx config @region --set REGION
Установка исходного и целевого языков
Эта команда вызывает интерфейс командной строки службы "Речь" для перевода речи с микрофона с итальянского на французский язык:
spx translate --microphone --source it-IT --target fr
Справочный пакет документации | (скачивание) | Дополнительные примеры на GitHub
Availability
Пакет речевой SDK для Swift поддерживает перевод речи, но мы еще не включили здесь руководство по его использованию. Выберите другой язык программирования, чтобы приступить к работе и ознакомиться с основными понятиями, или обратитесь к справочнику и примерам для языка Swift, ссылки на которые приведены в начале этой статьи.