如何辨識和翻譯語音
參考文件 | 套件 (NuGet) | GitHub 上的其他範例
在本操作指南中,您將瞭解如何辨識人類語音,並將其翻譯成另一種語言。
如需詳細資訊,請參閱語音翻譯 概觀 :
- 將語音轉譯為文字
- 將語音翻譯成多個目標語言
- 執行直接語音轉換語音翻譯
敏感數據和環境變數
本文中的範例原始碼取決於用來儲存敏感數據的環境變數,例如語音資源的密鑰和區域。 類別 Program
包含從主計算機環境變數指派的兩個 static readonly string
值: SPEECH__SUBSCRIPTION__KEY
和 SPEECH__SERVICE__REGION
。 這兩個字段都在類別範圍中,因此可在 類別的方法主體中存取:
public class Program
{
static readonly string SPEECH__SUBSCRIPTION__KEY =
Environment.GetEnvironmentVariable(nameof(SPEECH__SUBSCRIPTION__KEY));
static readonly string SPEECH__SERVICE__REGION =
Environment.GetEnvironmentVariable(nameof(SPEECH__SERVICE__REGION));
static Task Main() => Task.CompletedTask;
}
如需環境變數的詳細資訊,請參閱 環境變數和應用程式組態。
建立語音翻譯組態
若要使用語音 SDK 呼叫語音服務,您必須建立 SpeechTranslationConfig
實例。 此類別包含訂用帳戶的相關信息,例如密鑰和相關聯的區域、端點、主機或授權令牌。
提示
無論您執行語音辨識、語音合成、翻譯或意圖辨識,您一律都會建立設定。
您可以透過幾種方式初始化 SpeechTranslationConfig
:
- 使用訂用帳戶:傳入密鑰和相關聯的區域。
- 使用端點:傳入語音服務端點。 金鑰或授權令牌是選擇性的。
- 使用主機:傳入主機位址。 金鑰或授權令牌是選擇性的。
- 使用授權令牌:傳入授權令牌和相關聯的區域。
讓我們看看如何使用索引鍵和區域建立 SpeechTranslationConfig
實例。 取得 Azure 入口網站 中的語音資源金鑰和區域。
public class Program
{
static readonly string SPEECH__SUBSCRIPTION__KEY =
Environment.GetEnvironmentVariable(nameof(SPEECH__SUBSCRIPTION__KEY));
static readonly string SPEECH__SERVICE__REGION =
Environment.GetEnvironmentVariable(nameof(SPEECH__SERVICE__REGION));
static Task Main() => TranslateSpeechAsync();
static async Task TranslateSpeechAsync()
{
var speechTranslationConfig =
SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
}
}
變更來源語言
語音翻譯的其中一個常見工作是指定輸入(或來源)語言。 下列範例示範如何將輸入語言變更為義大利文。 在您的程式代碼中 SpeechTranslationConfig
,將它指派給 SpeechRecognitionLanguage
屬性,以與 實例互動:
static async Task TranslateSpeechAsync()
{
var speechTranslationConfig =
SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
// Source (input) language
speechTranslationConfig.SpeechRecognitionLanguage = "it-IT";
}
屬性 SpeechRecognitionLanguage
需要語言地區設定格式字串。 請參閱支援的語音翻譯地區設定清單。
新增翻譯語言
語音翻譯的另一個常見工作是指定目標翻譯語言。 至少需要一個,但支援多個。 下列代碼段會將法文和德文設定為翻譯語言目標:
static async Task TranslateSpeechAsync()
{
var speechTranslationConfig =
SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
speechTranslationConfig.SpeechRecognitionLanguage = "it-IT";
speechTranslationConfig.AddTargetLanguage("fr");
speechTranslationConfig.AddTargetLanguage("de");
}
每次呼叫 AddTargetLanguage
時,都會指定新的目標翻譯語言。 換句話說,從來源語言辨識語音時,每個目標翻譯都會作為產生的翻譯作業的一部分使用。
初始化翻譯辨識器
建立 SpeechTranslationConfig
實體之後,下一個步驟是初始化 TranslationRecognizer
。 當您初始化 TranslationRecognizer
時,您必須傳遞實例 speechTranslationConfig
。 組態物件會提供語音服務驗證要求所需的認證。
如果您使用裝置的預設麥克風來辨識語音,以下是 TranslationRecognizer
實例看起來應該的樣子:
static async Task TranslateSpeechAsync()
{
var speechTranslationConfig =
SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
var fromLanguage = "en-US";
var toLanguages = new List<string> { "it", "fr", "de" };
speechTranslationConfig.SpeechRecognitionLanguage = fromLanguage;
toLanguages.ForEach(speechTranslationConfig.AddTargetLanguage);
using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig);
}
如果您想要指定音訊輸入裝置,則需要建立AudioConfig
類別實例,並在初始化 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}");
}
}
}
如需語音轉換文字的詳細資訊,請參閱語音辨識的基本概念。
事件型轉譯
物件 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-US
或 zh-CN
,因為它們都在 AutoDetectSourceLanguageConfig
中定義。 然後,語音會轉譯為 de
fr
,如呼叫 AddTargetLanguage()
中所指定。
speechTranslationConfig.AddTargetLanguage("de");
speechTranslationConfig.AddTargetLanguage("fr");
var autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig.FromLanguages(new string[] { "en-US", "zh-CN" });
var translationRecognizer = new TranslationRecognizer(speechTranslationConfig, autoDetectSourceLanguageConfig, audioConfig);
如需完整的程式碼範例,請參閱語言識別。
沒有源語言候選的多語言語音翻譯
多語言語音翻譯會實作新的語音翻譯技術層級,以解除鎖定各種功能,包括沒有指定的輸入語言,以及在相同會話內處理語言切換。 這些功能可啟用可實作至產品的新語音翻譯功能層級。
目前當您使用語言識別碼搭配語音翻譯時,您必須從 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__KEY
和 SPEECH__SERVICE__REGION
。 這兩個字段都在類別範圍中,因此可在 類別的方法主體中存取:
auto SPEECH__SUBSCRIPTION__KEY = getenv("SPEECH__SUBSCRIPTION__KEY");
auto SPEECH__SERVICE__REGION = getenv("SPEECH__SERVICE__REGION");
如需環境變數的詳細資訊,請參閱 環境變數和應用程式組態。
建立語音翻譯組態
若要使用語音 SDK 呼叫語音服務,您必須建立 SpeechTranslationConfig
實例。 此類別包含訂用帳戶的相關信息,例如密鑰和相關聯的區域、端點、主機或授權令牌。
提示
無論您執行語音辨識、語音合成、翻譯或意圖辨識,您一律都會建立設定。
您可以透過幾種方式初始化 SpeechTranslationConfig
:
- 使用訂用帳戶:傳入密鑰和相關聯的區域。
- 使用端點:傳入語音服務端點。 金鑰或授權令牌是選擇性的。
- 使用主機:傳入主機位址。 金鑰或授權令牌是選擇性的。
- 使用授權令牌:傳入授權令牌和相關聯的區域。
讓我們看看如何使用索引鍵和區域建立 SpeechTranslationConfig
實例。 取得 Azure 入口網站 中的語音資源金鑰和區域。
auto SPEECH__SUBSCRIPTION__KEY = getenv("SPEECH__SUBSCRIPTION__KEY");
auto SPEECH__SERVICE__REGION = getenv("SPEECH__SERVICE__REGION");
void translateSpeech() {
auto speechTranslationConfig =
SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
}
int main(int argc, char** argv) {
setlocale(LC_ALL, "");
translateSpeech();
return 0;
}
變更來源語言
語音翻譯的其中一個常見工作是指定輸入(或來源)語言。 下列範例示範如何將輸入語言變更為義大利文。 在您的程式代碼中 SpeechTranslationConfig
,呼叫 SetSpeechRecognitionLanguage
方法,與 實例互動。
void translateSpeech() {
auto speechTranslationConfig =
SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
// Source (input) language
speechTranslationConfig->SetSpeechRecognitionLanguage("it-IT");
}
屬性 SpeechRecognitionLanguage
需要語言地區設定格式字串。 請參閱支援的語音翻譯地區設定清單。
新增翻譯語言
語音翻譯的另一個常見工作是指定目標翻譯語言。 至少需要一個,但支援多個。 下列代碼段會將法文和德文設定為翻譯語言目標:
void translateSpeech() {
auto speechTranslationConfig =
SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
speechTranslationConfig->SetSpeechRecognitionLanguage("it-IT");
speechTranslationConfig->AddTargetLanguage("fr");
speechTranslationConfig->AddTargetLanguage("de");
}
每次呼叫 AddTargetLanguage
時,都會指定新的目標翻譯語言。 換句話說,從來源語言辨識語音時,每個目標翻譯都會作為產生的翻譯作業的一部分使用。
初始化翻譯辨識器
建立 SpeechTranslationConfig
實體之後,下一個步驟是初始化 TranslationRecognizer
。 當您初始化 TranslationRecognizer
時,您必須傳遞實例 translationConfig
。 組態物件會提供語音服務驗證要求所需的認證。
如果您使用裝置的預設麥克風來辨識語音,以下是 TranslationRecognizer
看起來應該的樣子:
void translateSpeech() {
auto speechTranslationConfig =
SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
auto fromLanguage = "en-US";
auto toLanguages = { "it", "fr", "de" };
speechTranslationConfig->SetSpeechRecognitionLanguage(fromLanguage);
for (auto language : toLanguages) {
speechTranslationConfig->AddTargetLanguage(language);
}
auto translationRecognizer = TranslationRecognizer::FromConfig(translationConfig);
}
如果您想要指定音訊輸入裝置,則需要建立AudioConfig
類別實例,並在初始化 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
索引鍵是目標翻譯語言,而值是翻譯的文字。 辨識的語音可以翻譯,然後以不同的語言合成(語音轉換語音)。
以事件為基礎的合成
物件 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-US
或 zh-CN
,因為它們都在 AutoDetectSourceLanguageConfig
中定義。 然後,語音會轉譯為 de
fr
,如呼叫 AddTargetLanguage()
中所指定。
speechTranslationConfig->AddTargetLanguage("de");
speechTranslationConfig->AddTargetLanguage("fr");
auto autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig::FromLanguages({ "en-US", "zh-CN" });
auto translationRecognizer = TranslationRecognizer::FromConfig(speechTranslationConfig, autoDetectSourceLanguageConfig, audioConfig);
如需完整的程式碼範例,請參閱語言識別。
參考文件 | 套件 (Go) | GitHub 上的其他範例
適用於 Go 的語音 SDK 不支援語音翻譯。 請選取其他程式設計語言,或本文開頭的 Go 參考和樣本連結。
在本操作指南中,您將瞭解如何辨識人類語音,並將其翻譯成另一種語言。
如需詳細資訊,請參閱語音翻譯 概觀 :
- 將語音轉譯為文字
- 將語音翻譯成多個目標語言
- 執行直接語音轉換語音翻譯
敏感數據和環境變數
本文中的範例原始碼取決於用來儲存敏感數據的環境變數,例如語音資源的密鑰和區域。 Java 程式代碼檔案包含兩 static final String
個從主電腦環境變數指派的值: SPEECH__SUBSCRIPTION__KEY
和 SPEECH__SERVICE__REGION
。 這兩個字段都在類別範圍中,因此可在 類別的方法主體中存取:
public class App {
static final String SPEECH__SUBSCRIPTION__KEY = System.getenv("SPEECH__SUBSCRIPTION__KEY");
static final String SPEECH__SERVICE__REGION = System.getenv("SPEECH__SERVICE__REGION");
public static void main(String[] args) { }
}
如需環境變數的詳細資訊,請參閱 環境變數和應用程式組態。
建立語音翻譯組態
若要使用語音 SDK 呼叫語音服務,您必須建立 SpeechTranslationConfig
實例。 此類別包含訂用帳戶的相關信息,例如密鑰和相關聯的區域、端點、主機或授權令牌。
提示
無論您執行語音辨識、語音合成、翻譯或意圖辨識,您一律都會建立設定。
您可以透過幾種方式初始化 SpeechTranslationConfig
實例:
- 使用訂用帳戶:傳入密鑰和相關聯的區域。
- 使用端點:傳入語音服務端點。 金鑰或授權令牌是選擇性的。
- 使用主機:傳入主機位址。 金鑰或授權令牌是選擇性的。
- 使用授權令牌:傳入授權令牌和相關聯的區域。
讓我們看看如何使用索引鍵和區域建立 SpeechTranslationConfig
實例。 取得 Azure 入口網站 中的語音資源金鑰和區域。
public class App {
static final String SPEECH__SUBSCRIPTION__KEY = System.getenv("SPEECH__SERVICE__KEY");
static final String SPEECH__SERVICE__REGION = System.getenv("SPEECH__SERVICE__REGION");
public static void main(String[] args) {
try {
translateSpeech();
System.exit(0);
} catch (Exception ex) {
System.out.println(ex);
System.exit(1);
}
}
static void translateSpeech() {
SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
}
}
變更來源語言
語音翻譯的其中一個常見工作是指定輸入(或來源)語言。 下列範例示範如何將輸入語言變更為義大利文。 在您的程式代碼中 SpeechTranslationConfig
,呼叫 setSpeechRecognitionLanguage
方法來與 實例互動:
static void translateSpeech() {
SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
// Source (input) language
speechTranslationConfig.setSpeechRecognitionLanguage("it-IT");
}
函 setSpeechRecognitionLanguage
式需要語言地區設定格式字串。 請參閱支援的語音翻譯地區設定清單。
新增翻譯語言
語音翻譯的另一個常見工作是指定目標翻譯語言。 至少需要一個,但支援多個。 下列代碼段會將法文和德文設定為翻譯語言目標:
static void translateSpeech() {
SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
speechTranslationConfig.setSpeechRecognitionLanguage("it-IT");
// Translate to languages. See https://aka.ms/speech/sttt-languages
speechTranslationConfig.addTargetLanguage("fr");
speechTranslationConfig.addTargetLanguage("de");
}
每次呼叫 addTargetLanguage
時,都會指定新的目標翻譯語言。 換句話說,從來源語言辨識語音時,每個目標翻譯都會作為產生的翻譯作業的一部分使用。
初始化翻譯辨識器
建立 SpeechTranslationConfig
實體之後,下一個步驟是初始化 TranslationRecognizer
。 當您初始化 TranslationRecognizer
時,您必須傳遞實例 speechTranslationConfig
。 組態物件會提供語音服務驗證要求所需的認證。
如果您使用裝置的預設麥克風來辨識語音,以下是 TranslationRecognizer
看起來應該的樣子:
static void translateSpeech() {
SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
String fromLanguage = "en-US";
String[] toLanguages = { "it", "fr", "de" };
speechTranslationConfig.setSpeechRecognitionLanguage(fromLanguage);
for (String language : toLanguages) {
speechTranslationConfig.addTargetLanguage(language);
}
try (TranslationRecognizer translationRecognizer = new TranslationRecognizer(speechTranslationConfig)) {
}
}
如果您想要指定音訊輸入裝置,則需要建立AudioConfig
類別實例,並在初始化 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
傳回索引鍵做為目標翻譯語言的字典,並以翻譯文字的形式傳回值。 辨識的語音可以翻譯,然後以不同的語言合成(語音轉換語音)。
以事件為基礎的合成
物件 TranslationRecognizer
會 synthesizing
公開事件。 事件會引發數次,並提供從翻譯辨識結果擷取合成音訊的機制。 如果您要翻譯為多種語言,請參閱 手動合成。
藉由指派 實例來指定 setVoiceName
合成語音,併為事件提供事件處理程式 synthesizing
以取得音訊。 下列範例會將翻譯的音訊儲存為.wav檔案。
重要
事件型合成只適用於單一翻譯。 請勿 新增多個目標翻譯語言。 此外, setVoiceName
此值應該與目標翻譯語言相同。 例如, "de"
可以對應至 "de-DE-Hedda"
。
static void translateSpeech() throws ExecutionException, FileNotFoundException, InterruptedException, IOException {
SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
String fromLanguage = "en-US";
String toLanguage = "de";
speechTranslationConfig.setSpeechRecognitionLanguage(fromLanguage);
speechTranslationConfig.addTargetLanguage(toLanguage);
// See: https://aka.ms/speech/sdkregion#standard-and-neural-voices
speechTranslationConfig.setVoiceName("de-DE-Hedda");
try (TranslationRecognizer translationRecognizer = new TranslationRecognizer(speechTranslationConfig)) {
translationRecognizer.synthesizing.addEventListener((s, e) -> {
byte[] audio = e.getResult().getAudio();
int size = audio.length;
System.out.println("Audio synthesized: " + size + " byte(s)" + (size == 0 ? "(COMPLETE)" : ""));
if (size > 0) {
try (FileOutputStream file = new FileOutputStream("translation.wav")) {
file.write(audio);
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
System.out.printf("Say something in '%s' and we'll translate...", fromLanguage);
TranslationRecognitionResult result = translationRecognizer.recognizeOnceAsync().get();
if (result.getReason() == ResultReason.TranslatedSpeech) {
System.out.printf("Recognized: \"%s\"\n", result.getText());
for (Map.Entry<String, String> pair : result.getTranslations().entrySet()) {
String language = pair.getKey();
String translation = pair.getValue();
System.out.printf("Translated into '%s': %s\n", language, translation);
}
}
}
}
手動合成
函 getTranslations
式會傳回字典,您可以用來從翻譯文字合成音訊。 逐一查看每個翻譯並合成它。 當您建立 SpeechSynthesizer
實例時, 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
類別實例,而不是呼叫 時,會呼叫 fromDefaultMicrophoneInput
fromWavFileOutput
並傳遞 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);
};
連續轉譯
連續翻譯比單次辨識多一點。 您必須訂閱 recognizing
、 recognized
和 canceled
事件,才能取得辨識結果。 若要停止翻譯,您必須呼叫 stopContinuousRecognitionAsync
。
以下是如何在音訊輸入檔上執行連續翻譯的範例。 讓我們從定義輸入和初始化 TranslationRecognizer
開始:
const translationRecognizer = new TranslationRecognizer(speechTranslationConfig);
在下列程式代碼中,您會訂閱從 TranslationRecognizer
傳送的事件:
recognizing
:包含中繼轉譯結果的事件訊號。recognized
:包含最終翻譯結果的事件訊號。 這些結果表示成功翻譯嘗試。sessionStopped
:指出轉譯會話結尾之事件的訊號(作業)。canceled
:包含已取消翻譯結果的事件訊號。 這些事件表示因直接取消而取消的翻譯嘗試。 或者,它們表示傳輸或通訊協議失敗。
translationRecognizer.recognizing = (s, e) => {
console.log(`TRANSLATING: Text=${e.result.text}`);
};
translationRecognizer.recognized = (s, e) => {
if (e.result.reason == ResultReason.RecognizedSpeech) {
console.log(`TRANSLATED: Text=${e.result.text}`);
}
else if (e.result.reason == ResultReason.NoMatch) {
console.log("NOMATCH: Speech could not be translated.");
}
};
translationRecognizer.canceled = (s, e) => {
console.log(`CANCELED: Reason=${e.reason}`);
if (e.reason == CancellationReason.Error) {
console.log(`"CANCELED: ErrorCode=${e.errorCode}`);
console.log(`"CANCELED: ErrorDetails=${e.errorDetails}`);
console.log("CANCELED: Did you set the speech resource key and region values?");
}
translationRecognizer.stopContinuousRecognitionAsync();
};
translationRecognizer.sessionStopped = (s, e) => {
console.log("\n Session stopped event.");
translationRecognizer.stopContinuousRecognitionAsync();
};
設定好所有項目後,您可以呼叫 startContinuousRecognitionAsync
:
// Starts continuous recognition. Uses stopContinuousRecognitionAsync() to stop recognition.
translationRecognizer.startContinuousRecognitionAsync();
// Something later can call. Stops recognition.
// translationRecognizer.StopContinuousRecognitionAsync();
選擇來源語言
語音翻譯的常見工作是指定輸入(或來源)語言。 下列範例示範如何將輸入語言變更為義大利文。 在您的程式代碼中,尋找您的 SpeechTranslationConfig
實例,並在其正下方新增下列這一行:
speechTranslationConfig.speechRecognitionLanguage = "it-IT";
屬性 speechRecognitionLanguage
需要語言地區設定格式字串。 請參閱支援的語音翻譯地區設定清單。
選擇一或多個目標語言
語音 SDK 可以平行翻譯成多個目標語言。 可用的目標語言與來源語言清單有些不同。 您可以使用語言代碼來指定目標語言,而不是地區設定。
如需文字目標的語言代碼清單,請參閱 語言支援頁面上的語音翻譯表格。 您也可以在那裡找到翻譯到合成語言的詳細數據。
下列程式代碼會將德文新增為目標語言:
speechTranslationConfig.addTargetLanguage("de");
因為可以進行多個目標語言翻譯,所以您的程式代碼在檢查結果時必須指定目標語言。 下列程式代碼會取得德文的翻譯結果:
translationRecognizer.recognized = function (s, e) {
var str = "\r\n(recognized) Reason: " +
sdk.ResultReason[e.result.reason] +
" Text: " + e.result.text + " Translations:";
var language = "de";
str += " [" + language + "] " + e.result.translations.get(language);
str += "\r\n";
// show str somewhere
};
參考文件 | 套件 (下載) | GitHub 上的其他範例
適用於 Objective-C 的語音 SDK 支援語音翻譯,但我們尚未在此包含指南。 請選取另一種程式設計語言來開始使用並了解概念,或參閱本文開頭連結的 Objective-C 參考和範例。
參考文件 | 套件 (下載) | GitHub 上的其他範例
適用於 Swift 的語音 SDK 支援語音翻譯,但我們尚未在此包含指南。 請選取另一種程式設計語言來開始使用並了解概念,或參閱本文開頭連結的 Swift 參考和範例。
參考文件 | 套件 (PyPi) | GitHub 上的其他範例
在本操作指南中,您將瞭解如何辨識人類語音,並將其翻譯成另一種語言。
如需詳細資訊,請參閱語音翻譯 概觀 :
- 將語音轉譯為文字
- 將語音翻譯成多個目標語言
- 執行直接語音轉換語音翻譯
敏感數據和環境變數
本文中的範例原始碼取決於用來儲存敏感數據的環境變數,例如語音資源的訂用帳戶密鑰和區域。 Python 程式代碼檔案包含從主電腦環境變數指派的兩個值: SPEECH__SUBSCRIPTION__KEY
和 SPEECH__SERVICE__REGION
。 這兩個變數都位於全域範圍,因此可在程式代碼檔案的函式定義中存取:
speech_key, service_region = os.environ['SPEECH__SUBSCRIPTION__KEY'], os.environ['SPEECH__SERVICE__REGION']
如需環境變數的詳細資訊,請參閱 環境變數和應用程式組態。
建立語音翻譯組態
若要使用語音 SDK 呼叫語音服務,您必須建立 SpeechTranslationConfig
實例。 此類別包含訂用帳戶的相關信息,例如密鑰和相關聯的區域、端點、主機或授權令牌。
提示
無論您執行語音辨識、語音合成、翻譯或意圖辨識,您一律都會建立設定。
您可以透過幾種方式初始化 SpeechTranslationConfig
:
- 使用訂用帳戶:傳入密鑰和相關聯的區域。
- 使用端點:傳入語音服務端點。 金鑰或授權令牌是選擇性的。
- 使用主機:傳入主機位址。 金鑰或授權令牌是選擇性的。
- 使用授權令牌:傳入授權令牌和相關聯的區域。
讓我們看看如何使用索引鍵和區域來建立 SpeechTranslationConfig
實例。 取得 Azure 入口網站 中的語音資源金鑰和區域。
from_language, to_language = 'en-US', 'de'
def translate_speech_to_text():
translation_config = speechsdk.translation.SpeechTranslationConfig(
subscription=speech_key, region=service_region)
變更來源語言
語音翻譯的其中一個常見工作是指定輸入(或來源)語言。 下列範例示範如何將輸入語言變更為義大利文。 在您的程式代碼中 SpeechTranslationConfig
,將它指派給 speech_recognition_language
屬性,與實例互動。
def translate_speech_to_text():
translation_config = speechsdk.translation.SpeechTranslationConfig(
subscription=speech_key, region=service_region)
# Source (input) language
from_language = "it-IT"
translation_config.speech_recognition_language = from_language
屬性 speech_recognition_language
需要語言地區設定格式字串。 請參閱支援的語音翻譯地區設定清單。
新增翻譯語言
語音翻譯的另一個常見工作是指定目標翻譯語言。 至少需要一個,但支援多個。 下列代碼段會將法文和德文設定為翻譯語言目標:
def translate_speech_to_text():
translation_config = speechsdk.translation.SpeechTranslationConfig(
subscription=speech_key, region=service_region)
translation_config.speech_recognition_language = "it-IT"
# Translate to languages. See, https://aka.ms/speech/sttt-languages
translation_config.add_target_language("fr")
translation_config.add_target_language("de")
每次呼叫 add_target_language
時,都會指定新的目標翻譯語言。 換句話說,從來源語言辨識語音時,每個目標翻譯都會作為產生的翻譯作業的一部分使用。
初始化翻譯辨識器
建立 SpeechTranslationConfig
實體之後,下一個步驟是初始化 TranslationRecognizer
。 當您初始化 TranslationRecognizer
時,您必須傳遞實例 translation_config
。 組態物件會提供語音服務驗證要求所需的認證。
如果您使用裝置的預設麥克風來辨識語音,以下是 TranslationRecognizer
看起來應該的樣子:
def translate_speech_to_text():
translation_config = speechsdk.translation.SpeechTranslationConfig(
subscription=speech_key, region=service_region)
translation_config.speech_recognition_language = from_language
translation_config.add_target_language(to_language)
translation_recognizer = speechsdk.translation.TranslationRecognizer(
translation_config=translation_config)
如果您想要指定音訊輸入裝置,則需要建立AudioConfig
類別實例,並在初始化 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
索引鍵是目標翻譯語言,而值是翻譯的文字。 辨識的語音可以翻譯,然後以不同的語言合成(語音轉換語音)。
以事件為基礎的合成
物件 TranslationRecognizer
會 Synthesizing
公開事件。 事件會引發數次,並提供從翻譯辨識結果擷取合成音訊的機制。 如果您要翻譯為多種語言,請參閱 手動合成。
藉由指派 實例來指定 voice_name
合成語音,併為事件提供事件處理程式 Synthesizing
以取得音訊。 下列範例會將翻譯的音訊儲存為.wav檔案。
重要
事件型合成只適用於單一翻譯。 請勿 新增多個目標翻譯語言。 此外, voice_name
此值應該與目標翻譯語言相同。 例如, "de"
可以對應至 "de-DE-Hedda"
。
import os
import azure.cognitiveservices.speech as speechsdk
speech_key, service_region = os.environ['SPEECH__SERVICE__KEY'], os.environ['SPEECH__SERVICE__REGION']
from_language, to_language = 'en-US', 'de'
def translate_speech_to_text():
translation_config = speechsdk.translation.SpeechTranslationConfig(
subscription=speech_key, region=service_region)
translation_config.speech_recognition_language = from_language
translation_config.add_target_language(to_language)
# See: https://aka.ms/speech/sdkregion#standard-and-neural-voices
translation_config.voice_name = "de-DE-Hedda"
translation_recognizer = speechsdk.translation.TranslationRecognizer(
translation_config=translation_config)
def synthesis_callback(evt):
size = len(evt.result.audio)
print(f'Audio synthesized: {size} byte(s) {"(COMPLETED)" if size == 0 else ""}')
if size > 0:
file = open('translation.wav', 'wb+')
file.write(evt.result.audio)
file.close()
translation_recognizer.synthesizing.connect(synthesis_callback)
print(f'Say something in "{from_language}" and we\'ll translate into "{to_language}".')
result = translation_recognizer.recognize_once()
print(get_result_text(reason=result.reason, result=result))
def get_result_text(reason, result):
reason_format = {
speechsdk.ResultReason.TranslatedSpeech:
f'Recognized "{from_language}": {result.text}\n' +
f'Translated into "{to_language}"": {result.translations[to_language]}',
speechsdk.ResultReason.RecognizedSpeech: f'Recognized: "{result.text}"',
speechsdk.ResultReason.NoMatch: f'No speech could be recognized: {result.no_match_details}',
speechsdk.ResultReason.Canceled: f'Speech Recognition canceled: {result.cancellation_details}'
}
return reason_format.get(reason, 'Unable to recognize speech')
translate_speech_to_text()
手動合成
您可以使用 translations
字典從翻譯文字合成音訊。 逐一查看每個翻譯並合成它。 當您建立 SpeechSynthesizer
實例時, 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 進行語音翻譯,但我們尚未在此包含指南。 請選取另一種程式設計語言來開始使用並了解概念。
在本操作指南中,您將瞭解如何辨識人類語音,並將其翻譯成另一種語言。
如需詳細資訊,請參閱語音翻譯 概觀 :
- 將語音轉譯為文字
- 將語音翻譯成多個目標語言
- 執行直接語音轉換語音翻譯
必要條件
下載並安裝
請遵循下列步驟,並參閱 語音 CLI 快速入門 ,以了解平臺的其他需求。
執行下列 .NET CLI 命令以安裝語音 CLI:
dotnet tool install --global Microsoft.CognitiveServices.Speech.CLI
執行下列命令來設定您的語音資源金鑰和區域。 以您的語音資源金鑰取代
SUBSCRIPTION-KEY
,而以您的語音資源區域取代REGION
。spx config @key --set SUBSCRIPTION-KEY spx config @region --set REGION
設定來源和目標語言
此命令會呼叫語音 CLI,從麥克風將語音從義大利文翻譯成法文:
spx translate --microphone --source it-IT --target fr