Configuration de l'environnement et mise en œuvre
L'implémentation de la reconnaissance vocale sur des dispositifs aux ressources limitées nécessite une optimisation rigoureuse. SenseVoice-Small, dans son format ONNX quantifié, représente une solution idéale pour l'Edge Computing. Voici comment préparer votre environnement de développement.
Prérequis système :
- Python 3.8 ou version ultérieure.
- 2 Go de RAM minimum pour l'inférence.
- Matériel compatible ONNX Runtime (CPU ou GPU).
Installation des dépendances nécessaires via pip :
pip install modelscope onnxruntime-gpu gradio torch torchaudio soundfile librosa
Initialisation rapide du moteur d'inférence avec ModelScope :
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
# Initialisation du pipeline de reconnaissance automatique de la parole (ASR)
moteur_asr = pipeline(
task=Tasks.auto_speech_recognition,
model='damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-onnx'
)
Principes fondamentaux de SenseVoice-Small
SenseVoice-Small repose sur une architecture non-autorégressive de bout en boutt, permettant une latence extrêmement faible sans sacrifier la précision de la transcription.
Points clés du modèle :
- Polyglotte : Supporte plus de 50 langues grâce à un entraînement sur 400 000 heures de données.
- Analyse contextuelle : Capable de détecter les émotions et les événements sonores (musique, rires, applaudissements).
- Performance brute : Traitement d'un segment de 10 secondes en environ 70ms.
- Optimisation par quantification : La conversion du modèle de FP32 (virgule flottante 32 bits) vers INT8 (entier 8 bits) réduit la taille du modèle de 75 % et accélère l'exécution de manière significative.
Implémentation technique étape par étape
1. Gestion du chargement du modèle
Nous encapsulons le chargement dans une structure robuste pour gérer les éventuelles erreurs d'initialisation sur le matériel cible.
def configurer_moteur():
"""Charge le modèle ONNX de reconnaissance vocale."""
try:
instance_pipeline = pipeline(
task=Tasks.auto_speech_recognition,
model='damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-onnx'
)
print("Moteur SenseVoice chargé avec succès.")
return instance_pipeline
except Exception as erreur:
print(f"Erreur lors de l'initialisation : {erreur}")
return None
recon_model = configurer_moteur()
2. Prétraitement et décodage audio
Le traitement audio implique la lecture du fichier et sa normalisation avant l'envoi au moteur d'inférence.
import numpy as np
import soundfile as sf
def transcrire_audio(chemin_fichier):
"""Effectue la transcription d'un fichier audio donné."""
if recon_model is None:
return "Erreur : Modèle non disponible."
try:
# Chargement et conversion mono si nécessaire
signal, frequence = sf.read(chemin_fichier)
if signal.ndim > 1:
signal = np.mean(signal, axis=1)
# Inférence
prediction = recon_model(audio_in=chemin_fichier)
return prediction['text']
except Exception as e:
return f"Erreur de traitement : {str(e)}"
3. Interface de démonstration avec Gradio
Pour tester le modèle localement, une interface Web simple permet de téléverser des fichiers ou d'utiliser le microphone.
import gradio as gr
def lancer_ui():
"""Déploie une interface utilisateur locale."""
with gr.Blocks(title="SenseVoice ASR") as interface:
gr.Markdown("## Transcription Vocale Haute Performance")
with gr.Row():
with gr.Column():
entree_audio = gr.Audio(sources=["upload", "microphone"], type="filepath")
bouton_run = gr.Button("Lancer la reconnaissance", variant="primary")
with gr.Column():
resultat_texte = gr.Textbox(label="Texte transcrit", lines=6)
bouton_run.click(
fn=transcrire_audio,
inputs=entree_audio,
outputs=resultat_texte
)
interface.launch(server_name="0.0.0.0", server_port=7860)
if __name__ == "__main__":
lancer_ui()
Optimisation avancée pour l'Edge
Pour les environnements très restreints (type Raspberry Pi), il est conseillé d'ajuster explicitement la configuration d'exécution ONNX.
def creer_pipeline_optimise():
"""Exemple de configuration ciblée pour CPU avec quantification."""
parametres = {
'model': {
'type': 'onnx',
'quantized': True,
'device': 'cpu'
},
'preprocessor': {
'sample_rate': 16000,
'feature_dim': 80
}
}
return pipeline(
task=Tasks.auto_speech_recognition,
model='damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-onnx',
**parametres
)
Gestion des fichiers volumineux
Pour traiter des répertories entiers de données audio, une approche par lot est préférable afin de libérer la mémoire régulièrement.
import os
def traitement_par_lot(dossier_source, fichier_sortie="export.txt"):
"""Analyse tous les fichiers audio d'un dossier."""
fichiers = [f for f in os.listdir(dossier_source) if f.endswith(('.wav', '.mp3'))]
journal = []
for nom_fichier in fichiers:
chemin_complet = os.path.join(dossier_source, nom_fichier)
texte = transcrire_audio(chemin_complet)
journal.append(f"{nom_fichier} | {texte}")
with open(fichier_sortie, 'w', encoding='utf-8') as f:
f.write('\n'.join(journal))
return f"Traité {len(fichiers)} fichiers."
Synthèse technique
Le déploiement de SenseVoice-Small via ONNX offre un compromis optimal entre légèreté et efficacité. Sa capacité à fonctionner sur CPU tout en fournissant des résultats quasi instantanés en fait un choix de premier ordre pour les systèmes embarqués et les applications décentralisées. Les points de vigilance restent la qualité initiale de la capture audio et la segmentation des fichiers très longs (supérieurs à 30 secondes) pour maximiser la précision temporelle.