Desafio 36: Tradução de Fala
Tempo Estimado
45 min | Custo: $2-5 (estimado) | Domínio: Implementar Soluções de NLP (15-20%)
Habilidades do exame abordadas
- Traduzir speech-to-text em múltiplos idiomas
- Implementar tradução speech-to-speech
- Configurar sessões de tradução contínua
Visão Geral
O Azure Speech Translation combina reconhecimento de fala e tradução de texto em um único pipeline:
Audio Input → Speech Recognition → Translation → Text/Speech Output
Principais diferenças em relação ao uso separado de STT + Translator:
- Chamada de API única — menor latência
- Streaming — resultados parciais em tempo real
- Speech-to-speech — saída de áudio traduzido diretamente
- Suporta 70+ idiomas para tradução speech-to-text
Classes: SpeechTranslationConfig, TranslationRecognizer
Pré-requisitos
- Assinatura do Azure
- Recurso Azure Speech
- Python 3.9+ ou .NET 8
- Pacote:
azure-cognitiveservices-speech(v1.38+)
Implementação
Tarefa 1: Tradução de Fala em Disparo Único
- Python SDK
- C# SDK
import os
import azure.cognitiveservices.speech as speechsdk
# Configure translation
translation_config = speechsdk.translation.SpeechTranslationConfig(
subscription=os.environ["AZURE_SPEECH_KEY"],
region=os.environ["AZURE_SPEECH_REGION"]
)
# Set source language (speech input)
translation_config.speech_recognition_language = "en-US"
# Add target languages (text output)
translation_config.add_target_language("es")
translation_config.add_target_language("fr")
translation_config.add_target_language("de")
translation_config.add_target_language("ja")
# Configure audio input from file
audio_config = speechsdk.audio.AudioConfig(filename="english-speech.wav")
recognizer = speechsdk.translation.TranslationRecognizer(
translation_config=translation_config,
audio_config=audio_config
)
# Single utterance translation
print("Translating speech...")
result = recognizer.recognize_once()
if result.reason == speechsdk.ResultReason.TranslatedSpeech:
print(f"Recognized (en): {result.text}")
print(f"\nTranslations:")
for lang, translation in result.translations.items():
print(f" [{lang}] {translation}")
elif result.reason == speechsdk.ResultReason.NoMatch:
print("No speech recognized")
elif result.reason == speechsdk.ResultReason.Canceled:
cancellation = result.cancellation_details
print(f"Canceled: {cancellation.reason} - {cancellation.error_details}")
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Translation;
var translationConfig = SpeechTranslationConfig.FromSubscription(
Environment.GetEnvironmentVariable("AZURE_SPEECH_KEY"),
Environment.GetEnvironmentVariable("AZURE_SPEECH_REGION"));
translationConfig.SpeechRecognitionLanguage = "en-US";
translationConfig.AddTargetLanguage("es");
translationConfig.AddTargetLanguage("fr");
translationConfig.AddTargetLanguage("de");
using var audioConfig = AudioConfig.FromWavFileInput("english-speech.wav");
using var recognizer = new TranslationRecognizer(translationConfig, audioConfig);
var result = await recognizer.RecognizeOnceAsync();
if (result.Reason == ResultReason.TranslatedSpeech)
{
Console.WriteLine($"Recognized: {result.Text}");
foreach (var (lang, text) in result.Translations)
Console.WriteLine($" [{lang}] {text}");
}
Tarefa 2: Tradução Contínua de Fala
- Python SDK
import threading
translation_config = speechsdk.translation.SpeechTranslationConfig(
subscription=os.environ["AZURE_SPEECH_KEY"],
region=os.environ["AZURE_SPEECH_REGION"]
)
translation_config.speech_recognition_language = "en-US"
translation_config.add_target_language("es")
translation_config.add_target_language("fr")
audio_config = speechsdk.audio.AudioConfig(filename="conversation.wav")
recognizer = speechsdk.translation.TranslationRecognizer(
translation_config=translation_config,
audio_config=audio_config
)
translations_log = []
done = threading.Event()
def recognizing_handler(evt):
"""Partial/interim results (streaming)"""
print(f" [Partial] {evt.result.text}")
def recognized_handler(evt):
"""Final results"""
if evt.result.reason == speechsdk.ResultReason.TranslatedSpeech:
print(f"\n[Final] EN: {evt.result.text}")
for lang, text in evt.result.translations.items():
print(f" {lang.upper()}: {text}")
translations_log.append({
"source": evt.result.text,
"translations": dict(evt.result.translations)
})
def canceled_handler(evt):
print(f"Canceled: {evt.cancellation_details.reason}")
done.set()
def stopped_handler(evt):
done.set()
# Wire up events
recognizer.recognizing.connect(recognizing_handler)
recognizer.recognized.connect(recognized_handler)
recognizer.canceled.connect(canceled_handler)
recognizer.session_stopped.connect(stopped_handler)
# Start continuous translation
print("Starting continuous translation...\n")
recognizer.start_continuous_recognition()
done.wait()
recognizer.stop_continuous_recognition()
print(f"\n{'='*50}")
print(f"Translated {len(translations_log)} segments")
Tarefa 3: Tradução Speech-to-Speech (com síntese de voz)
- Python SDK
# Configure speech-to-speech: translate and synthesize output
translation_config = speechsdk.translation.SpeechTranslationConfig(
subscription=os.environ["AZURE_SPEECH_KEY"],
region=os.environ["AZURE_SPEECH_REGION"]
)
translation_config.speech_recognition_language = "en-US"
translation_config.add_target_language("es")
# Set voice for synthesized translation output
translation_config.voice_name = "es-ES-ElviraNeural"
audio_config = speechsdk.audio.AudioConfig(filename="english-speech.wav")
recognizer = speechsdk.translation.TranslationRecognizer(
translation_config=translation_config,
audio_config=audio_config
)
# Handle synthesized audio
def synthesis_handler(evt):
"""Handle translated speech audio output"""
if evt.result.reason == speechsdk.ResultReason.SynthesizingAudio:
audio_data = evt.result.audio
print(f" Synthesized audio: {len(audio_data)} bytes")
# Save to file
with open("translated-speech-es.wav", "ab") as f:
f.write(audio_data)
recognizer.synthesizing.connect(synthesis_handler)
# Translate and synthesize
result = recognizer.recognize_once()
if result.reason == speechsdk.ResultReason.TranslatedSpeech:
print(f"Source (EN): {result.text}")
print(f"Target (ES): {result.translations['es']}")
print(f"Audio output saved to: translated-speech-es.wav")
Saída Esperada
Translating speech...
Recognized (en): The quarterly results exceeded expectations with a fifteen percent increase.
Translations:
[es] Los resultados trimestrales superaron las expectativas con un aumento del quince por ciento.
[fr] Les résultats trimestriels ont dépassé les attentes avec une augmentation de quinze pour cent.
[de] Die Quartalsergebnisse übertrafen die Erwartungen mit einem Anstieg von fünfzehn Prozent.
[ja] 四半期の結果は15パーセントの増加で期待を上回りました。
Starting continuous translation...
[Partial] The quarterly
[Partial] The quarterly results
[Final] EN: The quarterly results exceeded expectations.
ES: Los resultados trimestrales superaron las expectativas.
FR: Les résultats trimestriels ont dépassé les attentes.
Translated 3 segments
Quebra & conserta
| Cenário | Sintoma | Causa Raiz | Correção |
|---|---|---|---|
| Nenhuma tradução retornada | Dicionário de traduções vazio | Idioma de destino não adicionado à configuração | Chame add_target_language() antes de criar o reconhecedor |
| Idioma de origem errado | Reconhecimento ilegível | Idioma de origem incompatível | Defina o speech_recognition_language correto |
| Síntese não funciona | Sem saída de áudio | Nome da voz não definido ou idioma incompatível | Defina voice_name correspondendo ao idioma de destino |
| Resultados parciais ausentes | Sem feedback intermediário | Evento recognizing não conectado | Conecte ao evento recognizing para resultados em streaming |
| Erro de código de idioma | Idioma inválido | Usando formato de código errado | Use códigos BCP-47: "es" não "spanish", "zh-Hans" não "zh" |
Verificação de Conhecimento
1. Qual classe é usada para tradução de fala em vez de SpeechConfig?
2. Como você especifica múltiplos idiomas de destino para tradução de fala?
3. Qual é a diferença entre os eventos 'recognizing' e 'recognized'?
4. Como você habilita a tradução speech-to-speech (saída sintetizada)?
5. Qual vantagem a tradução de fala tem sobre o uso separado de STT + Translator API?
Limpeza
az group delete --name rg-ai102-speech --yes --no-wait