Pocketsphinx est une librairie permettant d'intégrer la reconnaissance vocale dans vos projets écrit en language C à l'aide des fonctionnalités du projet open source CMUSphinx.
Installer les paquets python-pocketsphinx libpocketsphinx1 gstreamer1.0-pocketsphinx python-pyaudio.
Ou dans un terminal avec les droits administrateurs :
sudo apt-get install python-pocketsphinx libpocketsphinx1 gstreamer1.0-pocketsphinx python-pyaudio
D'abord il faut installer les dépendances dans un terminal avec les droits administrateurs :
sudo apt-get build-dep pocketsphinx sudo apt-get install bison python-pyaudio
On récupère ensuite les sources de sphinxbase-0.8
wget -O sphinxbase-0.8.tar.gz http://sourceforge.net/projects/cmusphinx/files/sphinxbase/0.8/sphinxbase-0.8.tar.gz/download
On les décompresse
tar -xvzf sphinxbase-0.8.tar.gz
On ce rend dans le dossier pour préparer l'installation
cd sphinxbase-0.8/
On compile
./configure --prefix=/usr/local make sudo make install
import pocketsphinx as ps File "sphinxbase.pxd", line 150, in init pocketsphinx (pocketsphinx.c:7935) ValueError: PyCapsule_GetPointer called with invalid PyCapsule object
il faut régénérer le fichier python/sphinxbase.c ref
sudo apt-get install cython mv python/sphinxbase.c ~
puis relancer la compilation a partir de ./configure
sudo apt-get remove libpulse-dev
wget -O pocketsphinx-0.8.tar.gz http://sourceforge.net/projects/cmusphinx/files/pocketsphinx/0.8/pocketsphinx-0.8.tar.gz/download tar -xvzf pocketsphinx-0.8.tar.gz cd pocketsphinx-0.8 ./configure --prefix=/usr/local make sudo make install
Téléchargement:
wget -O lium_french_f0.tar.gz http://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/Archive/French%20F0%20Broadcast%20News%20Acoustic%20Model/lium_french_f0.tar.gz/download tar -xvzf lium_french_f0.tar.gz cd lium_french_f0/ sudo mkdir -p `pkg-config --variable=modeldir pocketsphinx`/fr_FR/french_f0 sudo mv * `pkg-config --variable=modeldir pocketsphinx`/fr_FR/french_f0 wget -O french3g62K.lm.dmp http://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/French/fr.lm.dmp/download sudo mkdir -p `pkg-config --variable=modeldir pocketsphinx`/fr_FR/ sudo mv french3g62K.lm.dmp `pkg-config --variable=modeldir pocketsphinx`/fr_FR/ wget -O frenchWords62K.dic http://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/French/fr.dict/download sudo mv frenchWords62K.dic `pkg-config --variable=modeldir pocketsphinx`/fr_FR/
Vous pouvez alors lancer la reconnaissance vocale depuis le micro directement avec la commande pocketsphinx_continuous. Il faut simplement préciser un dictionnaire à utiliser, un modèle de langage et un modèle de Markov caché (Hidden Markov Model ou HMM). Si vous avez installé pocketsphinx avec le gestionnaire de paquets, le répertoire contenant les modèles est /usr/share/pocketsphinx/model/. Pour utiliser les modèles en français que vous venez de télécharger en suivant les instructions ci-dessus, il faut exécuter la commande :
pocketsphinx_continuous -dict /usr/share/pocketsphinx/model/fr_FR/frenchWords62K.dic -hmm /usr/share/pocketsphinx/model/fr_FR/french_f0/ -lm /usr/share/pocketsphinx/model/fr_FR/french3g62K.lm.dmp -inmic yes
Si vous l'avez compilé depuis les sources comme indiqué plus haut, le répertoire contenant les modèles est /usr/local/share/pocketsphinx/model/ . Il faudra alors exécuter la commande :
pocketsphinx_continuous -dict /usr/local/share/pocketsphinx/model/fr_FR/frenchWords62K.dic -hmm /usr/local/share/pocketsphinx/model/fr_FR/french_f0/ -lm /usr/local/share/pocketsphinx/model/fr_FR/french3g62K.lm.dmp -inmic yes
Plutôt que d'utiliser le micro en entrée, vous pouvez spécifier un fichier audio d'entrée au format wav en remplaçant l'option -inmic yes par -infile <fichier_audio.wav>
#!/usr/bin/python
"""
PyAudio Example:
Query and print PortAudio HostAPIs, Devices, and their
support rates.
"""
import pyaudio
standard_sample_rates = [8000.0, 9600.0, 11025.0, 12000.0,
16000.0, 22050.0, 24000.0, 32000.0,
44100.0, 48000.0, 88200.0, 96000.0,
192000.0]
p = pyaudio.PyAudio()
max_apis = p.get_host_api_count()
max_devs = p.get_device_count()
print("\nPortAudio System Info:\n======================")
print("Version: %d" % pyaudio.get_portaudio_version())
print("Version Text: %s" % pyaudio.get_portaudio_version_text())
print("Number of Host APIs: %d" % max_apis)
print("Number of Devices : %d" % max_devs)
print("\nHost APIs:\n==========")
for i in range(max_apis):
apiinfo = p.get_host_api_info_by_index(i)
for k in list(apiinfo.items()):
print("%s: %s" % k)
print("--------------------------")
print("\nDevices:\n========")
for i in range(max_devs):
devinfo = p.get_device_info_by_index(i)
# print out device parameters
for k in list(devinfo.items()):
name, value = k
# if host API, then get friendly name
if name == 'hostApi':
value = str(value) + \
" (%s)" % p.get_host_api_info_by_index(k[1])['name']
print("\t%s: %s" % (name, value))
# print out supported format rates
input_supported_rates = []
output_supported_rates = []
full_duplex_rates = []
for f in standard_sample_rates:
if devinfo['maxInputChannels'] > 0:
try:
if p.is_format_supported(
f,
input_device = devinfo['index'],
input_channels = devinfo['maxInputChannels'],
input_format = pyaudio.paInt16):
input_supported_rates.append(f)
except ValueError:
pass
if devinfo['maxOutputChannels'] > 0:
try:
if p.is_format_supported(
f,
output_device = devinfo['index'],
output_channels = devinfo['maxOutputChannels'],
output_format = pyaudio.paInt16):
output_supported_rates.append(f)
except ValueError:
pass
if (devinfo['maxInputChannels'] > 0) and \
(devinfo['maxOutputChannels'] > 0):
try:
if p.is_format_supported(
f,
input_device = devinfo['index'],
input_channels = devinfo['maxInputChannels'],
input_format = pyaudio.paInt16,
output_device = devinfo['index'],
output_channels = devinfo['maxOutputChannels'],
output_format = pyaudio.paInt16):
full_duplex_rates.append(f)
except ValueError:
pass
if len(input_supported_rates):
print("\tInput rates: %s" % input_supported_rates)
if len(output_supported_rates):
print("\tOutput rates: %s" % output_supported_rates)
if len(full_duplex_rates):
print("\tFull duplex: %s" % full_duplex_rates)
print("\t--------------------------------")
print("\nDefault Devices:\n================")
try:
def_index = p.get_default_input_device_info()['index']
print("Default Input Device : %s" % def_index)
devinfo = p.get_device_info_by_index(def_index)
for k in list(devinfo.items()):
name, value = k
if name == 'hostApi':
value = str(value) + \
" (%s)" % p.get_host_api_info_by_index(k[1])['name']
print("\t%s: %s" % (name, value))
print("\t--------------------------------")
except IOError as e:
print("No Input devices: %s" % e[0])
try:
def_index = p.get_default_output_device_info()['index']
print("Default Output Device: %s" % def_index)
devinfo = p.get_device_info_by_index(def_index)
for k in list(devinfo.items()):
name, value = k
if name == 'hostApi':
value = str(value) + \
" (%s)" % p.get_host_api_info_by_index(k[1])['name']
print("\t%s: %s" % (name, value))
print("\t--------------------------------")
except IOError as e:
print("No Output devices: %s" % e[0])
p.terminate()
#!/usr/bin/python
import sys,os
import pyaudio
import wave
hmdir = "/usr/share/pocketsphinx/model/FR/"
lmd = "/usr/share/pocketsphinx/model/FR/french3g62K.lm.dmp"
dictd = "/usr/share/pocketsphinx/model/FR/frenchWords62K.dic"
def decodeSpeech(hmmd,lmdir,dictp,wavfile):
import pocketsphinx as ps
import sphinxbase
speechRec = ps.Decoder(hmm = hmmd, lm = lmdir, dict = dictp)
wavFile = file(wavfile,'rb')
wavFile.seek(44)
speechRec.decode_raw(wavFile)
result = speechRec.get_hyp()
return result[0]
#CHUNK = 1024
CHUNK = 512
#FORMAT = pyaudio.paInt16
FORMAT = pyaudio.paALSA
CHANNELS = 1
RATE = 16000
#RATE = 44100
RECORD_SECONDS = 10
for x in range(10):
fn = "o"+str(x)+".wav"
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK)
print("* recording")
frames = []
print str(RATE / CHUNK * RECORD_SECONDS) + " size\n"
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print("* done recording")
stream.stop_stream()
stream.close()
wf = wave.open(fn, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
p.terminate()
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
wavfile = fn
recognised = decodeSpeech(hmdir,lmd,dictd,wavfile)
print recognised
cm = 'espeak "'+recognised+'"'
os.system(cm)