Phase 06: Speech & Audio

Text-to-Speech (TTS) De Tacotron para F5 e Kokoro

A ASR inverte fala para texto; TTS inverte texto para fala. A pilha 2026 é de três partes: texto → tokens, tokens → mel, mel → forma de onda. Cada parte tem um modelo padrão que se encaixa em um laptop.

Type: Build

Languages: Python

Prerequisites: Phase 6 · 02 (Spectrograms & Mel), Phase 5 · 09 (Seq2Seq), Phase 7 · 05 (Full Transformer)

Time: ~75 minutes

O problema

Você tem uma corda: "Por favor, lembre-me de regar as plantas às 18h". Você precisa de um vídeo de áudio de 3 segundos que soa natural, tem prosodia correta (pausas, estresse), pronuncia "plantes" com a vogais certas e corre em menos de 300 ms em uma CPU para um assistente de voz ao vivo. Você também precisa trocar vozes, lidar com entradas com código-switched ("lembrem-me às 18h, daijoubu?"), e não se envergonhar em nomes.

Os oleodutos modernos TTS parecem assim:

  1. Text frontend.Normalize texto (datas, números, e-mails), converta em fonemas ou tokens de subpalavras, prevê recursos de prosodia.
  2. Acoustic model.Texto → mel espectrograma. Tacotron 2 (2017), FastSpeech 2 (2020), VITS (2021), F5-TTS (2024), Kokoro (2024).
  3. Vocoder.Mel → forma de onda. WaveNet (2016), WaveRNN, HiFi-GAN (2020), BigVGAN (2022), vocoders de codec neural em 2024+.

Em 2026, o vocalista acústico + vocal divide-se com modelos de difusão de ponta a ponta e de correspondência de fluxo.

O conceito

!Tacotron, FastSpeech, VITS, F5/Kokoro side-by-side

Tacotron 2 (2017).Seq2seq: car-embedding → BiLSTM encoder → atenção localização sensível → autoregressivo LSTM decoder emite molduras mel. Lento (AR), vacilante em texto longo. Ainda citado como uma linha de base.

FastSpeech 2 (2020).Não autoregressivo. Preditor de duração emitir quantas molduras mel cada fonema recebe. 1 pass, 10x mais rápido que Tacotron. Perde alguma naturalidade (alinhamento monótono) mas navega em todos os lugares.

VITS (2021).Juntamente treina codificador + duração baseada em fluxo + vocoder de extremo a extremo HiFi-GAN com inferência variável. Alta qualidade, modelo único. TTS de código aberto dominante 20222024. Variantes: YourTTS (multiplicador zero-shot), XTTS v2 (2024, Coqui).

F5-TTS (2024).Transformador de difusão sobre a correspondência de fluxo. Prósodia natural, clonagem de voz de tiro zero com 5 segundos de áudio de referência.

Kokoro (2024).Pequeno (82M), executável pela CPU, melhor TTS de inglês para uso em tempo real.

OpenAI TTS-1-HD, ElevenLabs v2.5, Google Chirp-3.ElevenLabs v2.5 emoção tags ("[suspirado]", "[risos]") e vozes de personagens dominam a produção de livros de áudio em 2026.

Evolução do vocoder

EraVocoderLatencyQuality
2016WaveNetoffline onlySOTA at release
2018WaveRNN~realtimegood
2020HiFi-GAN100× realtimenear-human
2022BigVGAN50× realtimegeneralizes across speakers/langs
2024SNAC, DAC (neural codecs)integrated with AR modelsdiscrete tokens, bit-efficient

Em 2026, a maioria dos modelos "TTS" são end-to-end de texto para forma de onda; o espectrograma mel é uma representação interna.

Avaliação

  • MOS (Mean Opinion Score).Escala de 1 a 5, de fontes públicas, ainda o padrão ouro, dolorosamente lento.
  • CMOS (Comparative MOS).Preferência A versus B. Intervalos de confiança mais estreitos por anotação.
  • UTMOS, DNSMOS.Predutores neurais de MOS sem referência, usados para rankings.
  • CER (Character Error Rate) via ASR.Execute a saída TTS através do Whisper, computa o CER contra o texto de entrada.
  • SECS (Speaker Embedding Cosine Similarity).Qualidade de clonagem de voz.

Números 2026 da limpeza de ensaio LibriTTS:

ModelUTMOSCER (via Whisper)Size
Ground truth4.081.2%—
F5-TTS3.952.1%335M
XTTS v23.813.5%470M
VITS3.623.1%25M
Kokoro v0.193.871.8%82M
Parler-TTS Large3.762.8%2.3B

Construí-lo

Passo 1: fonemizar a entrada

