次の方法で共有

如何识别和翻译语音

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

本作指南介绍如何识别人工语音并将其翻译为其他语言。

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

  • 将语音转换为文本
  • 将语音翻译为多个目标语言
  • 执行语音到语音翻译的直接语音

敏感数据和环境变量

本文中的示例源代码取决于用于存储敏感数据的环境变量,例如语音资源的密钥和区域。 该 Program 类包含两 static readonly string 个值,这些值是从主机的环境变量中分配的: SPEECH__SUBSCRIPTION__KEYSPEECH__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;
}

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

重要

请谨慎使用 API 密钥。 请不要直接在代码中包含 API 密钥,并且切勿公开发布该密钥。 如果使用 API 密钥,请将其安全地存储在 Azure Key Vault 中。 若要详细了解如何在应用中安全地使用 API 密钥,请参阅 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 分配给属性来与实例交互:

static async Task TranslateSpeechAsync()
{
    var speechTranslationConfig =
        SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    // Source (input) language
    speechTranslationConfig.SpeechRecognitionLanguage = "it-IT";
}

SpeechRecognitionLanguage 属性需要语言区域设置格式字符串。 请参阅 支持的语音翻译区域设置列表

添加翻译语言

语音翻译的另一个常见任务是指定目标翻译语言。 至少需要一个,但支持多个。 以下代码片段将法语和德语设置为翻译语言目标:

static async Task TranslateSpeechAsync()
{
    var speechTranslationConfig =
        SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    speechTranslationConfig.SpeechRecognitionLanguage = "it-IT";
    
    speechTranslationConfig.AddTargetLanguage("fr");
    speechTranslationConfig.AddTargetLanguage("de");
}

每次调用 AddTargetLanguage时,都会指定新的目标翻译语言。 换句话说,从源语言识别语音时,每个目标翻译都可用作生成的翻译作的一部分。

初始化翻译识别器

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

如果使用设备的默认麦克风识别语音, TranslationRecognizer 则实例应如下所示:

static async Task TranslateSpeechAsync()
{
    var speechTranslationConfig =
        SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    var fromLanguage = "en-US";
    var toLanguages = new List<string> { "it", "fr", "de" };
    speechTranslationConfig.SpeechRecognitionLanguage = fromLanguage;
    toLanguages.ForEach(speechTranslationConfig.AddTargetLanguage);

    using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig);
}

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

首先,按如下所示引用 AudioConfig 对象:

static async Task TranslateSpeechAsync()
{
    var speechTranslationConfig =
        SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    
    var fromLanguage = "en-US";
    var toLanguages = new List<string> { "it", "fr", "de" };
    speechTranslationConfig.SpeechRecognitionLanguage = fromLanguage;
    toLanguages.ForEach(speechTranslationConfig.AddTargetLanguage);

    using var audioConfig = AudioConfig.FromDefaultMicrophoneInput();
    using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig, audioConfig);
}

如果要提供音频文件而不是使用麦克风,则仍需提供参数 audioConfig 。 但是,在创建 AudioConfig 类实例而不是调用 FromDefaultMicrophoneInput时,调用 FromWavFileInput 并传递 filename 参数:

static async Task TranslateSpeechAsync()
{
    var speechTranslationConfig =
        SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    
    var fromLanguage = "en-US";
    var toLanguages = new List<string> { "it", "fr", "de" };
    speechTranslationConfig.SpeechRecognitionLanguage = fromLanguage;
    toLanguages.ForEach(speechTranslationConfig.AddTargetLanguage);

    using var audioConfig = AudioConfig.FromWavFileInput("YourAudioFile.wav");
    using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig, audioConfig);
}

翻译语音

若要翻译语音,语音 SDK 依赖于麦克风或音频文件输入。 语音识别发生在语音翻译之前。 初始化所有对象后,调用识别一次函数并获取结果:

static async Task TranslateSpeechAsync()
{
    var speechTranslationConfig =
        SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    
    var fromLanguage = "en-US";
    var toLanguages = new List<string> { "it", "fr", "de" };
    speechTranslationConfig.SpeechRecognitionLanguage = fromLanguage;
    toLanguages.ForEach(speechTranslationConfig.AddTargetLanguage);

    using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

    Console.Write($"Say something in '{fromLanguage}' and ");
    Console.WriteLine($"we'll translate into '{string.Join("', '", toLanguages)}'.\n");
    
    var result = await translationRecognizer.RecognizeOnceAsync();
    if (result.Reason == ResultReason.TranslatedSpeech)
    {
        Console.WriteLine($"Recognized: \"{result.Text}\":");
        foreach (var element in result.Translations)
        {
            Console.WriteLine($"    TRANSLATED into '{element.Key}': {element.Value}");
        }
    }
}

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

基于事件的翻译

TranslationRecognizer 对象公开事件 Recognizing 。 该事件多次触发,并提供检索中间转换结果的机制。

注释

使用 多语言语音翻译时,中间翻译结果不可用。

以下示例将中间翻译结果输出到控制台:

using (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. 然后,语音将翻译为 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);

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

不使用源语言候选语言的多语言语音翻译

多语言语音翻译实现了一种新的语音翻译技术,可解锁各种功能,包括没有指定的输入语言,以及在同一会话中处理语言切换。 这些功能可实现可实施到产品中的新级别的语音翻译功能。

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

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

指定翻译目标语言。 替换为所选语言。 可以添加更多行。

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

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

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

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

参考文档 | 包 (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 密钥。 请不要直接在代码中包含 API 密钥,并且切勿公开发布该密钥。 如果使用 API 密钥,请将其安全地存储在 Azure Key Vault 中。 若要详细了解如何在应用中安全地使用 API 密钥,请参阅 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;
}

