分享方式:


如何辨識和翻譯語音

參考文件 | 套件 (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 金鑰,請將其安全地儲存在別處,例如 Azure Key Vault。 請勿在程式碼中直接包含 API 金鑰,且切勿公開將其張貼。

如需 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 類別執行個體,並在初始化 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 會依賴麥克風或音訊檔案輸入。 語音翻譯之前會進行語音辨識。 所有物件都初始化之後,請呼叫 recognize-once 函式並取得結果:

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

    using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

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

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

以事件為基礎的翻譯

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

注意

當您使用多語語音翻譯時,就無法使用中繼翻譯結果。

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

using (var audioInput = AudioConfig.FromWavFileInput(@"whatstheweatherlike.wav"))
{
    using (var translationRecognizer = new TranslationRecognizer(config, audioInput))
    {
        // Subscribes to events.
        translationRecognizer.Recognizing += (s, e) =>
        {
            Console.WriteLine($"RECOGNIZING in '{fromLanguage}': Text={e.Result.Text}");
            foreach (var element in e.Result.Translations)
            {
                Console.WriteLine($"    TRANSLATING into '{element.Key}': {element.Value}");
            }
        };

        translationRecognizer.Recognized += (s, e) => {
            if (e.Result.Reason == ResultReason.TranslatedSpeech)
            {
                Console.WriteLine($"RECOGNIZED in '{fromLanguage}': Text={e.Result.Text}");
                foreach (var element in e.Result.Translations)
                {
                    Console.WriteLine($"    TRANSLATED into '{element.Key}': {element.Value}");
                }
            }
            else if (e.Result.Reason == ResultReason.RecognizedSpeech)
            {
                Console.WriteLine($"RECOGNIZED: Text={e.Result.Text}");
                Console.WriteLine($"    Speech not translated.");
            }
            else if (e.Result.Reason == ResultReason.NoMatch)
            {
                Console.WriteLine($"NOMATCH: Speech could not be recognized.");
            }
        };

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

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

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

合成翻譯

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

以事件為基礎的合成

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

您可以指派 VoiceName 執行個體以指定合成語音,並提供 Synthesizing 事件的事件處理常式,以取得音訊。 下列範例會將翻譯的音訊儲存為 .wav 檔案。

重要

以事件為基礎的合成僅適用於單一翻譯。 「不要」新增多個目標翻譯語言。 此外,VoiceName 值應該與目標翻譯語言的語言相同。 例如,"de" 可對應到 "de-DE-Hedda"

static async Task TranslateSpeechAsync()
{
    var speechTranslationConfig =
        SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    
    var fromLanguage = "en-US";
    var toLanguage = "de";
    speechTranslationConfig.SpeechRecognitionLanguage = fromLanguage;
    speechTranslationConfig.AddTargetLanguage(toLanguage);

    speechTranslationConfig.VoiceName = "de-DE-Hedda";

    using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

    translationRecognizer.Synthesizing += (_, e) =>
    {
        var audio = e.Result.GetAudio();
        Console.WriteLine($"Audio synthesized: {audio.Length:#,0} byte(s) {(audio.Length == 0 ? "(Complete)" : "")}");

        if (audio.Length > 0)
        {
            File.WriteAllBytes("YourAudioFile.wav", audio);
        }
    };

    Console.Write($"Say something in '{fromLanguage}' and ");
    Console.WriteLine($"we'll translate into '{toLanguage}'.\n");

    var result = await translationRecognizer.RecognizeOnceAsync();
    if (result.Reason == ResultReason.TranslatedSpeech)
    {
        Console.WriteLine($"Recognized: \"{result.Text}\"");
        Console.WriteLine($"Translated into '{toLanguage}': {result.Translations[toLanguage]}");
    }
}

手動合成

您可使用 Translations 字典從翻譯文字合成音訊。 逐一查看每個翻譯並合成翻譯。 建立 SpeechSynthesizer 執行個體時,SpeechConfig 物件必須將其 SpeechSynthesisVoiceName 屬性設定為所需的語音。

下列範例會翻譯成五種語言。 每個翻譯都會使用對應類神經語言合成一個音訊檔案。

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

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

    using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

    Console.Write($"Say something in '{fromLanguage}' and ");
    Console.WriteLine($"we'll translate into '{string.Join("', '", toLanguages)}'.\n");

    var result = await translationRecognizer.RecognizeOnceAsync();
    if (result.Reason == ResultReason.TranslatedSpeech)
    {
        var languageToVoiceMap = new Dictionary<string, string>
        {
            ["de"] = "de-DE-KatjaNeural",
            ["en"] = "en-US-AriaNeural",
            ["it"] = "it-IT-ElsaNeural",
            ["pt"] = "pt-BR-FranciscaNeural",
            ["zh-Hans"] = "zh-CN-XiaoxiaoNeural"
        };

        Console.WriteLine($"Recognized: \"{result.Text}\"");

        foreach (var (language, translation) in result.Translations)
        {
            Console.WriteLine($"Translated into '{language}': {translation}");

            var speechConfig =
                SpeechConfig.FromSubscription(
                    SPEECH__SERVICE__KEY, SPEECH__SERVICE__REGION);
            speechConfig.SpeechSynthesisVoiceName = languageToVoiceMap[language];

            using var audioConfig = AudioConfig.FromWavFileOutput($"{language}-translation.wav");
            using var speechSynthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
            
            await speechSynthesizer.SpeakTextAsync(translation);
        }
    }
}

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

使用語言識別的多語言翻譯

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

以下範例預期會偵測到 en-USzh-CN,因為它們都在 AutoDetectSourceLanguageConfig 中定義。 然後,會將此語音會翻譯為 defr,如 AddTargetLanguage() 呼叫中所指定。

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

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

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

多語語音翻譯會實現新一層級的語音翻譯技術,可發揮各種功能,包括沒有指定的輸入語言,以及在相同工作階段中的語言切換處理。 這些功能可實現新一層級的語音翻譯功能,您可將這些功能導入產品。

目前當使用語言識別碼搭配語音翻譯時,您必須從 v2 端點建立 SpeechTranslationConfig 物件。 將字串 “YourServiceRegion” 取代為語音資源區域 (例如 “westus”)。 將 "YourSubscriptionKey" 取代為語音資源金鑰。

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

指定翻譯目標語言。 以您選擇的語言取代。 您可以新增更多行。

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

多語語音翻譯的主要區別在於您不需要指定來源語言。 這是因為該服務會自動偵測來源語言。 使用 fromOpenRange 方法建立 AutoDetectSourceLanguageConfig 物件,讓該服務知道您想要使用多語語音翻譯,但不指定來源語言。

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

如需使用語音 SDK 的完整程式碼範例,請參閱 GitHub 上的語音翻譯範例

在語音翻譯中使用自訂翻譯

語音翻譯中的自訂翻譯功能與 Azure 自訂翻譯服務緊密整合,可讓您實現更精確且量身打造的翻譯。 由於整合會直接運用 Azure 自訂翻譯服務的功能,您必須使用多服務資源,以確保完整功能集能夠正確運作。 如需詳細指示,請參閱與為 Azure AI 服務建立多服務資源有關的指南。

此外,若要離線訓練自訂翻譯工具並取得「類別識別碼」,請參閱快速入門:建置、部署和使用自訂模型 - 自訂翻譯工具中提供的逐步指令碼。

// Creates an instance of a translation recognizer using speech translation configuration
// You should use the same subscription key, which you used to generate the custom model before.
// V2 endpoint is required for the “Custom Translation” feature. Example: "wss://westcentralus.stt.speech.microsoft.com/speech/universal/v2"

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

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

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

       ….
}

參考文件 | 套件 (NuGet) | GitHub 上的其他範例

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

請參閱語音翻譯概觀,以了解下列項目的詳細資訊:

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

機密資料和環境變數

本文中的範例原始程式碼相依於儲存敏感性資料的環境變數,例如語音資源的索引碼和區域。 C++ 程式碼檔案包含兩個從主機電腦環境變數指派的字串值:SPEECH__SUBSCRIPTION__KEYSPEECH__SERVICE__REGION。 這兩個欄位都在類別範圍內,所以可在類別的方法主體內存取:

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

如需有關環境變數的詳細資訊,請參閱環境變數和應用程式設定

重要

如果您使用 API 金鑰,請將其安全地儲存在別處,例如 Azure Key Vault。 請勿在程式碼中直接包含 API 金鑰,且切勿公開將其張貼。

如需 AI 服務安全性的詳細資訊,請參閱驗證對 Azure AI 服務的要求

建立語音翻譯設定

若要使用語音 SDK 來呼叫語音服務,您必須建立 SpeechTranslationConfig 執行個體。 此類別包含訂用帳戶的相關資訊,例如您的金鑰和關聯的區域、端點、主機或授權權杖。

提示

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

您有幾種方式可初始化 SpeechTranslationConfig

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

讓我們看看如何使用金鑰和區域來建立 SpeechTranslationConfig 執行個體。 取得 Azure 入口網站中的語音資源金鑰和區域。

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

void translateSpeech() {
    auto speechTranslationConfig =
        SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
}

int main(int argc, char** argv) {
    setlocale(LC_ALL, "");
    translateSpeech();
    return 0;
}

變更來源語言

語音翻譯的其中一個常見工作是指定輸入 (或來源) 語言。 下列範例示範如何將輸入語言變更為義大利文。 在您的程式碼中,呼叫 SetSpeechRecognitionLanguage 方法藉以與 SpeechTranslationConfig 執行個體進行互動。

void translateSpeech() {
    auto speechTranslationConfig =
        SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    // Source (input) language
    speechTranslationConfig->SetSpeechRecognitionLanguage("it-IT");
}

SpeechRecognitionLanguage 屬性需要語言/地區設定格式字串。 請參閱支援的語音翻譯地區設定清單

新增翻譯語言

語音翻譯的另一個常見工作,是指定目標翻譯語言。 至少需要一種語言,但可支援多種語言。 下列程式碼片段會將法文和德文設定為翻譯語言目標:

void translateSpeech() {
    auto speechTranslationConfig =
        SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    speechTranslationConfig->SetSpeechRecognitionLanguage("it-IT");

    speechTranslationConfig->AddTargetLanguage("fr");
    speechTranslationConfig->AddTargetLanguage("de");
}

每次呼叫 AddTargetLanguage 時,會指定新的目標翻譯語言。 換句話說,從來源語言辨識語音時,每個目標翻譯都可做為所產生翻譯作業的一部分。

將翻譯辨識器初始化

建立 SpeechTranslationConfig 執行個體之後,下一步是初始化 TranslationRecognizer。 當您初始化 TranslationRecognizer 後,即必須將其傳入您的 translationConfig 執行個體。 設定物件會提供語音服務驗證您要求所需的認證。

如果您要使用裝置的預設麥克風來辨識語音,則 TranslationRecognizer 看起來應像這樣:

void translateSpeech() {
    auto speechTranslationConfig =
        SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    auto fromLanguage = "en-US";
    auto toLanguages = { "it", "fr", "de" };
    speechTranslationConfig->SetSpeechRecognitionLanguage(fromLanguage);
    for (auto language : toLanguages) {
        speechTranslationConfig->AddTargetLanguage(language);
    }

    auto translationRecognizer = TranslationRecognizer::FromConfig(translationConfig);
}

如果您想要指定音訊輸入裝置,您即必須建立 AudioConfig 類別執行個體,並在初始化 TranslationRecognizer 時提供 audioConfig 參數。

首先,參考 AudioConfig 物件,如下所示:

void translateSpeech() {
    auto speechTranslationConfig =
        SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    auto fromLanguage = "en-US";
    auto toLanguages = { "it", "fr", "de" };
    speechTranslationConfig->SetSpeechRecognitionLanguage(fromLanguage);
    for (auto language : toLanguages) {
        speechTranslationConfig->AddTargetLanguage(language);
    }

    auto audioConfig = AudioConfig::FromDefaultMicrophoneInput();
    auto translationRecognizer = TranslationRecognizer::FromConfig(translationConfig, audioConfig);
}

如果您想要提供音訊檔案而非使用麥克風,您仍然需要提供 audioConfig 參數。 不過,建立 AudioConfig 類別執行個體時,不要呼叫 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 會依賴麥克風或音訊檔案輸入。 語音翻譯之前會進行語音辨識。 所有物件都初始化之後,請呼叫 recognize-once 函式並取得結果:

void translateSpeech() {
    auto speechTranslationConfig =
        SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    string fromLanguage = "en-US";
    string toLanguages[3] = { "it", "fr", "de" };
    speechTranslationConfig->SetSpeechRecognitionLanguage(fromLanguage);
    for (auto language : toLanguages) {
        speechTranslationConfig->AddTargetLanguage(language);
    }

    auto translationRecognizer = TranslationRecognizer::FromConfig(translationConfig);
    cout << "Say something in '" << fromLanguage << "' and we'll translate...\n";

    auto result = translationRecognizer->RecognizeOnceAsync().get();
    if (result->Reason == ResultReason::TranslatedSpeech)
    {
        cout << "Recognized: \"" << result->Text << "\"" << std::endl;
        for (auto pair : result->Translations)
        {
            auto language = pair.first;
            auto translation = pair.second;
            cout << "Translated into '" << language << "': " << translation << std::endl;
        }
    }
}

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

合成翻譯

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

以事件為基礎的合成

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

您可以指派 SetVoiceName 執行個體以指定合成語音,並提供 Synthesizing 事件的事件處理常式,以取得音訊。 下列範例會將翻譯的音訊儲存為 .wav 檔案。

重要

以事件為基礎的合成僅適用於單一翻譯。 「不要」新增多個目標翻譯語言。 此外,SetVoiceName 值應該與目標翻譯語言的語言相同。 例如,"de" 可對應到 "de-DE-Hedda"

void translateSpeech() {
    auto speechTranslationConfig =
        SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    auto fromLanguage = "en-US";
    auto toLanguage = "de";
    speechTranslationConfig->SetSpeechRecognitionLanguage(fromLanguage);
    speechTranslationConfig->AddTargetLanguage(toLanguage);

    speechTranslationConfig->SetVoiceName("de-DE-Hedda");

    auto translationRecognizer = TranslationRecognizer::FromConfig(translationConfig);
    translationRecognizer->Synthesizing.Connect([](const TranslationSynthesisEventArgs& e)
        {
            auto audio = e.Result->Audio;
            auto size = audio.size();
            cout << "Audio synthesized: " << size << " byte(s)" << (size == 0 ? "(COMPLETE)" : "") << std::endl;

            if (size > 0) {
                ofstream file("translation.wav", ios::out | ios::binary);
                auto audioData = audio.data();
                file.write((const char*)audioData, sizeof(audio[0]) * size);
                file.close();
            }
        });

    cout << "Say something in '" << fromLanguage << "' and we'll translate...\n";

    auto result = translationRecognizer->RecognizeOnceAsync().get();
    if (result->Reason == ResultReason::TranslatedSpeech)
    {
        cout << "Recognized: \"" << result->Text << "\"" << std::endl;
        for (auto pair : result->Translations)
        {
            auto language = pair.first;
            auto translation = pair.second;
            cout << "Translated into '" << language << "': " << translation << std::endl;
        }
    }
}

手動合成

您可使用 Translations 字典從翻譯文字合成音訊。 逐一查看每個翻譯並合成翻譯。 建立 SpeechSynthesizer 執行個體時,SpeechConfig 物件必須將其 SetSpeechSynthesisVoiceName 屬性設定為所需的語音。

下列範例會翻譯成五種語言。 每個翻譯都會使用對應類神經語言合成一個音訊檔案。

void translateSpeech() {
    auto speechTranslationConfig =
        SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    auto fromLanguage = "en-US";
    auto toLanguages = { "de", "en", "it", "pt", "zh-Hans" };
    speechTranslationConfig->SetSpeechRecognitionLanguage(fromLanguage);
    for (auto language : toLanguages) {
        speechTranslationConfig->AddTargetLanguage(language);
    }

    auto translationRecognizer = TranslationRecognizer::FromConfig(translationConfig);

    cout << "Say something in '" << fromLanguage << "' and we'll translate...\n";

    auto result = translationRecognizer->RecognizeOnceAsync().get();
    if (result->Reason == ResultReason::TranslatedSpeech)
    {
        map<string, string> languageToVoiceMap;
        languageToVoiceMap["de"] = "de-DE-KatjaNeural";
        languageToVoiceMap["en"] = "en-US-AriaNeural";
        languageToVoiceMap["it"] = "it-IT-ElsaNeural";
        languageToVoiceMap["pt"] = "pt-BR-FranciscaNeural";
        languageToVoiceMap["zh-Hans"] = "zh-CN-XiaoxiaoNeural";

        cout << "Recognized: \"" << result->Text << "\"" << std::endl;
        for (auto pair : result->Translations)
        {
            auto language = pair.first;
            auto translation = pair.second;
            cout << "Translated into '" << language << "': " << translation << std::endl;

            auto speechConfig =
                SpeechConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
            speechConfig->SetSpeechSynthesisVoiceName(languageToVoiceMap[language]);

            auto audioConfig = AudioConfig::FromWavFileOutput(language + "-translation.wav");
            auto speechSynthesizer = SpeechSynthesizer::FromConfig(speechConfig, audioConfig);

            speechSynthesizer->SpeakTextAsync(translation).get();
        }
    }
}

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

使用語言識別的多語言翻譯

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

以下範例預期會偵測到 en-USzh-CN,因為它們都在 AutoDetectSourceLanguageConfig 中定義。 然後,語音將會翻譯為 defr,如 AddTargetLanguage() 呼叫中所指定。

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

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

參考文件 | 套件 (Go) | GitHub 上的其他範例

適用於 Go 的語音 SDK 不支援語音翻譯。 請選取其他程式設計語言,或本文開頭的 Go 參考和樣本連結。

參考文件 | GitHub 上的其他範例

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

請參閱語音翻譯概觀,以了解下列項目的詳細資訊:

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

機密資料和環境變數

本文中的範例原始程式碼相依於儲存敏感性資料的環境變數,例如語音資源的索引碼和區域。 Java 程式碼檔案包含兩個從主機電腦環境變數指派的 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 金鑰,請將其安全地儲存在別處,例如 Azure Key Vault。 請勿在程式碼中直接包含 API 金鑰,且切勿公開將其張貼。

如需 AI 服務安全性的詳細資訊,請參閱驗證對 Azure AI 服務的要求

建立語音翻譯設定

若要使用語音 SDK 來呼叫語音服務,您必須建立 SpeechTranslationConfig 執行個體。 此類別包含訂用帳戶的相關資訊,例如您的金鑰和關聯的區域、端點、主機或授權權杖。

提示

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

您有幾種方法可以初始化 SpeechTranslationConfig 執行個體:

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

讓我們看看如何使用金鑰和區域來建立 SpeechTranslationConfig 執行個體。 取得 Azure 入口網站中的語音資源金鑰和區域。

public class App {

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

    public static void main(String[] args) {
        try {
            translateSpeech();
            System.exit(0);
        } catch (Exception ex) {
            System.out.println(ex);
            System.exit(1);
        }
    }

    static void translateSpeech() {
        SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
            SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    }
}

變更來源語言

語音翻譯的其中一個常見工作是指定輸入 (或來源) 語言。 下列範例示範如何將輸入語言變更為義大利文。 在您的程式碼中,呼叫 setSpeechRecognitionLanguage 方法藉以與 SpeechTranslationConfig 執行個體進行互動:

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

setSpeechRecognitionLanguage 函式需要語言/地區設定格式字串。 請參閱支援的語音翻譯地區設定清單

新增翻譯語言

語音翻譯的另一個常見工作,是指定目標翻譯語言。 至少需要一種語言,但可支援多種語言。 下列程式碼片段會將法文和德文設定為翻譯語言目標:

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

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

每次呼叫 addTargetLanguage 時,會指定新的目標翻譯語言。 換句話說,從來源語言辨識語音時,每個目標翻譯都可做為所產生翻譯作業的一部分。

將翻譯辨識器初始化

建立 SpeechTranslationConfig 執行個體之後,下一步是初始化 TranslationRecognizer。 當您初始化 TranslationRecognizer 後,即必須將其傳入您的 speechTranslationConfig 執行個體。 設定物件會提供語音服務驗證您要求所需的認證。

如果您要使用裝置的預設麥克風來辨識語音,則 TranslationRecognizer 看起來應像這樣:

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

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

如果您想要指定音訊輸入裝置,您即必須建立 AudioConfig 類別執行個體,並在初始化 TranslationRecognizer 時提供 audioConfig 參數。

首先,參考 AudioConfig 物件,如下所示:

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

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

如果您想要提供音訊檔案而非使用麥克風,您仍然需要提供 audioConfig 參數。 不過,建立 AudioConfig 類別執行個體時,不要呼叫 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 會依賴麥克風或音訊檔案輸入。 語音翻譯之前會進行語音辨識。 所有物件都初始化之後,請呼叫 recognize-once 函式並取得結果:

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

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

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

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

合成翻譯

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

以事件為基礎的合成

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

您可以指派 setVoiceName 執行個體以指定合成語音,並提供 synthesizing 事件的事件處理常式,以取得音訊。 下列範例會將翻譯的音訊儲存為 .wav 檔案。

重要

以事件為基礎的合成僅適用於單一翻譯。 「不要」新增多個目標翻譯語言。 此外,setVoiceName 值應該與目標翻譯語言的語言相同。 例如,"de" 可對應到 "de-DE-Hedda"

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

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

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

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

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

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

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

手動合成

getTranslations 函式會傳回可用來從翻譯文字合成音訊的字典。 逐一查看每個翻譯並合成翻譯。 建立 SpeechSynthesizer 執行個體時,SpeechConfig 物件必須將其 setSpeechSynthesisVoiceName 屬性設定為所需的語音。

下列範例會翻譯成五種語言。 每個翻譯都會使用對應類神經語言合成一個音訊檔案。

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

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

        TranslationRecognitionResult translationRecognitionResult = translationRecognizer.recognizeOnceAsync().get();
        if (translationRecognitionResult.getReason() == ResultReason.TranslatedSpeech) {
            // See: https://aka.ms/speech/sdkregion#standard-and-neural-voices
            Map<String, String> languageToVoiceMap = new HashMap<String, String>();
            languageToVoiceMap.put("de", "de-DE-KatjaNeural");
            languageToVoiceMap.put("en", "en-US-AriaNeural");
            languageToVoiceMap.put("it", "it-IT-ElsaNeural");
            languageToVoiceMap.put("pt", "pt-BR-FranciscaNeural");
            languageToVoiceMap.put("zh-Hans", "zh-CN-XiaoxiaoNeural");

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

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

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

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

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

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

請參閱語音翻譯概觀,以了解下列項目的詳細資訊:

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

建立翻譯設定

若要使用語音 SDK 來呼叫翻譯服務,您必須建立 SpeechTranslationConfig 執行個體。 此類別包含訂用帳戶的相關資訊,例如您的金鑰和關聯的區域、端點、主機或授權權杖。

注意

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

您有幾種方式可初始化 SpeechTranslationConfig

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

讓我們看看如何使用金鑰和區域來建立 SpeechTranslationConfig 執行個體。 取得 Azure 入口網站中的語音資源金鑰和區域。

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

將翻譯工具初始化

建立 SpeechTranslationConfig 執行個體之後,下一步是初始化 TranslationRecognizer。 當您初始化 TranslationRecognizer 後,即必須將其傳入您的 speechTranslationConfig 執行個體。 設定物件會提供翻譯服務驗證您要求所需的認證。

如果您要翻譯透過裝置預設麥克風提供的語音,則 TranslationRecognizer 應會顯示如下:

const translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

如果您想要指定音訊輸入裝置,您即必須建立 AudioConfig 類別執行個體,並在初始化 TranslationRecognizer 時提供 audioConfig 參數。

參考 AudioConfig 物件,如下所示:

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

如果您想要提供音訊檔案而非使用麥克風,您仍然需要提供 audioConfig 參數。 不過,只有在以 Node.js 為目標時,才能執行此動作。 建立 AudioConfig 類別執行個體時,不要呼叫 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 金鑰,請將其安全地儲存在別處,例如 Azure Key Vault。 請勿在程式碼中直接包含 API 金鑰,且切勿公開將其張貼。

如需 AI 服務安全性的詳細資訊,請參閱驗證對 Azure AI 服務的要求

建立語音翻譯設定

若要使用語音 SDK 來呼叫語音服務,您必須建立 SpeechTranslationConfig 執行個體。 此類別包含訂用帳戶的相關資訊,例如您的金鑰和關聯的區域、端點、主機或授權權杖。

提示

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

您有幾種方式可初始化 SpeechTranslationConfig

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

讓我們看看您可如何使用金鑰和區域來建立 SpeechTranslationConfig 執行個體。 取得 Azure 入口網站中的語音資源金鑰和區域。

from_language, to_language = 'en-US', 'de'

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

變更來源語言

語音翻譯的其中一個常見工作是指定輸入 (或來源) 語言。 下列範例示範如何將輸入語言變更為義大利文。 在您的程式碼中,將 SpeechTranslationConfig 執行個體指派給 speech_recognition_language 屬性以與其互動。

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

    # Source (input) language
    from_language = "it-IT"
    translation_config.speech_recognition_language = from_language

speech_recognition_language 屬性需要語言/地區設定格式字串。 請參閱支援的語音翻譯地區設定清單

新增翻譯語言

語音翻譯的另一個常見工作,是指定目標翻譯語言。 至少需要一種語言,但可支援多種語言。 下列程式碼片段會將法文和德文設定為翻譯語言目標:

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

    translation_config.speech_recognition_language = "it-IT"

    # Translate to languages. See, https://aka.ms/speech/sttt-languages
    translation_config.add_target_language("fr")
    translation_config.add_target_language("de")

每次呼叫 add_target_language 時,會指定新的目標翻譯語言。 換句話說,從來源語言辨識語音時,每個目標翻譯都可做為所產生翻譯作業的一部分。

將翻譯辨識器初始化

建立 SpeechTranslationConfig 執行個體之後,下一步是初始化 TranslationRecognizer。 當您初始化 TranslationRecognizer 後,即必須將其傳入您的 translation_config 執行個體。 設定物件會提供語音服務驗證您要求所需的認證。

如果您要使用裝置的預設麥克風來辨識語音,則 TranslationRecognizer 看起來應像這樣:

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

    translation_config.speech_recognition_language = from_language
    translation_config.add_target_language(to_language)

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

如果您想要指定音訊輸入裝置,您即必須建立 AudioConfig 類別執行個體,並在初始化 TranslationRecognizer 時提供 audio_config 參數。

首先,參考 AudioConfig 物件,如下所示:

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

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

    audio_config = speechsdk.audio.AudioConfig(use_default_microphone=True)
    translation_recognizer = speechsdk.translation.TranslationRecognizer(
            translation_config=translation_config, audio_config=audio_config)

如果您想要提供音訊檔案而非使用麥克風,您仍然需要提供 audioConfig 參數。 不過,當您建立 AudioConfig 類別執行個體時,不要使用 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 會依賴麥克風或音訊檔案輸入。 語音翻譯之前會進行語音辨識。 所有物件都初始化之後,請呼叫 recognize-once 函式並取得結果:

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 命令以安裝 Speech 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

下一步