pythonfrom phonemizer import phonemize
ph = phonemize("Hello world", language="en-us", backend="espeak")
# 'həloʊ wɜːld'

Os fonemas são a ponte universal. Evite alimentar texto bruto a qualquer coisa abaixo do nível de qualidade do VITS.

Passo 2: executar Kokoro (2026 CPU padrão)

pythonfrom kokoro import KPipeline
tts = KPipeline(lang_code="a")  # "a" = American English
audio, sr = tts("Please remind me to water the plants at 6 pm.", voice="af_bella")
# audio: float32 tensor, sr=24000

Funciona offline, único arquivo, 82M params.

Passo 3: executar F5-TTS com clonagem de voz

pythonfrom f5_tts.api import F5TTS
tts = F5TTS()
wav = tts.infer(
    ref_file="my_voice_5s.wav",
    ref_text="The quick brown fox jumps over the lazy dog.",
    gen_text="Please remind me to water the plants.",
)

Passe um clipe de referência de 5 segundos + sua transcrição; F5 clona prosodia e timbre.

Passo 4: Vocoder HiFi-GAN a partir do zero

Muito grande para caber num guião de tutorial, mas a forma é:

pythonclass HiFiGAN(nn.Module):
    def __init__(self, mel_channels=80, upsample_rates=[8, 8, 2, 2]):
        super().__init__()
        # 4 upsample blocks, total 256x to go from mel-rate to audio-rate
        ...
    def forward(self, mel):
        return self.blocks(mel)  # -> waveform

Formação: adversária (discriminador em janelas curtas) + perda de reconstrução do espectrograma mel + perda de correspondência de características.hifi-ganrepo ou nvidia-neMo.

Passo 5: o conjunto completo do gasoduto (pseudo-código)

pythontext = "Please remind me at 6 pm."
phones = phonemize(text)
mel = acoustic_model(phones, speaker=alice)      # [T, 80]
wav = vocoder(mel)                                # [T * 256]
soundfile.write("out.wav", wav, 24000)

Usá-lo

A pilha de 2026:

SituationPick
Real-time English voice assistantKokoro (CPU) or XTTS v2 (GPU)
Voice cloning from 5 s referenceF5-TTS
Commercial character voicesElevenLabs v2.5
Audiobook narrationElevenLabs v2.5 or XTTS v2 + fine-tune
Low-resource languageTrain VITS on 5–20 h target-lang data
Expressive / emotion tagsElevenLabs v2.5 or StyleTTS 2 fine-tune

Líder de código aberto a partir de 2026: F5-TTS for quality, Kokoro for efficiencyNão busques o Tacotron a menos que seja um historiador.

Encurralagens

  • No text normalizer."Dr. Smith" diz "Doutor" ou "Drive"? "2026" diz "vinte e vinte e seis" ou "dois zero dois seis"?
  • OOV proper nouns."Ghumare" → "ghyu-mair"? Enviar um modelo de fallback grapheme-to-phoneme para tokens desconhecidos.
  • Clipping.A saída do vocoder raramente é clipe, mas a descoincidência de escalação mel na inferência pode ultrapassar ±1,0.np.clip(wav, -1, 1)- Não .
  • Sample-rate mismatch.Kokoro produz 24 kHz; o seu pipeline aguardando 16 kHz → re-sampulação ou obter aliasing.

Envia-o

Salva comooutputs/skill-tts-designer.md. Desenhar um canal TTS para um determinado alvo de voz, latência e linguagem.

Exercícios

  1. Easy.Corra .code/main.pyConstrui um dicionário fonético a partir de um vocabulário de brinquedo, estima a duração por fonema e imprime um cronograma falso de "mel".
  2. Medium.Instale Kokoro, sintetize a mesma frase com voz.af_bellaE ...am_adamComparar a duração do áudio e a qualidade subjetiva.
  3. Hard.Grave um clip de referência de 5 segundos de si mesmo, use o F5-TTS para cloná-lo, informe o SECS entre a referência e a saída clonada.

Termos-chave

TermWhat people sayWhat it actually means
PhonemeSound unitAbstract sound class; 39 in English (ARPABet).
Duration predictorHow long each phoneme lastsNon-AR model output; integer frames per phoneme.
VocoderMel → waveformNeural net mapping mel-spec to raw samples.
HiFi-GANStandard vocoderGAN-based; dominant 2020–2024.
MOSSubjective quality1–5 mean opinion score from human raters.
SECSVoice-clone metricCosine similarity between target and output speaker embedding.
F5-TTS2024 open-source SOTAFlow-matching diffusion; zero-shot cloning.
KokoroCPU English leader82M-param model, Apache 2.0.

Mais leitura

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.