你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

如何识别和翻译语音

参考文档 | 包 (NuGet) | GitHub 上的其他示例

本操作指南将介绍如何识别人类语音并将其翻译为另一种语言。

有关以下内容的详细信息,请参阅语音翻译概述

  • 将语音翻译为文本
  • 将语音翻译为多种目标语言
  • 直接进行语音转语音翻译

敏感数据和环境变量

本文中的示例源代码依赖于用于存储敏感数据的环境变量,如语音资源的密钥和区域。 Program 类包含从主机环境变量(SPEECH__SUBSCRIPTION__KEYSPEECH__SERVICE__REGION)分配的两个 static readonly string 值。 这两个字段都在类范围内,因此可以在类的方法主体中访问它们:

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

有关环境变量的详细信息,请参阅环境变量和应用程序配置

重要

如果使用 API 密钥,请将其安全地存储在某个其他位置,例如 Azure Key Vault 中。 请不要直接在代码中包含 API 密钥,并且切勿公开发布该密钥。

有关 Azure AI 服务安全性的详细信息,请参阅对 Azure AI 服务的请求进行身份验证

创建语音翻译配置

若要使用语音 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 属性,与 SpeechTranslationConfig 实例进行交互:

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 类实例并在初始化 TranslationRecognizer 时提供 audioConfig 参数。

首先,引用 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 类实例时,需要调用 FromWavFileInput(而不是调用 FromDefaultMicrophoneInput)并传递 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 (var audioInput = AudioConfig.FromWavFileInput(@"whatstheweatherlike.wav"))
{
    using (var translationRecognizer = new TranslationRecognizer(config, 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.");
            }
        };

        // Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
        Console.WriteLine("Start translation...");
        await translationRecognizer.StartContinuousRecognitionAsync().ConfigureAwait(false);

        // Waits for completion.
        // Use Task.WaitAny to keep the task rooted.
        Task.WaitAny(new[] { stopTranslation.Task });

        // Stops translation.
        await translationRecognizer.StopContinuousRecognitionAsync().ConfigureAwait(false);
    }
}

合成翻译

成功进行语音识别和翻译后,结果会包含字典中的所有翻译。 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__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 种可能的输入语言,并自动将其翻译成目标语言。

以下示例预期检测到 en-USzh-CN,因为它们是在 AutoDetectSourceLanguageConfig 中定义的。 然后,语音将被转换为 defr,如对 AddTargetLanguage() 的调用中指定的那样。

speechTranslationConfig.AddTargetLanguage("de");
speechTranslationConfig.AddTargetLanguage("fr");
var autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig.FromLanguages(new string[] { "en-US", "zh-CN" });
var translationRecognizer = new TranslationRecognizer(speechTranslationConfig, autoDetectSourceLanguageConfig, audioConfig);

有关完整的代码示例,请参阅语言识别

无源语言候选项的多语言语音翻译

多语言语音翻译实现了一种新的语音翻译技术,可以解锁各种功能,包括没有指定的输入语言、在同一会话中处理语言切换。 这些功能提升了语音翻译的技术水平,你可在产品中加以应用。

当前在语音翻译中使用语言 ID 时,必须从 v2 终结点创建SpeechTranslationConfig对象。 将字符串“YourServiceRegion”替换为语音资源区域(例如,“westus”)。 将“YourSubscriptionKey”替换为语音资源密钥。

var v2EndpointInString = String.Format("wss://{0}.stt.speech.microsoft.com/speech/universal/v2", "YourServiceRegion");
var v2EndpointUrl = new Uri(v2EndpointInString);
var speechTranslationConfig = SpeechTranslationConfig.FromEndpoint(v2EndpointUrl, "YourSubscriptionKey");

指定翻译目标语言。 替换为所选语言。 可以新增行。

config.AddTargetLanguage("de");
config.AddTargetLanguage("fr");

使用多语言语音翻译的主要区别在于,无需指定源语言。 这是因为服务会自动检测源语言。 使用fromOpenRange方法创建AutoDetectSourceLanguageConfig对象,让服务知道你要使用无指定源语言的多语言语音翻译。

