Распознавание и перевод речи

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

Из этого руководства вы узнаете, как распознать человеческую речь и перевести ее на другой язык.

В разделе с общими сведениями о переводе речи вы сможете получить дополнительную информацию по следующим темам:

  • преобразование речи в текст;
  • перевод речи на несколько целевых языков;
  • Выполнение прямого преобразования речи в речь

Конфиденциальные данные и переменные среды

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

    static Task Main() => Task.CompletedTask;
}

Дополнительные сведения о переменных среды см. в разделе Переменные среды и конфигурация приложения.

Создание конфигурации перевода речи

Чтобы вызвать службу "Речь" с помощью пакета 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));

    static Task Main() => TranslateSpeechAsync();

    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}");
        }
    }
}

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

Синтезирование переводов

После успешного распознавания речи и перевода словарь будет содержать все переводы. Ключом словаря 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 в качестве значения свойства SpeechSynthesisVoiceName объекта SpeechConfig необходимо указать желаемый голос.

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

static async Task TranslateSpeechAsync()
{
    var speechTranslationConfig =
        SpeechTranslationConfig.FromSubscription(SPEECH__SERVICE__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__SERVICE__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 возможных языков ввода и автоматически перевести на целевые языки.

В следующем примере предполагается, что или zh-CN следует обнаружить, en-US так как они определены в 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)

Полный пример кода см. в разделе "Идентификация языка".

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

Из этого руководства вы узнаете, как распознать человеческую речь и перевести ее на другой язык.

В разделе с общими сведениями о переводе речи вы сможете получить дополнительную информацию по следующим темам:

  • преобразование речи в текст;
  • перевод речи на несколько целевых языков;
  • Выполнение прямого преобразования речи в речь

Конфиденциальные данные и переменные среды

Пример исходного кода в этой статье зависит от переменных среды для хранения конфиденциальных данных, таких как ключ и регион ресурса "Речь". Файл кода на языке C++ содержит два значения, которые назначаются из переменных среды компьютера узла: SPEECH__SUBSCRIPTION__KEY и SPEECH__SERVICE__REGION. Оба эти поля находятся в области класса, что делает их доступными в телах методов класса:

auto SPEECH__SUBSCRIPTION__KEY = getenv("SPEECH__SUBSCRIPTION__KEY");
auto SPEECH__SERVICE__REGION = getenv("SPEECH__SERVICE__REGION");

Дополнительные сведения о переменных среды см. в разделе Переменные среды и конфигурация приложения.

Создание конфигурации перевода речи

Чтобы вызвать службу "Речь" с помощью пакета 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(translationConfig);
}

Если вы хотите указать входное аудиоустройство, необходимо создать экземпляр класса 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(translationConfig, 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(translationConfig, 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(translationConfig);
    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 является целевой язык перевода, а значением — переведенный текст. Распознанная речь может быть переведена, а затем синтезирована на другом языке (преобразование речи в речь).

Синтез на основе событий

Объект 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(translationConfig);
    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 в качестве значения свойства SetSpeechSynthesisVoiceName объекта SpeechConfig необходимо указать желаемый голос.

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

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(translationConfig);

    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 возможных языков ввода и автоматически перевести на целевые языки.

В следующем примере предполагается, что или zh-CN следует обнаружить, en-US так как они определены в 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

Пакет SDK службы "Речь" для Go не поддерживает перевод речи. Выберите другой язык программирования или обратитесь к справочнику и примерам для языка Go, ссылки на которые приведены в начале этой статьи.

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

Из этого руководства вы узнаете, как распознать человеческую речь и перевести ее на другой язык.

В разделе с общими сведениями о переводе речи вы сможете получить дополнительную информацию по следующим темам:

  • преобразование речи в текст;
  • перевод речи на несколько целевых языков;
  • Выполнение прямого преобразования речи в речь

Конфиденциальные данные и переменные среды

Пример исходного кода в этой статье зависит от переменных среды для хранения конфиденциальных данных, таких как ключ и регион ресурса "Речь". Файл кода на языке 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) { }
}

Дополнительные сведения о переменных среды см. в разделе Переменные среды и конфигурация приложения.

Создание конфигурации перевода речи

Чтобы вызвать службу "Речь" с помощью пакета 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 result = translationRecognizer.recognizeOnceAsync().get();
        if (result.getReason() == ResultReason.TranslatedSpeech) {
            System.out.printf("Recognized: \"%s\"\n", result.getText());
            for (Map.Entry<String, String> pair : result.getTranslations().entrySet()) {
                System.out.printf("Translated into '%s': %s\n", pair.getKey(), pair.getValue());
            }
        }
    }
}

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

Синтезирование переводов

После успешного распознавания речи и перевода словарь будет содержать все переводы. Функция 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 result = translationRecognizer.recognizeOnceAsync().get();
        if (result.getReason() == ResultReason.TranslatedSpeech) {
            System.out.printf("Recognized: \"%s\"\n", result.getText());
            for (Map.Entry<String, String> pair : result.getTranslations().entrySet()) {
                String language = pair.getKey();
                String translation = pair.getValue();
                System.out.printf("Translated into '%s': %s\n", language, translation);
            }
        }
    }
}

Синтез вручную

Функция getTranslations возвращает словарь, который можно использовать для синтезирования звука из текста перевода. Пройдите все переводы по очереди и синтезируйте переведенную речь. При создании экземпляра SpeechSynthesizer в качестве значения свойства setSpeechSynthesisVoiceName объекта SpeechConfig необходимо указать желаемый голос.

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

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 result = translationRecognizer.recognizeOnceAsync().get();
        if (result.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", result.getText());
            for (Map.Entry<String, String> pair : result.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();
                }
            }
        }
    }
}

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

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

