如何辨識和翻譯語音

參考文件 | 套件 (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;
}

如需環境變數的詳細資訊,請參閱 環境變數和應用程式組態

建立語音翻譯組態

若要使用語音 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類別實例,並在初始化 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 類別實例,而不是呼叫 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}");
        }
    }
}

如需語音轉換文字的詳細資訊,請參閱語音辨識的基本概念

事件型轉譯

物件 TranslationRecognizerRecognizing 公開事件。 事件會引發數次,並提供擷取中繼轉譯結果的機制。

下列範例會將中繼轉譯結果列印至主控台:

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 索引鍵是目標翻譯語言,而值是翻譯的文字。 辨識的語音可以翻譯,然後以不同的語言合成(語音轉換語音)。

以事件為基礎的合成

物件 TranslationRecognizerSynthesizing 公開事件。 事件會引發數次,並提供從翻譯辨識結果擷取合成音訊的機制。 如果您要翻譯為多種語言,請參閱 手動合成

藉由指派 實例來指定 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);

如需完整的程式碼範例,請參閱語言識別

沒有源語言候選的多語言語音翻譯

多語言語音翻譯會實作新的語音翻譯技術層級,以解除鎖定各種功能,包括沒有指定的輸入語言,以及在相同會話內處理語言切換。 這些功能可啟用可實作至產品的新語音翻譯功能層級。

目前當您使用語言識別碼搭配語音翻譯時,您必須從 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");

具有多語種語音翻譯的主要區別在於您不需要指定來源語言。 這是因為服務會自動偵測來源語言。 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");

如需環境變數的詳細資訊,請參閱 環境變數和應用程式組態

建立語音翻譯組態

若要使用語音 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類別實例,並在初始化 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 類別實例,而不是呼叫 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 索引鍵是目標翻譯語言,而值是翻譯的文字。 辨識的語音可以翻譯,然後以不同的語言合成(語音轉換語音)。

以事件為基礎的合成

物件 TranslationRecognizerSynthesizing 公開事件。 事件會引發數次,並提供從翻譯辨識結果擷取合成音訊的機制。 如果您要翻譯為多種語言,請參閱 手動合成

藉由指派 實例來指定 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 程式代碼檔案包含兩 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) { }
}

如需環境變數的詳細資訊,請參閱 環境變數和應用程式組態

建立語音翻譯組態

若要使用語音 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類別實例,並在初始化 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 類別實例,而不是呼叫 fromDefaultMicrophoneInput時,會呼叫 fromWavFileInput 並傳遞 filename 參數:

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

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

翻譯語音

為了翻譯語音,語音 SDK 會依賴麥克風或音訊檔案輸入。 語音翻譯之前會進行語音辨識。 初始化所有物件之後,呼叫辨識一次函式並取得結果:

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

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

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

如需語音轉換文字的詳細資訊,請參閱語音辨識的基本概念

合成翻譯

成功進行語音辨識和翻譯之後,結果就會在字典中包含所有翻譯。 函式會 getTranslations 傳回索引鍵做為目標翻譯語言的字典,並以翻譯文字的形式傳回值。 辨識的語音可以翻譯,然後以不同的語言合成(語音轉換語音)。

以事件為基礎的合成

物件 TranslationRecognizersynthesizing 公開事件。 事件會引發數次,並提供從翻譯辨識結果擷取合成音訊的機制。 如果您要翻譯為多種語言,請參閱 手動合成

藉由指派 實例來指定 setVoiceName 合成語音,併為事件提供事件處理程式 synthesizing 以取得音訊。 下列範例會將翻譯的音訊儲存為.wav檔案。

重要

事件型合成只適用於單一翻譯。 請勿 新增多個目標翻譯語言。 此外, setVoiceName 此值應該與目標翻譯語言相同。 例如, "de" 可以對應至 "de-DE-Hedda"