AutoDetectSourceLanguageConfig autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig.fromOpenRange(); 
var translationRecognizer = new TranslationRecognizer(speechTranslationConfig, autoDetectSourceLanguageConfig, audioConfig);

有关语音 SDK 的完整代码示例,请参阅GitHub 上的语音翻译示例

在语音翻译中使用自定义翻译

语音翻译中的自定义翻译功能与 Azure 自定义翻译服务无缝集成,使你能够实现更准确且定制的翻译。 由于集成直接利用 Azure 自定义翻译服务的功能,因此你需要使用多服务资源以确保完整功能集的正确运行。 有关详细说明,请参阅有关为 Azure AI 服务创建多服务资源的指南。

此外,若要对自定义翻译器进行脱机训练并获取“类别 ID”,请参阅快速入门:生成、部署和使用自定义模型 - 自定义翻译器中提供的分步脚本。

// 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"

try (SpeechTranslationConfig config = SpeechTranslationConfig.fromEndpoint(URI.create(endpointUrl), speechSubscriptionKey)) {

            // Sets source and target language(s).
           ….

            // Set the category id
            config.setCustomModelCategoryId("yourCategoryId");

       ….
}

参考文档 | 包 (NuGet) | GitHub 上的其他示例

本操作指南将介绍如何识别人类语音并将其翻译为另一种语言。

有关以下内容的详细信息,请参阅语音翻译概述

  • 将语音翻译为文本
  • 将语音翻译为多种目标语言
  • 直接进行语音转语音翻译

敏感数据和环境变量

本文中的示例源代码依赖于用于存储敏感数据的环境变量,如语音资源的密钥和区域。 C++ 代码文件包含从主机环境变量(SPEECH__SUBSCRIPTION__KEYSPEECH__SERVICE__REGION)分配的两个字符串值。 这两个字段都在类范围内,因此可以在类的方法主体中访问它们:

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

有关环境变量的详细信息,请参阅环境变量和应用程序配置

重要

如果使用 API 密钥,请将其安全地存储在某个其他位置,例如 Azure Key Vault 中。 请不要直接在代码中包含 API 密钥,并且切勿公开发布该密钥。

有关 Azure AI 服务安全性的详细信息,请参阅对 Azure AI 服务的请求进行身份验证

创建语音翻译配置

若要使用语音 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;
}

更改源语言

语音翻译的一项常见任务是指定输入(或源)语言。 以下示例演示如何将输入语言更改为意大利语。 在代码中,通过调用 SetSpeechRecognitionLanguage 方法与 SpeechTranslationConfig 实例交互。

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 类实例并在初始化 TranslationRecognizer 时提供 audioConfig 参数。

首先,引用 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 类实例时,需要调用 FromWavFileInput(而不是调用 FromDefaultMicrophoneInput)并传递 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 实例时,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(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 种可能的输入语言,并自动将其翻译成目标语言。

以下示例预期检测到 en-USzh-CN,因为它们是在 AutoDetectSourceLanguageConfig 中定义的。 然后,语音将被转换为 defr,如对 AddTargetLanguage() 的调用中指定的那样。

speechTranslationConfig->AddTargetLanguage("de");
speechTranslationConfig->AddTargetLanguage("fr");
auto autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig::FromLanguages({ "en-US", "zh-CN" });
auto translationRecognizer = TranslationRecognizer::FromConfig(speechTranslationConfig, autoDetectSourceLanguageConfig, audioConfig);

有关完整的代码示例,请参阅语言识别

参考文档 | 包 (Go) | GitHub 上的其他示例

适用于 Go 的语音 SDK 不支持语音翻译。 请选择其他编程语言,或从本文开头链接的 Go 引用和示例。

参考文档 | GitHub 上的其他示例

本操作指南将介绍如何识别人类语音并将其翻译为另一种语言。

有关以下内容的详细信息,请参阅语音翻译概述

  • 将语音翻译为文本
  • 将语音翻译为多种目标语言
  • 直接进行语音转语音翻译

敏感数据和环境变量

本文中的示例源代码依赖于用于存储敏感数据的环境变量,如语音资源的密钥和区域。 Java 代码文件包含从主机环境变量(SPEECH__SUBSCRIPTION__KEYSPEECH__SERVICE__REGION)分配的两个 static final String 值。 这两个字段都在类范围内,因此可以在类的方法主体中访问它们:

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 密钥,请将其安全地存储在某个其他位置,例如 Azure Key Vault 中。 请不要直接在代码中包含 API 密钥,并且切勿公开发布该密钥。

有关 Azure AI 服务安全性的详细信息,请参阅对 Azure AI 服务的请求进行身份验证

创建语音翻译配置

若要使用语音 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);
    }
}

