Bibliothèque de synthèse vocale facile à utiliser et à faible latence pour les applications en temps réel
RealtimeSTT écoute le microphone et transcrit la voix en texte.
Astuce : découvrez Linguflex , le projet original dont RealtimeSTT est issu. Il vous permet de contrôler votre environnement en parlant et constitue l'un des assistants open source les plus performants et les plus sophistiqués actuellement disponibles.
C'est idéal pour :
Dernière version : v0.3.7
Voir l'historique des versions.
Astuce : Puisque nous utilisons maintenant le module
multiprocessing
, assurez-vous d'inclure la protectionif __name__ == '__main__':
dans votre code pour éviter tout comportement inattendu, en particulier sur des plates-formes comme Windows. Pour une explication détaillée de pourquoi cela est important, visitez la documentation officielle de Python surmultiprocessing
.
from RealtimeSTT import AudioToTextRecorder
import pyautogui
def process_text ( text ):
print ( text )
if __name__ == '__main__' :
print ( "Wait until it says 'speak now'" )
recorder = AudioToTextRecorder ()
while True :
recorder . text ( process_text )
from RealtimeSTT import AudioToTextRecorder
import pyautogui
def process_text ( text ):
pyautogui . typewrite ( text + " " )
if __name__ == '__main__' :
print ( "Wait until it says 'speak now'" )
recorder = AudioToTextRecorder ()
while True :
recorder . text ( process_text )
Tapera tout ce qui est dit dans la zone de texte sélectionnée
Astuce : consultez RealtimeTTS, l'homologue de sortie de cette bibliothèque, pour les capacités de synthèse texte-voix. Ensemble, ils forment un puissant wrapper audio en temps réel autour de grands modèles de langage.
Cette bibliothèque utilise :
Ces composants représentent la « norme industrielle » pour les applications de pointe, fournissant la base la plus moderne et la plus efficace pour créer des solutions haut de gamme.
pip install RealtimeSTT
Cela installera toutes les dépendances nécessaires, y compris une version de PyTorch prenant en charge uniquement le processeur .
Bien qu'il soit possible d'exécuter RealtimeSTT avec une installation CPU uniquement (utilisez un petit modèle comme "tiny" ou "base" dans ce cas), vous obtiendrez une bien meilleure expérience en utilisant :
Pour mettre à niveau votre installation PyTorch afin d'activer la prise en charge GPU avec CUDA, suivez ces instructions en fonction de votre version spécifique de CUDA. Ceci est utile si vous souhaitez améliorer les performances de RealtimeSTT avec les capacités CUDA.
Pour mettre à jour PyTorch et Torchaudio afin qu'ils prennent en charge CUDA 11.8, utilisez les commandes suivantes :
pip install torch==2.3.1+cu118 torchaudio==2.3.1 --index-url https://download.pytorch.org/whl/cu118
Pour mettre à jour PyTorch et Torchaudio afin de prendre en charge CUDA 12.X, exécutez ce qui suit :
pip install torch==2.3.1+cu121 torchaudio==2.3.1 --index-url https://download.pytorch.org/whl/cu121
Remplacez 2.3.1
par la version de PyTorch qui correspond à votre système et à vos exigences.
Remarque : Pour vérifier si votre GPU NVIDIA prend en charge CUDA, visitez la liste officielle des GPU CUDA.
Si vous n'avez jamais utilisé de modèles CUDA auparavant, certaines étapes supplémentaires peuvent être nécessaires une fois avant l'installation. Ces étapes préparent le système à la prise en charge de CUDA et à l'installation de l'installation optimisée pour le GPU . Ceci est recommandé pour ceux qui ont besoin de meilleures performances et disposent d’un GPU NVIDIA compatible. Pour utiliser RealtimeSTT avec la prise en charge GPU via CUDA, veuillez également suivre ces étapes :
Installez la boîte à outils NVIDIA CUDA :
Installez NVIDIA cuDNN :
Installez ffmpeg :
Remarque : l'installation de ffmpeg n'est peut-être pas nécessaire pour faire fonctionner RealtimeSTT *merci à jgilbert2017 de l'avoir signalé
Vous pouvez télécharger un programme d'installation pour votre système d'exploitation à partir du site Web ffmpeg.
Ou utilisez un gestionnaire de paquets :
Sur Ubuntu ou Debian :
sudo apt update && sudo apt install ffmpeg
Sur Arch Linux :
sudo pacman -S ffmpeg
Sur MacOS utilisant Homebrew (https://brew.sh/) :
brew install ffmpeg
Sous Windows en utilisant la documentation officielle de Winget :
winget install Gyan.FFmpeg
Sous Windows avec Chocolatey (https://chocolatey.org/) :
choco install ffmpeg
Sous Windows avec Scoop (https://scoop.sh/) :
scoop install ffmpeg
Utilisation de base :
Le démarrage et l'arrêt de l'enregistrement sont déclenchés manuellement.
recorder . start ()
recorder . stop ()
print ( recorder . text ())
from RealtimeSTT import AudioToTextRecorder
if __name__ == '__main__' :
recorder = AudioToTextRecorder ()
recorder . start ()
input ( "Press Enter to stop recording..." )
recorder . stop ()
print ( "Transcription: " , recorder . text ())
Enregistrement basé sur la détection d'activité vocale.
with AudioToTextRecorder () as recorder :
print ( recorder . text ())
from RealtimeSTT import AudioToTextRecorder
if __name__ == '__main__' :
with AudioToTextRecorder () as recorder :
print ( "Transcription: " , recorder . text ())
Lors de l'exécution de recorder.text en boucle, il est recommandé d'utiliser un rappel, permettant à la transcription de s'exécuter de manière asynchrone :
def process_text ( text ):
print ( text )
while True :
recorder . text ( process_text )
from RealtimeSTT import AudioToTextRecorder
def process_text ( text ):
print ( text )
if __name__ == '__main__' :
recorder = AudioToTextRecorder ()
while True :
recorder . text ( process_text )
Activation par mot clé avant de détecter la voix. Écrivez la liste séparée par des virgules de vos mots-clés d'activation souhaités dans le paramètre wake_words. Vous pouvez choisir des mots d'activation dans cette liste : alexa, americano, myrtille, bourdon, ordinateur, pamplemousses, sauterelle, hey google, hey siri, jarvis, ok google, picovoice, porc-épic, terminateur.
recorder = AudioToTextRecorder ( wake_words = "jarvis" )
print ( 'Say "Jarvis" then speak.' )
print ( recorder . text ())
from RealtimeSTT import AudioToTextRecorder
if __name__ == '__main__' :
recorder = AudioToTextRecorder ( wake_words = "jarvis" )
print ( 'Say "Jarvis" to start recording.' )
print ( recorder . text ())
Vous pouvez définir des fonctions de rappel à exécuter sur différents événements (voir Configuration) :
def my_start_callback ():
print ( "Recording started!" )
def my_stop_callback ():
print ( "Recording stopped!" )
recorder = AudioToTextRecorder ( on_recording_start = my_start_callback ,
on_recording_stop = my_stop_callback )
from RealtimeSTT import AudioToTextRecorder
def start_callback ():
print ( "Recording started!" )
def stop_callback ():
print ( "Recording stopped!" )
if __name__ == '__main__' :
recorder = AudioToTextRecorder ( on_recording_start = start_callback ,
on_recording_stop = stop_callback )
Si vous ne souhaitez pas utiliser le microphone local, définissez le paramètre use_microphone sur false et fournissez des morceaux audio PCM bruts en mono 16 bits (échantillonnage 16 000) avec cette méthode :
recorder . feed_audio ( audio_chunk )
from RealtimeSTT import AudioToTextRecorder
if __name__ == '__main__' :
recorder = AudioToTextRecorder ( use_microphone = False )
with open ( "audio_chunk.pcm" , "rb" ) as f :
audio_chunk = f . read ()
recorder . feed_audio ( audio_chunk )
print ( "Transcription: " , recorder . text ())
Vous pouvez arrêter l'enregistreur en toute sécurité en utilisant le protocole du gestionnaire de contexte :
with AudioToTextRecorder () as recorder :
[...]
Ou vous pouvez appeler la méthode d'arrêt manuellement (si l'utilisation de "with" n'est pas réalisable) :
recorder . shutdown ()
from RealtimeSTT import AudioToTextRecorder
if __name__ == '__main__' :
with AudioToTextRecorder () as recorder :
[...]
# or manually shutdown if "with" is not used
recorder . shutdown ()
Le sous-répertoire test contient un ensemble de scripts pour vous aider à évaluer et comprendre les capacités de la bibliothèque RealtimeTTS.
Les scripts de test dépendant de la bibliothèque RealtimeTTS peuvent nécessiter que vous saisissiez votre région de service Azure dans le script. Lors de l'utilisation de scripts de démonstration liés à OpenAI, Azure ou Elevenlabs, les clés API doivent être fournies dans les variables d'environnement OPENAI_API_KEY, AZURE_SPEECH_KEY et ELEVENLABS_API_KEY (voir RealtimeTTS)
simple_test.py
realtimestt_test.py
wakeword_test.py
traducteur.py
pip install openai realtimetts
.openai_voice_interface.py
pip install openai realtimetts
.avancé_talk.py
pip install openai keyboard realtimetts
.minimaliste_talkbot.py
pip install openai realtimetts
.Le sous-répertoire example_app contient une application d'interface utilisateur raffinée pour l'API OpenAI basée sur PyQt5.
AudioToTextRecorder
Lorsque vous initialisez la classe AudioToTextRecorder
, vous disposez de différentes options pour personnaliser son comportement.
model (str, default="tiny") : taille du modèle ou chemin de transcription.
langue (str, default="") : Code de langue pour la transcription. S'il est laissé vide, le modèle tentera de détecter automatiquement la langue. Les codes de langue pris en charge sont répertoriés dans la bibliothèque Whisper Tokenizer.
computing_type (str, default="default") : Spécifie le type de calcul à utiliser pour la transcription. Voir Quantification murmurée
input_device_index (int, default=0) : index du périphérique d'entrée audio à utiliser.
gpu_device_index (int, default=0) : index de périphérique GPU à utiliser. Le modèle peut également être chargé sur plusieurs GPU en transmettant une liste d'identifiants (par exemple [0, 1, 2, 3]).
device (str, default="cuda") : appareil que le modèle doit utiliser. Peut être "cuda" ou "cpu".
on_recording_start : Une fonction appelable déclenchée au démarrage de l'enregistrement.
on_recording_stop : Une fonction appelable déclenchée à la fin de l'enregistrement.
on_transcription_start : Une fonction appelable déclenchée au démarrage de la transcription.
Ensure_sentence_starting_uppercase (bool, default=True) : garantit que chaque phrase détectée par l'algorithme commence par une lettre majuscule.
Ensure_sentence_ends_with_period (bool, default=True) : garantit que chaque phrase qui ne se termine pas par un signe de ponctuation tel que "?", "!" se termine par un point
use_microphone (bool, default=True) : utilisation du microphone local pour la transcription. Définissez sur False si vous souhaitez fournir des morceaux avec la méthode feed_audio.
spinner (bool, par défaut = True) : fournit un texte d'animation spinner avec des informations sur l'état actuel de l'enregistreur.
level (int, default=logging.WARNING) : niveau de journalisation.
handle_buffer_overflow (bool, default=True) : si défini, le système enregistrera un avertissement lorsqu'un débordement d'entrée se produit pendant l'enregistrement et supprimera les données du tampon.
Beam_size (int, par défaut = 5) : La taille du faisceau à utiliser pour le décodage de la recherche de faisceau.
initial_prompt (str ou itérable de int, default=None) : invite initiale à alimenter les modèles de transcription.
suppress_tokens (list of int, default=[-1]) : jetons à supprimer de la sortie de transcription.
on_recorded_chunk : Une fonction de rappel qui est déclenchée lorsqu'un morceau d'audio est enregistré. Soumet les données du bloc en tant que paramètre.
debug_mode (bool, default=False) : si défini, le système imprime des informations de débogage supplémentaires sur la console.
print_transcription_time (bool, default=False) : enregistre le temps de traitement de la transcription du modèle principal. Cela peut être utile pour la surveillance des performances et le débogage.
early_transcription_on_silence (int, default=0) : si défini, le système transcrira l'audio plus rapidement lorsqu'un silence est détecté. La transcription commencera après les millisecondes spécifiées. Gardez cette valeur inférieure à post_speech_silence_duration
, idéalement autour de post_speech_silence_duration
moins le temps de transcription estimé avec le modèle principal. Si le silence dure plus longtemps que post_speech_silence_duration
, l'enregistrement est arrêté et la transcription est soumise. Si l'activité vocale reprend dans ce délai, la transcription est supprimée. Cela se traduit par des transcriptions finales plus rapides au prix d'une charge GPU supplémentaire en raison de certaines transcriptions finales inutiles.
Allowed_latency_limit (int, default=100) : Spécifie le nombre maximum de fragments non traités dans la file d'attente avant de supprimer les fragments. Cela permet d'éviter que le système ne soit submergé et ne perde de réactivité dans les applications en temps réel.
no_log_file (bool, default=False) : si défini, le système ignorera l'écriture du fichier journal de débogage, réduisant ainsi les E/S disque. Utile si la journalisation dans un fichier n'est pas nécessaire et que les performances sont une priorité.
Remarque : Lors de l'activation de la description en temps réel, une installation GPU est fortement conseillée. L'utilisation de la transcription en temps réel peut créer des charges GPU élevées.
Enable_realtime_transcription (bool, default=False) : active ou désactive la transcription en temps réel de l'audio. Lorsqu'il est défini sur True, l'audio sera transcrit en continu au fur et à mesure de son enregistrement.
use_main_model_for_realtime (bool, default=False) : s'il est défini sur True, le modèle de transcription principal sera utilisé pour la transcription régulière et en temps réel. Si False, un modèle distinct spécifié par realtime_model_type
sera utilisé pour la transcription en temps réel. L'utilisation d'un modèle unique peut économiser de la mémoire et potentiellement améliorer les performances, mais peut ne pas être optimisé pour le traitement en temps réel. L'utilisation de modèles séparés permet d'obtenir un modèle plus petit et plus rapide pour la transcription en temps réel tout en conservant un modèle plus précis pour la transcription finale.
realtime_model_type (str, default="tiny") : Spécifie la taille ou le chemin du modèle d'apprentissage automatique à utiliser pour la transcription en temps réel.
realtime_processing_pause (float, default=0.2) : Spécifie l'intervalle de temps en secondes après la transcription d'un morceau d'audio. Des valeurs plus faibles entraîneront des mises à jour de transcription plus « en temps réel » (fréquentes), mais peuvent augmenter la charge de calcul.
on_realtime_transcription_update : Une fonction de rappel qui est déclenchée chaque fois qu'il y a une mise à jour dans la transcription en temps réel. La fonction est appelée avec le texte nouvellement transcrit comme argument.
on_realtime_transcription_stabilized : Une fonction de rappel qui est déclenchée chaque fois qu'il y a une mise à jour dans la transcription en temps réel et renvoie un texte stabilisé de meilleure qualité comme argument.
Beam_size_realtime (int, default=3) : La taille du faisceau à utiliser pour le décodage de la recherche de faisceau de transcription en temps réel.
silero_sensitivity (float, par défaut = 0,6) : sensibilité pour la détection de l'activité vocale de Silero allant de 0 (la moins sensible) à 1 (la plus sensible). La valeur par défaut est 0,6.
silero_use_onnx (bool, default=False) : permet l'utilisation du modèle pré-entraîné de Silero au format ONNX (Open Neural Network Exchange) au lieu du format PyTorch. La valeur par défaut est False. Recommandé pour des performances plus rapides.
silero_deactivity_detection (bool, default=False) : active le modèle Silero pour la détection de fin de discours. Plus robuste contre le bruit de fond. Utilise des ressources GPU supplémentaires mais améliore la précision dans les environnements bruyants. Lorsque False, utilise le VAD WebRTC par défaut, qui est plus sensible mais peut continuer à enregistrer plus longtemps en raison des bruits de fond.
webrtc_sensitivity (int, default=3) : sensibilité du moteur de détection d'activité vocale WebRTC allant de 0 (le moins agressif/le plus sensible) à 3 (le plus agressif, le moins sensible). La valeur par défaut est 3.
post_speech_silence_duration (float, default=0.2) : Durée en secondes de silence qui doit suivre la parole avant que l'enregistrement ne soit considéré comme terminé. Cela garantit que les brèves pauses pendant la parole ne mettent pas fin prématurément à l'enregistrement.
min_gap_between_recordings (float, default=1.0) : Spécifie l'intervalle de temps minimum en secondes qui doit exister entre la fin d'une session d'enregistrement et le début d'une autre pour empêcher des enregistrements consécutifs rapides.
min_length_of_recording (float, default=1.0) : Spécifie la durée minimale en secondes qu'une session d'enregistrement doit durer pour garantir une capture audio significative, évitant ainsi les enregistrements excessivement courts ou fragmentés.
pre_recording_buffer_duration (float, par défaut = 0,2) : durée, en secondes, pendant laquelle l'audio est mis en mémoire tampon avant l'enregistrement formel. Cela permet de contrebalancer la latence inhérente à la détection de l’activité vocale, garantissant qu’aucun son initial n’est manqué.
on_vad_detect_start : une fonction appelable déclenchée lorsque le système commence à écouter l'activité vocale.
on_vad_detect_stop : une fonction appelable déclenchée lorsque le système s'arrête pour écouter l'activité vocale.
wakeword_backend (str, default="pvporcupine") : Spécifie la bibliothèque backend à utiliser pour la détection des mots d'activation. Les options prises en charge incluent « pvporcupine » pour utiliser le moteur de mots de réveil Porcupine ou « oww » pour utiliser le moteur OpenWakeWord.
openwakeword_model_paths (str, default=None) : chemins séparés par des virgules vers les fichiers de modèle pour la bibliothèque openwakeword. Ces chemins pointent vers des modèles personnalisés qui peuvent être utilisés pour la détection des mots d'activation lorsque la bibliothèque openwakeword est sélectionnée comme wakeword_backend.
openwakeword_inference_framework (str, default="onnx") : Spécifie le cadre d'inférence à utiliser avec la bibliothèque openwakeword. Peut être « onnx » pour le format Open Neural Network Exchange ou « tflite » pour TensorFlow Lite.
wake_words (str, default="") : lance l'enregistrement lors de l'utilisation du backend wakeword 'pvporcupine'. Plusieurs mots d'activation peuvent être fournis sous forme de chaîne séparée par des virgules. Les mots de réveil pris en charge sont : alexa, americano, myrtille, bourdon, ordinateur, pamplemousses, sauterelle, hé google, hé siri, jarvis, ok google, picovoice, porc-épic, terminateur. Pour le backend 'openwakeword', les mots de réveil sont automatiquement extraits des fichiers de modèle fournis, il n'est donc pas nécessaire de les spécifier ici.
wake_words_sensitivity (float, par défaut = 0,6) : niveau de sensibilité pour la détection des mots d'activation (0 pour le moins sensible, 1 pour le plus sensible).
wake_word_activation_delay (float, default=0) : Durée en secondes après le début de la surveillance avant que le système ne passe à l'activation du mot de réveil si aucune voix n'est initialement détectée. S'il est défini sur zéro, le système utilise immédiatement l'activation du mot de réveil.
wake_word_timeout (float, par défaut = 5) : durée en secondes après la reconnaissance d'un mot d'activation. Si aucune activité vocale ultérieure n'est détectée dans cette fenêtre, le système repasse à un état inactif, en attendant le prochain mot de réveil ou l'activation vocale.
wake_word_buffer_duration (float, par défaut = 0,1) : durée en secondes pour mettre en mémoire tampon les données audio pendant la détection du mot de réveil. Cela permet de supprimer le mot d'activation du tampon d'enregistrement afin qu'il ne soit pas détecté à tort avec le texte prononcé suivant, garantissant ainsi des déclencheurs de démarrage de transcription plus propres et plus précis. Augmentez cette valeur si des parties du mot d'activation sont détectées sous forme de texte.
on_wakeword_detected : Une fonction appelable déclenchée lorsqu'un mot de réveil est détecté.
on_wakeword_timeout : une fonction appelable déclenchée lorsque le système revient à un état inactif après qu'aucune parole n'a été détectée après l'activation du mot de réveil.
on_wakeword_detection_start : Une fonction appelable déclenchée lorsque le système commence à écouter les mots de réveil
on_wakeword_detection_end : Une fonction appelable déclenchée lors de l'arrêt pour écouter les mots de réveil (par exemple en raison d'un délai d'attente ou d'un mot de réveil détecté)
Recherchez ici des informations sur la façon de former vos propres modèles OpenWakeWord. Vous pouvez utiliser un simple bloc-notes Google Colab pour commencer ou utiliser un bloc-notes plus détaillé qui permet plus de personnalisation (peut produire des modèles de haute qualité, mais nécessite plus d'expérience en développement).
Vous devrez peut-être utiliser tf2onnx pour convertir les modèles tensorflow tflite au format onnx :
pip install -U tf2onnx
python -m tf2onnx.convert --tflite my_model_filename.tflite --output my_model_filename.onnx
Paramètres de démarrage suggérés pour l'utilisation d'OpenWakeWord :
with AudioToTextRecorder (
wakeword_backend = "oww" ,
wake_words_sensitivity = 0.35 ,
openwakeword_model_paths = "word1.onnx,word2.onnx" ,
wake_word_buffer_duration = 1 ,
) as recorder :
R : Ce problème provient d’une incompatibilité entre la version de ctranslate2
et cuDNN. La bibliothèque ctranslate2
a été mise à jour vers la version 4.5.0, qui utilise cuDNN 9.2. Il existe deux manières de résoudre ce problème :
ctranslate2
vers la version 4.4.0 : pip install ctranslate2==4.4.0
Les contributions sont toujours les bienvenues !
Merci à Steven Linn pour avoir fourni le support Docker.
MIT
Kolja Beigel
E-mail : [email protected]
GitHub