Il s'agit de PocketSphinx, l'un des moteurs de reconnaissance vocale continue open source à large vocabulaire et indépendant du locuteur de l'Université Carnegie Mellon.
Même s’il s’agissait à un moment donné d’un système de recherche, le développement actif a largement cessé et il est devenu très, très loin de l’état de la technique. Je fais une version, car les gens l'utilisent néanmoins, et il y a un certain nombre d'erreurs historiques dans le système de construction et l'API qui devaient être corrigées.
Le numéro de version est étrangement grand car il y a eu une "version" que les gens utilisent appelée 5prealpha, et nous utiliserons désormais une version sémantique appropriée.
Veuillez consulter le fichier LICENSE pour connaître les conditions d'utilisation.
Nous utilisons maintenant CMake pour la construction, ce qui devrait donner des résultats raisonnables sous Linux et Windows. Je ne suis pas sûr de Mac OS X car je n'en ai pas. De plus, la bibliothèque audio, qui n'a jamais vraiment été construite ou n'a jamais fonctionné correctement sur aucune plate-forme, a tout simplement été supprimée.
Il n'y a plus de dépendance à SphinxBase. Il n'y a plus de SphinxBase. Ce n'est pas le SphinxBase que vous recherchez. Tous vos SphinxBase nous appartiennent.
Pour installer le module Python dans un environnement virtuel (remplacez ~/ve_pocketsphinx
par l'environnement virtuel que vous souhaitez créer), depuis le répertoire de niveau supérieur :
python3 -m venv ~/ve_pocketsphinx . ~/ve_pocketsphinx/bin/activate pip install .
Pour installer la bibliothèque C et les liaisons (en supposant que vous ayez accès à /usr/local - sinon, utilisez -DCMAKE_INSTALL_PREFIX
pour définir un préfixe différent dans la première commande cmake
ci-dessous) :
cmake -S . -B build cmake --build build cmake --build build --target install
Le programme de ligne de commande pocketsphinx
lit l'audio PCM 16 bits monocanal à partir d'une entrée standard ou d'un ou plusieurs fichiers, et tente d'y reconnaître la parole en utilisant le modèle acoustique et linguistique par défaut. Il accepte un grand nombre d'options qui ne vous intéressent probablement pas, une commande qui par défaut est live
, et une ou plusieurs entrées (sauf en mode align
), ou -
pour lire à partir de l'entrée standard.
Si vous disposez d'un fichier WAV monocanal appelé "speech.wav" et que vous souhaitez y reconnaître la parole, vous pouvez essayer de faire ceci (les résultats risquent de ne pas être merveilleux) :
pocketsphinx single speech.wav
Si votre entrée est dans un autre format, je suggère de la convertir avec sox
comme décrit ci-dessous.
Les commandes sont les suivantes :
help
: Imprimez une longue liste de ces options qui ne vous intéressent pas.
config
: vider la configuration au format JSON vers la sortie standard (peut être chargé avec l'option -config
).
live
: détectez les segments vocaux dans chaque entrée, exécutez leur reconnaissance (en utilisant les options qui ne vous intéressent pas) et écrivez les résultats sur la sortie standard en JSON délimité par des lignes. Je me rends compte que ce n’est pas le format le plus joli, mais il surpasse certainement XML. Chaque ligne contient un objet JSON avec ces champs, qui ont des noms courts pour rendre les lignes plus lisibles :
b
: Heure de début en secondes, depuis le début du flux
d
: Durée en secondes
p
: Probabilité estimée du résultat de la reconnaissance, soit un nombre compris entre 0 et 1 représentant la probabilité de la saisie selon le modèle
t
: Texte intégral du résultat de la reconnaissance
w
: Liste de segments (généralement des mots), dont chacun contient à son tour les champs b
, d
, p
et t
, pour le début, la fin, la probabilité et le texte du mot. Si -phone_align yes
a été passé, alors un champ w
sera présent contenant les segmentations téléphoniques, dans le même format.
single
: Reconnaissez chaque entrée comme un énoncé unique et écrivez un objet JSON dans le même format décrit ci-dessus.
align
: alignez un seul fichier d'entrée (ou -
pour une entrée standard) sur une séquence de mots et écrivez un objet JSON dans le même format décrit ci-dessus. Le premier argument de position est l'entrée, et tous les suivants sont concaténés pour constituer le texte, afin d'éviter les surprises si vous oubliez de le citer. Vous êtes responsable de normaliser le texte pour supprimer la ponctuation, les majuscules, les mille-pattes, etc. Par exemple :
pocketsphinx align goforward.wav "go forward ten meters"
Par défaut, seul l'alignement au niveau des mots est effectué. Pour obtenir les alignements téléphoniques, passez -phone_align yes
dans les drapeaux, par exemple :
pocketsphinx -phone_align yes align audio.wav $text
Cela produira une sortie pas particulièrement lisible, mais vous pouvez utiliser jq pour la nettoyer. Par exemple, vous pouvez obtenir uniquement les noms des mots et les heures de début comme ceci :
pocketsphinx align audio.wav $text | jq '.w[]|[.t,.b]'
Ou vous pouvez obtenir les noms de téléphone et les durées comme ceci :
pocketsphinx -phone_align yes align audio.wav $text | jq '.w[]|.w[]|[.t,.d]'
Il existe bien sûr de très nombreuses autres possibilités.
soxflags
: Renvoie les arguments à sox
qui créeront le format d'entrée approprié. Notez que parce que la ligne de commande sox
est légèrement originale, celles-ci doivent toujours figurer après le nom de fichier ou -d
(qui indique sox
de lire à partir du microphone). Vous pouvez exécuter une reconnaissance en direct comme ceci :
sox -d $(pocketsphinx soxflags) | pocketsphinx -
ou décoder à partir d'un fichier nommé "audio.mp3" comme ceci :
sox audio.mp3 $(pocketsphinx soxflags) | pocketsphinx -
Par défaut, seules les erreurs sont imprimées en erreur standard, mais si vous souhaitez plus d'informations, vous pouvez transmettre -loglevel INFO
. Les résultats partiels ne sont pas imprimés, ils le seront peut-être dans le futur, mais ne retenez pas votre souffle.
Pour la programmation, consultez le répertoire d'exemples pour un certain nombre d'exemples d'utilisation de la bibliothèque de C et Python. Vous pouvez également lire la documentation de l'API Python ou de l'API C
PocketSphinx est finalement basé sur Sphinx-II
, lui-même basé sur certains systèmes plus anciens de l'Université Carnegie Mellon, qui ont été publiés en tant que logiciel libre sous une licence de type BSD grâce aux efforts de Kevin Lenzo. Une grande partie du décodeur en particulier a été écrite par Ravishankar Mosur (recherchez "rkm" dans les commentaires), mais diverses autres personnes ont également contribué, voir le fichier AUTEURS pour plus de détails.
David Huggins-Daines (l'auteur de ce document) est responsable de la création PocketSphinx
qui a ajouté diverses optimisations de vitesse et de mémoire, un calcul en virgule fixe, un support JSGF, une portabilité vers diverses plates-formes et une API quelque peu cohérente. Il a ensuite disparu pendant un moment.
Nickolay Shmyrev a ensuite pris en charge la maintenance pendant un certain temps, et une grande partie du code a été fournie par Alexander Solovets, Vyacheslav Klimkov et d'autres.
Actuellement, cela est à nouveau maintenu par David Huggins-Daines.