更改源语言

语音翻译的一项常见任务是指定输入(或源)语言。 以下示例演示如何将输入语言更改为意大利语。 在代码中,通过调用 setSpeechRecognitionLanguage 方法与 SpeechTranslationConfig 实例交互:

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 类实例并在初始化 TranslationRecognizer 时提供 audioConfig 参数。

首先,引用 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 类实例时,需要调用 fromWavFileInput(而不是调用 fromDefaultMicrophoneInput)并传递 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());
            }
        }
    }
}

有关语音转文本的详细信息,请参阅语音识别基础知识

合成翻译

成功进行语音识别和翻译后,结果会包含字典中的所有翻译。 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();
                }
            }
        }
    }
}

有关语音合成的详细信息,请参阅语音合成基础知识

参考文档 | 包 (npm) | GitHub 上的其他示例 | 库源代码

本操作指南将介绍如何识别人类语音并将其翻译为另一种语言。

有关以下内容的详细信息,请参阅语音翻译概述

  • 将语音翻译为文本
  • 将语音翻译为多种目标语言
  • 直接进行语音转语音翻译

创建翻译配置

若要使用语音 SDK 调用翻译服务,需要创建 SpeechTranslationConfig 实例。 此类包含有关你的订阅的信息,例如你的密钥和关联的区域、终结点、主机或授权令牌。

注意

无论你是要执行语音识别、语音合成、翻译,还是意向识别,都需要创建一个配置。

可以通过以下几种方式初始化 SpeechTranslationConfig

  • 使用订阅:传入密钥和关联的区域。
  • 使用终结点:传入语音服务终结点。 密钥或授权令牌是可选的。
  • 使用主机:传入主机地址。 密钥或授权令牌是可选的。
  • 使用授权令牌:传入授权令牌和关联的区域。

让我们看看如何使用密钥和区域创建 SpeechTranslationConfig 实例。 在 Azure 门户中获取语音资源密钥和区域。

const speechTranslationConfig = SpeechTranslationConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");

初始化翻译工具

创建 SpeechTranslationConfig 实例后,下一步是初始化 TranslationRecognizer。 初始化 TranslationRecognizer 时,需要向其传递 speechTranslationConfig 实例。 配置对象会提供验证你的请求时翻译服务所需的凭据。

如果使用设备的默认麦克风翻译提供的语音,则 TranslationRecognizer 应如下所示:

const translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

如果要指定音频输入设备,则需要创建一个 AudioConfig 类实例并在初始化 TranslationRecognizer 时提供 audioConfig 参数。

引用 AudioConfig 对象,如下所示:

const audioConfig = AudioConfig.fromDefaultMicrophoneInput();
const translationRecognizer = new TranslationRecognizer(speechTranslationConfig, audioConfig);

如果要提供音频文件而不是使用麦克风,则仍需要提供 audioConfig 参数。 但是,仅当以 Node.js 为目标时,才能执行此操作。 在创建 AudioConfig 类实例时,需要调用 fromWavFileOutput(而不是调用 fromDefaultMicrophoneInput)并传递 filename 参数:

const audioConfig = AudioConfig.fromWavFileInput("YourAudioFile.wav");
const translationRecognizer = new TranslationRecognizer(speechTranslationConfig, audioConfig);

