Pular para o conteúdo principal

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

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}")

Tarefa 2: Tradução Contínua de Fala

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)

# 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árioSintomaCausa RaizCorreção
Nenhuma tradução retornadaDicionário de traduções vazioIdioma de destino não adicionado à configuraçãoChame add_target_language() antes de criar o reconhecedor
Idioma de origem erradoReconhecimento ilegívelIdioma de origem incompatívelDefina o speech_recognition_language correto
Síntese não funcionaSem saída de áudioNome da voz não definido ou idioma incompatívelDefina voice_name correspondendo ao idioma de destino
Resultados parciais ausentesSem feedback intermediárioEvento recognizing não conectadoConecte ao evento recognizing para resultados em streaming
Erro de código de idiomaIdioma inválidoUsando formato de código erradoUse 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

Saiba Mais