Instructions to use ottema/stt_pt_quartznet15x5_ctc_small with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- NeMo
How to use ottema/stt_pt_quartznet15x5_ctc_small with NeMo:
import nemo.collections.asr as nemo_asr asr_model = nemo_asr.models.ASRModel.from_pretrained("ottema/stt_pt_quartznet15x5_ctc_small") transcriptions = asr_model.transcribe(["file.wav"]) - Notebooks
- Google Colab
- Kaggle
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
- 21
Collection including ottema/stt_pt_quartznet15x5_ctc_small
Paper for ottema/stt_pt_quartznet15x5_ctc_small
Evaluation results
- WER on Common Voice PT-BRtest set self-reported29.470
- CER on Common Voice PT-BRtest set self-reported10.660
- WER on CORAA v1.1validation set self-reported36.630