翻译语音

JavaScript 的语音 SDK 的 TranslationRecognizer 类公开了可用于语音翻译的方法:

  • 单步翻译(异步): 在非阻塞(异步)模式下执行翻译。 它翻译单个语句。 它会通过在结束时倾听静音或处理最长 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();
});

你的代码还可以处理翻译过程中提供的更新。 可以使用这些更新来提供有关翻译进度的可视反馈。 此 JavaScript Node.js 示例演示了这些类型的更新。 下面的代码还显示了翻译过程中产生的详细信息:

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

连续翻译

连续翻译涉及的方面比单步识别多一点。 它要求你订阅 recognizingrecognizedcanceled 事件以获取识别结果。 若要停止翻译,必须调用 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 上的其他示例

适用于 Objective-C 的语音 SDK 确实支持语音翻译,但我们尚未在此处提供相关指南。 请选择其他编程语言开始了解相关概念,或参阅本文开头链接的 Objective-C 引用和示例。

参考文档 | 包(下载) | GitHub 上的其他示例

适用于 Swift 的语音 SDK 确实支持语音翻译,但我们尚未在此处提供相关指南。 请选择其他编程语言开始了解相关概念,或参阅本文开头链接的 Swift 引用和示例。

参考文档 | 包 (PyPi) | GitHub 上的其他示例

本操作指南将介绍如何识别人类语音并将其翻译为另一种语言。

有关以下内容的详细信息,请参阅语音翻译概述

  • 将语音翻译为文本
  • 将语音翻译为多种目标语言
  • 直接进行语音转语音翻译

敏感数据和环境变量

本文中的示例源代码依赖环境变量来存储敏感数据,如语音资源的订阅密钥和区域。 Python 代码文件包含从主机环境变量(SPEECH__SUBSCRIPTION__KEYSPEECH__SERVICE__REGION)分配的两个值。 这两个变量都位于全局范围内,因此可以在代码文件的函数定义内访问它们:

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

有关环境变量的详细信息,请参阅环境变量和应用程序配置

重要

如果使用 API 密钥,请将其安全地存储在某个其他位置,例如 Azure Key Vault 中。 请不要直接在代码中包含 API 密钥,并且切勿公开发布该密钥。

有关 Azure AI 服务安全性的详细信息,请参阅对 Azure AI 服务的请求进行身份验证

创建语音翻译配置

若要使用语音 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 类实例并在初始化 TranslationRecognizer 时提供 audio_config 参数。

首先,引用 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 类实例时,需要使用 filename="path-to-file.wav" 进行调用(而不是使用 use_default_microphone=True 进行调用),并提供 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()

有关语音转文本的详细信息,请参阅语音识别基础知识

合成翻译

成功进行语音识别和翻译后,结果会包含字典中的所有翻译。 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 种可能的输入语言,并自动将其翻译成目标语言。

有关完整的代码示例,请参阅语言识别

语音转文本 REST API 参考 | 适用于短音频的语音转文本 REST API 参考 | GitHub 上的其他示例

你可以使用 REST API 进行语音翻译,但我们尚未在此处提供相关指南。 请选择其他编程语言以开始学习并了解相关概念。

本操作指南将介绍如何识别人类语音并将其翻译为另一种语言。

有关以下内容的详细信息,请参阅语音翻译概述

  • 将语音翻译为文本
  • 将语音翻译为多种目标语言
  • 直接进行语音转语音翻译

先决条件

下载和安装

请按照以下步骤操作,并参阅语音 CLI 快速入门,了解适用于你的平台的其他要求。

  1. 运行以下 .NET CLI 命令以安装语音 CLI:

    dotnet tool install --global Microsoft.CognitiveServices.Speech.CLI
    
  2. 运行以下命令以配置你的语音资源密钥和区域。 将 SUBSCRIPTION-KEY 替换为语音资源密钥,将 REGION 替换为语音资源区域。

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

设置源语言和目标语言

此命令会调用语音 CLI,将麦克风中的语音从意大利语翻译成法语:

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

后续步骤