static void translateSpeech() throws ExecutionException, FileNotFoundException, InterruptedException, IOException {
    SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
        SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    String fromLanguage = "en-US";
    String toLanguage = "de";
    speechTranslationConfig.setSpeechRecognitionLanguage(fromLanguage);
    speechTranslationConfig.addTargetLanguage(toLanguage);

    // See: https://aka.ms/speech/sdkregion#standard-and-neural-voices
    speechTranslationConfig.setVoiceName("de-DE-Hedda");

    try (TranslationRecognizer translationRecognizer = new TranslationRecognizer(speechTranslationConfig)) {
        translationRecognizer.synthesizing.addEventListener((s, e) -> {
            byte[] audio = e.getResult().getAudio();
            int size = audio.length;
            System.out.println("Audio synthesized: " + size + " byte(s)" + (size == 0 ? "(COMPLETE)" : ""));

            if (size > 0) {
                try (FileOutputStream file = new FileOutputStream("translation.wav")) {
                    file.write(audio);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });

        System.out.printf("Say something in '%s' and we'll translate...", fromLanguage);

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

手動合成

getTranslations 式會傳回字典,您可以用來從翻譯文字合成音訊。 逐一查看每個翻譯並合成它。 當您建立 SpeechSynthesizer 實例時, 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 result = translationRecognizer.recognizeOnceAsync().get();
        if (result.getReason() == ResultReason.TranslatedSpeech) {
            // See: https://aka.ms/speech/sdkregion#standard-and-neural-voices
            Map<String, String> languageToVoiceMap = new HashMap<String, String>();
            languageToVoiceMap.put("de", "de-DE-KatjaNeural");
            languageToVoiceMap.put("en", "en-US-AriaNeural");
            languageToVoiceMap.put("it", "it-IT-ElsaNeural");
            languageToVoiceMap.put("pt", "pt-BR-FranciscaNeural");
            languageToVoiceMap.put("zh-Hans", "zh-CN-XiaoxiaoNeural");

            System.out.printf("Recognized: \"%s\"\n", result.getText());
            for (Map.Entry<String, String> pair : result.getTranslations().entrySet()) {
                String language = pair.getKey();
                String translation = pair.getValue();
                System.out.printf("Translated into '%s': %s\n", language, translation);

                SpeechConfig speechConfig =
                    SpeechConfig.fromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
                speechConfig.setSpeechSynthesisVoiceName(languageToVoiceMap.get(language));

                AudioConfig audioConfig = AudioConfig.fromWavFileOutput(language + "-translation.wav");
                try (SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(speechConfig, audioConfig)) {
                    speechSynthesizer.SpeakTextAsync(translation).get();
                }
            }
        }
    }
}

如需語音合成的詳細資訊,請參閱 語音合成的基本概念。

參考文件 | 套件 (npm) | GitHub 上的其他範例 | 程式庫原始程式碼

在本操作指南中,您將瞭解如何辨識人類語音,並將其翻譯成另一種語言。

如需詳細資訊,請參閱語音翻譯 概觀

  • 將語音轉譯為文字
  • 將語音翻譯成多個目標語言
  • 執行直接語音轉換語音翻譯

建立翻譯組態

若要使用語音 SDK 呼叫翻譯服務,您必須建立 SpeechTranslationConfig 實例。 此類別包含訂用帳戶的相關信息,例如密鑰和相關聯的區域、端點、主機或授權令牌。

注意

無論您執行語音辨識、語音合成、翻譯或意圖辨識,您一律都會建立設定。

您可以透過幾種方式初始化 SpeechTranslationConfig

  • 使用訂用帳戶:傳入密鑰和相關聯的區域。
  • 使用端點:傳入語音服務端點。 金鑰或授權令牌是選擇性的。
  • 使用主機:傳入主機位址。 金鑰或授權令牌是選擇性的。
  • 使用授權令牌:傳入授權令牌和相關聯的區域。

讓我們看看如何使用索引鍵和區域建立 SpeechTranslationConfig 實例。 取得 Azure 入口網站 中的語音資源金鑰和區域。

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

初始化翻譯工具

建立 SpeechTranslationConfig 實體之後,下一個步驟是初始化 TranslationRecognizer。 當您初始化 TranslationRecognizer時,您必須傳遞實例 speechTranslationConfig 。 組態物件會提供翻譯服務驗證要求所需的認證。

如果您要翻譯透過裝置的預設麥克風提供的語音,以下是 TranslationRecognizer 看起來應該的樣子:

const translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

如果您想要指定音訊輸入裝置,則需要建立AudioConfig類別實例,並在初始化 TranslationRecognizer時提供 audioConfig 參數。

AudioConfig參考物件,如下所示:

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

如果您想要提供音訊檔案,而不是使用麥克風,您仍然需要提供 audioConfig 參數。 不過,只有在以Node.js為目標時,您才能執行此動作。 當您建立AudioConfig類別實例,而不是呼叫 時,會呼叫 fromDefaultMicrophoneInputfromWavFileOutput 並傳遞 filename 參數:

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

翻譯語音

適用於 JavaScript 的 Speech SDK TranslationRecognizer 類別會公開可用於語音翻譯的方法:

  • 單次翻譯(async):以非封鎖(異步)模式執行翻譯。 它會轉譯單一語句。 它會藉由在結尾接聽無聲,或直到處理最多 15 秒的音訊,來判斷單一語句的結尾。
  • 連續轉譯 (async):以異步方式起始連續轉譯作業。 用戶註冊事件並處理各種應用程式狀態。 若要停止異步連續轉譯,請呼叫 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']

如需環境變數的詳細資訊,請參閱 環境變數和應用程式組態

建立語音翻譯組態

若要使用語音 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 類別實例,而不是使用 use_default_microphone=True呼叫 時,請使用 呼叫 filename="path-to-file.wav" 並提供 filename 參數:

def translate_speech_to_text():
    translation_config = speechsdk.translation.SpeechTranslationConfig(
            subscription=speech_key, region=service_region)

    translation_config.speech_recognition_language = from_language
    for lang in to_languages:
        translation_config.add_target_language(lang)

    audio_config = speechsdk.audio.AudioConfig(filename="path-to-file.wav")
    translation_recognizer = speechsdk.translation.TranslationRecognizer(
            translation_config=translation_config, audio_config=audio_config)

翻譯語音

為了翻譯語音,語音 SDK 會依賴麥克風或音訊檔案輸入。 語音翻譯之前會進行語音辨識。 初始化所有物件之後,呼叫辨識一次函式並取得結果:

import os
import azure.cognitiveservices.speech as speechsdk

speech_key, service_region = os.environ['SPEECH__SERVICE__KEY'], os.environ['SPEECH__SERVICE__REGION']
from_language, to_languages = 'en-US', 'de'

def translate_speech_to_text():
    translation_config = speechsdk.translation.SpeechTranslationConfig(
            subscription=speech_key, region=service_region)

    translation_config.speech_recognition_language = from_language
    translation_config.add_target_language(to_language)

    translation_recognizer = speechsdk.translation.TranslationRecognizer(
            translation_config=translation_config)
    
    print('Say something...')
    result = translation_recognizer.recognize_once()
    print(get_result_text(reason=result.reason, result=result))

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

translate_speech_to_text()

如需語音轉換文字的詳細資訊,請參閱語音辨識的基本概念

合成翻譯

成功進行語音辨識和翻譯之後,結果就會在字典中包含所有翻譯。 字典 translations 索引鍵是目標翻譯語言,而值是翻譯的文字。 辨識的語音可以翻譯,然後以不同的語言合成(語音轉換語音)。

以事件為基礎的合成

物件 TranslationRecognizerSynthesizing 公開事件。 事件會引發數次,並提供從翻譯辨識結果擷取合成音訊的機制。 如果您要翻譯為多種語言,請參閱 手動合成

藉由指派 實例來指定 voice_name 合成語音,併為事件提供事件處理程式 Synthesizing 以取得音訊。 下列範例會將翻譯的音訊儲存為.wav檔案。

重要

事件型合成只適用於單一翻譯。 請勿 新增多個目標翻譯語言。 此外, voice_name 此值應該與目標翻譯語言相同。 例如, "de" 可以對應至 "de-DE-Hedda"

import os
import azure.cognitiveservices.speech as speechsdk

speech_key, service_region = os.environ['SPEECH__SERVICE__KEY'], os.environ['SPEECH__SERVICE__REGION']
from_language, to_language = 'en-US', 'de'

def translate_speech_to_text():
    translation_config = speechsdk.translation.SpeechTranslationConfig(
            subscription=speech_key, region=service_region)

    translation_config.speech_recognition_language = from_language
    translation_config.add_target_language(to_language)

    # See: https://aka.ms/speech/sdkregion#standard-and-neural-voices
    translation_config.voice_name = "de-DE-Hedda"

    translation_recognizer = speechsdk.translation.TranslationRecognizer(
            translation_config=translation_config)

    def synthesis_callback(evt):
        size = len(evt.result.audio)
        print(f'Audio synthesized: {size} byte(s) {"(COMPLETED)" if size == 0 else ""}')

        if size > 0:
            file = open('translation.wav', 'wb+')
            file.write(evt.result.audio)
            file.close()

    translation_recognizer.synthesizing.connect(synthesis_callback)

    print(f'Say something in "{from_language}" and we\'ll translate into "{to_language}".')

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

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

translate_speech_to_text()

手動合成

您可以使用 translations 字典從翻譯文字合成音訊。 逐一查看每個翻譯並合成它。 當您建立 SpeechSynthesizer 實例時, 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...')
    result = translation_recognizer.recognize_once()
    synthesize_translations(result=result)

def synthesize_translations(result):
    language_to_voice_map = {
        "de": "de-DE-KatjaNeural",
        "en": "en-US-AriaNeural",
        "it": "it-IT-ElsaNeural",
        "pt": "pt-BR-FranciscaNeural",
        "zh-Hans": "zh-CN-XiaoxiaoNeural"
    }
    print(f'Recognized: "{result.text}"')

    for language in result.translations:
        translation = result.translations[language]
        print(f'Translated into "{language}": {translation}')

        speech_config = speechsdk.SpeechConfig(subscription=speech_key, region=service_region)
        speech_config.speech_synthesis_voice_name = language_to_voice_map.get(language)
        
        audio_config = speechsdk.audio.AudioOutputConfig(filename=f'{language}-translation.wav')
        speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)
        speech_synthesizer.speak_text_async(translation).get()

translate_speech_to_text()

如需語音合成的詳細資訊,請參閱 語音合成的基本概念。

使用語言識別的多語翻譯

在許多情況下,您可能不知道要指定的輸入語言。 使用語言識別可讓您指定最多 10 種可能的輸入語言,並自動翻譯成您的目標語言。

如需完整的程式碼範例,請參閱語言識別

語音轉換文字 REST API 參考 | 適用於簡短音訊的語音轉換文字 REST API 參考 | GitHub 上的其他範例

您可以使用 REST API 進行語音翻譯,但我們尚未在此包含指南。 請選取另一種程式設計語言來開始使用並了解概念。

在本操作指南中,您將瞭解如何辨識人類語音,並將其翻譯成另一種語言。

如需詳細資訊,請參閱語音翻譯 概觀

  • 將語音轉譯為文字
  • 將語音翻譯成多個目標語言
  • 執行直接語音轉換語音翻譯

必要條件

  • Azure 訂用帳戶 - 建立免費帳戶
  • 在 Azure 入口網站上建立語音資源
  • 您的語音資源金鑰和區域。 部署語音資源之後,請選取 [移至資源 ] 以檢視和管理密鑰。 如需 Azure AI 服務資源的詳細資訊,請參閱取得資源的金鑰

下載並安裝

請遵循下列步驟,並參閱 語音 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

下一步