更改源语言

语音翻译的一个常见任务是指定输入(或源)语言。 以下示例演示如何将输入语言更改为意大利语。 在代码中,通过调用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 实例时,对象 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. 然后,语音将翻译为 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 for Go 不支持语音翻译。 请选择另一种编程语言或 Go 参考和本文开头链接的示例。

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

本作指南介绍如何识别人工语音并将其翻译为其他语言。

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

  • 将语音转换为文本
  • 将语音翻译为多个目标语言
  • 执行语音到语音翻译的直接语音

敏感数据和环境变量

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

public class App {

    static final String SPEECH__SUBSCRIPTION__KEY = System.getenv("SPEECH__SUBSCRIPTION__KEY");
    static final String SPEECH__SERVICE__REGION = System.getenv("SPEECH__SERVICE__REGION");

    public static void main(String[] args) { }
}

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

重要

请谨慎使用 API 密钥。 请不要直接在代码中包含 API 密钥,并且切勿公开发布该密钥。 如果使用 API 密钥,请将其安全地存储在 Azure Key Vault 中。 若要详细了解如何在应用中安全地使用 API 密钥,请参阅 API 密钥与 Azure 密钥保管库

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

更改源语言

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

static void translateSpeech() {
    SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
        SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    
    // Source (input) language
    speechTranslationConfig.setSpeechRecognitionLanguage("it-IT");
}

setSpeechRecognitionLanguage 函数需要语言区域设置格式字符串。 请参阅 支持的语音翻译区域设置列表

添加翻译语言

语音翻译的另一个常见任务是指定目标翻译语言。 至少需要一个,但支持多个。 以下代码片段将法语和德语设置为翻译语言目标:

static void translateSpeech() {
    SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
        SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    
    speechTranslationConfig.setSpeechRecognitionLanguage("it-IT");

    // Translate to languages. See https://aka.ms/speech/sttt-languages
    speechTranslationConfig.addTargetLanguage("fr");
    speechTranslationConfig.addTargetLanguage("de");
}

每次调用 addTargetLanguage时,都会指定新的目标翻译语言。 换句话说,从源语言识别语音时,每个目标翻译都可用作生成的翻译作的一部分。

初始化翻译识别器

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

如果使用设备的默认麦克风识别语音,应 TranslationRecognizer 如下所示:

static void translateSpeech() {
    SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
        SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    
    String fromLanguage = "en-US";
    String[] toLanguages = { "it", "fr", "de" };
    speechTranslationConfig.setSpeechRecognitionLanguage(fromLanguage);
    for (String language : toLanguages) {
        speechTranslationConfig.addTargetLanguage(language);
    }

    try (TranslationRecognizer translationRecognizer = new TranslationRecognizer(speechTranslationConfig)) {
    }
}

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

首先,按如下所示引用 AudioConfig 对象:

static void translateSpeech() {
    SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
        SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    
    String fromLanguage = "en-US";
    String[] toLanguages = { "it", "fr", "de" };
    speechTranslationConfig.setSpeechRecognitionLanguage(fromLanguage);
    for (String language : toLanguages) {
        speechTranslationConfig.addTargetLanguage(language);
    }

    AudioConfig audioConfig = AudioConfig.fromDefaultMicrophoneInput();
    try (TranslationRecognizer translationRecognizer = new TranslationRecognizer(speechTranslationConfig, audioConfig)) {
        
    }
}

如果要提供音频文件而不是使用麦克风,则仍需提供参数 audioConfig 。 但是,在创建 AudioConfig 类实例而不是调用 fromDefaultMicrophoneInput时,调用 fromWavFileInput 并传递 filename 参数:

static void translateSpeech() {
    SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
        SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    
    String fromLanguage = "en-US";
    String[] toLanguages = { "it", "fr", "de" };
    speechTranslationConfig.setSpeechRecognitionLanguage(fromLanguage);
    for (String language : toLanguages) {
        speechTranslationConfig.addTargetLanguage(language);
    }

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

翻译语音

若要翻译语音,语音 SDK 依赖于麦克风或音频文件输入。 语音识别发生在语音翻译之前。 初始化所有对象后,调用识别一次函数并获取结果:

static void translateSpeech() throws ExecutionException, InterruptedException {
    SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
        SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    
    String fromLanguage = "en-US";
    String[] toLanguages = { "it", "fr", "de" };
    speechTranslationConfig.setSpeechRecognitionLanguage(fromLanguage);
    for (String language : toLanguages) {
        speechTranslationConfig.addTargetLanguage(language);
    }

    try (TranslationRecognizer translationRecognizer = new TranslationRecognizer(speechTranslationConfig)) {
        System.out.printf("Say something in '%s' and we'll translate...", fromLanguage);

        TranslationRecognitionResult translationRecognitionResult = translationRecognizer.recognizeOnceAsync().get();
        if (translationRecognitionResult.getReason() == ResultReason.TranslatedSpeech) {
            System.out.printf("Recognized: \"%s\"\n", translationRecognitionResult.getText());
            for (Map.Entry<String, String> pair : translationRecognitionResult.getTranslations().entrySet()) {
                System.out.printf("Translated into '%s': %s\n", pair.getKey(), pair.getValue());
            }
        }
    }
}

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

合成翻译

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

翻译语音

适用于 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 密钥。 请不要直接在代码中包含 API 密钥,并且切勿公开发布该密钥。 如果使用 API 密钥,请将其安全地存储在 Azure Key Vault 中。 若要详细了解如何在应用中安全地使用 API 密钥,请参阅 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实例并在初始化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 。 但是,创建类实例时,而不是使用 /> 调用并提供参数:

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

后续步骤