Ottema STT PT QuartzNet15x5 CTC Small (v2)

Modelo de Reconhecimento Automático de Fala (ASR) para Português Brasileiro, baseado na arquitetura QuartzNet15x5 do framework NVIDIA NeMo.

Este modelo é um fine-tuning do modelo base ottema/stt_pt_quartznet15x5_ctc_small, treinado com o dataset CORAA v1.1 (~253 horas de áudio).

Performance

Métrica Valor Dataset
WER 29.47% Common Voice PT (test)
CER 10.66% Common Voice PT (test)
WER 36.63% CORAA v1.1 (validation)
Horas de treino ~253h CORAA v1.1
Vocabulário 36 caracteres -

Benchmark de RTF (CPU x86_64, 12 cores)

Batch Size RTF Velocidade
1 0.033 ~30x tempo real
4 0.018 ~55x tempo real
8 0.021 ~48x tempo real
16 0.025 ~40x tempo real

RTF < 1 significa mais rápido que tempo real. O modelo é ~55x mais rápido que tempo real em CPU com batch_size=4.

Comparativo com modelos similares

Modelo WER (CV PT) WER (CORAA) Dataset de Treino
ottema/stt_pt_quartznet15x5_ctc_small (este) 29.47% 36.63% CORAA v1.1 (253h)
dominguesm/stt_pt_quartznet15x5_ctc_small 49.17% - Common Voice 9 (26h)

Este modelo supera em ~12.5 pontos percentuais de WER o único concorrente direto na mesma arquitetura, graças ao dataset CORAA que é ~10x maior e mais diversificado.

Como usar

1. Com NVIDIA NeMo (Python)

import nemo.collections.asr as nemo_asr

# Carrega o modelo
model = nemo_asr.models.EncDecCTCModel.from_pretrained(
    model_name="ottema/stt_pt_quartznet15x5_ctc_small"
)

# Transcreve um arquivo de áudio
audio_file = "path/to/audio.wav"
transcription = model.transcribe(audio=[audio_file])
print(transcription[0])

2. Usando o arquivo .nemo baixado

import nemo.collections.asr as nemo_asr

# Restaura o modelo a partir do arquivo local
model = nemo_asr.models.EncDecCTCModel.restore_from(
    restore_path="stt_pt_quartznet15x5_ctc_small_v2.nemo"
)

# Transcreve
transcription = model.transcribe(audio=["meu_audio.wav"])
print(transcription[0])

3. Pipeline avançado (com confidence)

# Habilita confidence scores
model.cfg.decoding.confidence_cfg.preserve_word_confidence = True

hyps = model.transcribe(audio=["audio.wav"], return_hypotheses=True)
hyp = hyps[0]
print(f"Texto: {hyp.text}")
print(f"Score: {hyp.score}")

3. Com ONNX (Inferência Otimizada)

O modelo também está disponível em formato ONNX (stt_pt_quartznet15x5_ctc_small.onnx). Nota: O modelo ONNX exportado contém apenas o Encoder + Decoder. A extração de features (espectrograma de 64 dimensões) deve ser feita separadamente.

import onnxruntime as ort
import numpy as np
import nemo.collections.asr as nemo_asr
import soundfile as sf

# Carrega modelo ONNX
session = ort.InferenceSession("stt_pt_quartznet15x5_ctc_small.onnx")

# Carrega modelo NeMo apenas para o preprocessor
nemo_model = nemo_asr.models.EncDecCTCModel.from_pretrained("ottema/stt_pt_quartznet15x5_ctc_small")
nemo_model.eval()

# Prepara áudio
waveform, sr = sf.read("audio.wav")
audio_tensor = torch.tensor(waveform).unsqueeze(0)

# Extrai features
with torch.no_grad():
    processed, _ = nemo_model.preprocessor(input_signal=audio_tensor, length=torch.tensor([len(waveform)]))
    spectrogram = processed.numpy()

# Inferência
outputs = session.run(["logprobs"], {"audio_signal": spectrogram})
logits = outputs[0]

# Decodificação Greedy
vocab = nemo_model.decoder.vocabulary
ids = np.argmax(logits[0], axis=-1)
text = []
prev = -1
for idx in ids:
    if idx != prev and idx < len(vocab):
        text.append(vocab[idx])
    prev = idx
print("".join(text))

Detalhes do Treinamento

Parâmetro Valor
Arquitetura QuartzNet15x5 (Separable Convolutions + CTC)
Framework NVIDIA NeMo 24.07
Dataset CORAA v1.1 (filtrado)
Batch Size 16
Learning Rate 0.001 (Cosine Annealing)
Epochs 50 (Early Stopping)
Melhor Epoch 32
Decoding Greedy Batch

Limitações

  • Vocabulário limitado a 36 caracteres: O modelo não suporta os caracteres â, ô, ú, à. Estes foram removidos do dataset de treino para compatibilidade com o vocabulário do modelo base. Roadmap: expandir o vocabulário para cobrir todos os caracteres acentuados do PT-BR.
  • Performance pode variar dependendo da qualidade do áudio e do domínio (ex: telefonia vs estúdio).

Roadmap

  • Expandir vocabulário para incluir â, ô, ú, à
  • Integrar KenLM para beam search decoding
  • Adicionar VAD + chunking para áudios longos
  • Pós-processamento com pontuação e capitalização
  • Benchmark de RTF em CPU (x86_64) - RTF 0.018 (~55x tempo real)
  • Export para ONNX (Encoder+Decoder) para deploy otimizado
  • Benchmark de RTF em CPU ARM (Raspberry Pi, etc)

Licença

Apache 2.0

Citação

@misc{coraa2021,
    title={CORAA: a large corpus of spontaneous and prepared speech manually validated for speech recognition in Brazilian Portuguese},
    author={Arnaldo Candido Junior and Edresson Casanova and Anderson Soares and Frederico Santos de Oliveira and Lucas Oliveira and Ricardo Corso Fernandes Junior and Daniel Peixoto Pinto da Silva and Fernando Gorgulho Fayet and Bruno Baldissera Carlotto and Lucas Rafael Stefanel Gris and Sandra Maria Aluísio},
    year={2021},
    eprint={2110.15731},
    archivePrefix={arXiv},
    primaryClass={cs.CL}
}
Downloads last month
20
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Collection including ottema/stt_pt_quartznet15x5_ctc_small

Paper for ottema/stt_pt_quartznet15x5_ctc_small

Evaluation results