Из этого руководства вы узнаете, как распознать человеческую речь и перевести ее на другой язык.

В разделе с общими сведениями о переводе речи вы сможете получить дополнительную информацию по следующим темам:

  • преобразование речи в текст;
  • перевод речи на несколько целевых языков;
  • Выполнение прямого преобразования речи в речь

Создание конфигурации перевода

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

Примечание.

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

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

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

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

const speechTranslationConfig = SpeechTranslationConfig.fromSubscription("YourSubscriptionKey", "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
};

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

Пакет SDK службы "Речь" для Objective-C поддерживает перевод речи, но мы еще не включили в эту статью руководство по использованию этого пакета SDK. Выберите другой язык программирования, чтобы приступить к работе и ознакомиться с основными понятиями, или обратитесь к справочнику и примерам для языка Objective-C, ссылки на которые приведены в начале этой статьи.

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

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

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

Из этого руководства вы узнаете, как распознать человеческую речь и перевести ее на другой язык.

В разделе с общими сведениями о переводе речи вы сможете получить дополнительную информацию по следующим темам:

  • преобразование речи в текст;
  • перевод речи на несколько целевых языков;
  • Выполнение прямого преобразования речи в речь

Конфиденциальные данные и переменные среды

Пример исходного кода в этой статье зависит от переменных среды для хранения конфиденциальных данных, таких как ключ и регион подписки для ресурса службы "Речь". Файл кода на языке Python содержит два значения, которые назначаются из переменных среды компьютера узла: SPEECH__SUBSCRIPTION__KEY и SPEECH__SERVICE__REGION. Обе эти переменные находятся в глобальной области видимости, что делает их доступными в определении функции в файле кода:

speech_key, service_region = os.environ['SPEECH__SUBSCRIPTION__KEY'], os.environ['SPEECH__SERVICE__REGION']

Дополнительные сведения о переменных среды см. в разделе Переменные среды и конфигурация приложения.

Создание конфигурации перевода речи

Чтобы вызвать службу "Речь" с помощью пакета 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...')
    result = translation_recognizer.recognize_once()
    print(get_result_text(reason=result.reason, result=result))

def get_result_text(reason, result):
    reason_format = {
        speechsdk.ResultReason.TranslatedSpeech:
            f'RECOGNIZED "{from_language}": {result.text}\n' +
            f'TRANSLATED into "{to_language}"": {result.translations[to_language]}',
        speechsdk.ResultReason.RecognizedSpeech: f'Recognized: "{result.text}"',
        speechsdk.ResultReason.NoMatch: f'No speech could be recognized: {result.no_match_details}',
        speechsdk.ResultReason.Canceled: f'Speech Recognition canceled: {result.cancellation_details}'
    }
    return reason_format.get(reason, 'Unable to recognize speech')

translate_speech_to_text()

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

Синтезирование переводов

После успешного распознавания речи и перевода словарь будет содержать все переводы. Ключом словаря 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}".')

    result = translation_recognizer.recognize_once()
    print(get_result_text(reason=result.reason, result=result))

def get_result_text(reason, result):
    reason_format = {
        speechsdk.ResultReason.TranslatedSpeech:
            f'Recognized "{from_language}": {result.text}\n' +
            f'Translated into "{to_language}"": {result.translations[to_language]}',
        speechsdk.ResultReason.RecognizedSpeech: f'Recognized: "{result.text}"',
        speechsdk.ResultReason.NoMatch: f'No speech could be recognized: {result.no_match_details}',
        speechsdk.ResultReason.Canceled: f'Speech Recognition canceled: {result.cancellation_details}'
    }
    return reason_format.get(reason, 'Unable to recognize speech')

translate_speech_to_text()

Синтез вручную

Для синтезирования звука из текста перевода можно использовать словарь translations. Пройдите все переводы по очереди и синтезируйте переведенную речь. При создании экземпляра SpeechSynthesizer в качестве значения свойства speech_synthesis_voice_name объекта SpeechConfig необходимо указать желаемый голос.

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

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...')
    result = translation_recognizer.recognize_once()
    synthesize_translations(result=result)

def synthesize_translations(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: "{result.text}"')

    for language in result.translations:
        translation = 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 возможных языков ввода и автоматически перевести на целевые языки.

Полный пример кода см. в разделе "Идентификация языка".

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

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

Из этого руководства вы узнаете, как распознать человеческую речь и перевести ее на другой язык.

В разделе с общими сведениями о переводе речи вы сможете получить дополнительную информацию по следующим темам:

  • преобразование речи в текст;
  • перевод речи на несколько целевых языков;
  • Выполнение прямого преобразования речи в речь

Необходимые компоненты

Загрузка и установка

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

  1. Выполните следующую команду .NET CLI, чтобы установить интерфейс командной строки службы "Речь".

    dotnet tool install --global Microsoft.CognitiveServices.Speech.CLI
    
  2. Выполните следующие команды, чтобы настроить ключ ресурса службы "Речь" и регион. Замените ключом ресурса "Речь" и замените SUBSCRIPTION-KEYREGION регионом ресурсов службы "Речь".

    spx config @key --set SUBSCRIPTION-KEY
    spx config @region --set REGION
    

Установка исходного и целевого языков

Эта команда вызывает интерфейс командной строки службы "Речь" для перевода речи с микрофона с итальянского на французский язык:

spx translate --microphone --source it-IT --target fr

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