CoolFace
Modelpublic

ottema/stt_pt_quartznet15x5_ctc_small

sourceHugging Faceapache-2.0updated 4mo agoView on Hugging Face
1likes22downloads
Model Card

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étricaValorDataset
WER29.47%Common Voice PT (test)
CER10.66%Common Voice PT (test)
WER36.63%CORAA v1.1 (validation)
Horas de treino~253hCORAA v1.1
Vocabulário36 caracteres-

Benchmark de RTF (CPU x86_64, 12 cores)

Batch SizeRTFVelocidade
10.033~30x tempo real
40.018~55x tempo real
80.021~48x tempo real
160.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

ModeloWER (CV PT)WER (CORAA)Dataset de Treino
ottema/stt_pt_quartznet15x5_ctc_small (este)29.47%36.63%CORAA v1.1 (253h)
dominguesm/sttptquartznet15x5ctcsmall49.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)

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

python
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)

python
# 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.

python
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âmetroValor
ArquiteturaQuartzNet15x5 (Separable Convolutions + CTC)
FrameworkNVIDIA NeMo 24.07
DatasetCORAA v1.1 (filtrado)
Batch Size16
Learning Rate0.001 (Cosine Annealing)
Epochs50 (Early Stopping)
Melhor Epoch32
DecodingGreedy 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
  • [x] Benchmark de RTF em CPU (x86_64) - RTF 0.018 (~55x tempo real)
  • [x] Export para ONNX (Encoder+Decoder) para deploy otimizado
  • [ ] Benchmark de RTF em CPU ARM (Raspberry Pi, etc)

Licença

Apache 2.0

Citação

bibtex
@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}
}