使用Python和Pocketsphinx进行实时识别

时间:2013-01-13 20:29:00

标签: python cmusphinx

我最近在python中使用口袋狮身人面像。我成功了 以下示例用于识别录制的wav。

#!/usr/bin/env python

import sys,os



def decodeSpeech(hmmd,lmdir,dictp,wavfile):

    """

    Decodes a speech file

    """

    try:

        import pocketsphinx as ps

        import sphinxbase

    except:

        print """Pocket sphinx and sphixbase is not installed

        in your system. Please install it with package manager.

        """

    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]



if __name__ == "__main__":

    hmdir = "/home/jaganadhg/Desktop/Docs_New/kgisl/model/hmm/wsj1"

    lmd = "/home/jaganadhg/Desktop/Docs_New/kgisl/model/lm/wsj/wlist5o.3e-7.vp.tg.lm.DMP"

    dictd = "/home/jaganadhg/Desktop/Docs_New/kgisl/model/lm/wsj/wlist5o.dic"

    wavfile = "/home/jaganadhg/Desktop/Docs_New/kgisl/sa1.wav"

    recognised = decodeSpeech(hmdir,lmd,dictd,wavfile)

    print "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"

    print recognised

    print "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"

问题是我如何通过麦克风进行实时语音识别?在 带有if语句的while循环,以便在从麦克风识别出设置的单词时 可以调用一个函数吗?

3 个答案:

答案 0 :(得分:4)

实时识别代码如this

config = Decoder.default_config()
config.set_string('-hmm', path.join(MODELDIR, 'en-us/en-us'))
config.set_string('-lm', path.join(MODELDIR, 'en-us/en-us.lm.bin'))
config.set_string('-dict', path.join(MODELDIR, 'en-us/cmudict-en-us.dict'))
config.set_string('-logfn', '/dev/null')
decoder = Decoder(config)

import pyaudio
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=1024)
stream.start_stream()

in_speech_bf = False
decoder.start_utt()
while True:
    buf = stream.read(1024)
    if buf:
        decoder.process_raw(buf, False, False)
        if decoder.get_in_speech() != in_speech_bf:
            in_speech_bf = decoder.get_in_speech()
            if not in_speech_bf:
                decoder.end_utt()
                print 'Result:', decoder.hyp().hypstr
                decoder.start_utt()
    else:
        break
decoder.end_utt()

你也可以在pocketsphinx中使用gstreamer python绑定,检查livedemo.py

答案 1 :(得分:2)

试试this。 Pocketsphinx现在是一个GStreamer插件。

答案 2 :(得分:0)

这是我在互联网上看到的代码,我修改了一些内容以真正收听非常糟糕和缓慢的单词 您可以帮我永久修改它。它基于Ubuntu 16.04 LTS构建 我对编程不太了解 希望能提供帮助

    # -*- encoding: utf-8 -*-
    #!/usr/bin/env python

    from pocketsphinx.pocketsphinx import *
    from sphinxbase.sphinxbase import *

    import os
    import pyaudio
    import wave
    import audioop
    from collections import deque
    import time
    import math;import Mic

    """
    Written by Sophie Li, 2016
    http://blog.justsophie.com/python-speech-to-text-with-pocketsphinx/
    """

    class SpeechDetector:
        def __init__(self):
            # Microphone stream config.
            self.CHUNK = 1024  # CHUNKS of bytes to read each time from mic
            self.FORMAT = pyaudio.paInt16
            self.CHANNELS = 1
            self.RATE = 16000

            self.SILENCE_LIMIT = 1  # Silence limit in seconds. The max ammount of seconds where
                               # only silence is recorded. When this time passes the
                               # recording finishes and the file is decoded

            self.PREV_AUDIO = 0.5  # Previous audio (in seconds) to prepend. When noise
                              # is detected, how much of previously recorded audio is
                              # prepended. This helps to prevent chopping the beginning
                              # of the phrase.

            self.THRESHOLD = 4500
            self.num_phrases = -1

            # These will need to be modified according to where the pocketsphinx folder is
            MODELDIR = "/home/l/Desktop/pocketsphinx/model/en-us"

            # Create a decoder with certain model
            config = Decoder.default_config()
            config.set_string('-hmm', os.path.join(MODELDIR, '/home/l/Desktop/pocketsphinx/model/en-us/en-us/'))
            config.set_string('-lm', os.path.join(MODELDIR, '/home/l/Desktop/pocketsphinx/model/en-us/en-us.lm.bin'))
            config.set_string('-dict', os.path.join(MODELDIR, '/home/l/Desktop/pocketsphinx/model/en-us/cmudict-en-us.dict'))
            config.set_string('-keyphrase', 'no one')
            config.set_float('-kws_threshold', 1e+20)

            # Creaders decoder object for streaming data.
            self.decoder = Decoder(config)

        def setup_mic(self, num_samples=50):
            """ Gets average audio intensity of your mic sound. You can use it to get
                average intensities while you're talking and/or silent. The average
                is the avg of the .2 of the largest intensities recorded.
            """
            #print "Getting intensity values from mic."
            p = pyaudio.PyAudio()
            stream = p.open(format=self.FORMAT, 
                            channels=self.CHANNELS,
                            rate=self.RATE, 
                            input=True, 
                            frames_per_buffer=self.CHUNK)

            values = [math.sqrt(abs(audioop.avg(stream.read(self.CHUNK), 4)))
                      for x in range(num_samples)]
            values = sorted(values, reverse=True)
            r = sum(values[:int(num_samples * 0.2)]) / int(num_samples * 0.2)
            #print " Finished "
            #print " Average audio intensity is ", r
            stream.close()
            p.terminate()

            if r < 3000:
                self.THRESHOLD = 3500
            else:
                self.THRESHOLD = r + 100

        def save_speech(self, data, p):
            """
            Saves mic data to temporary WAV file. Returns filename of saved
            file
            """
            filename = 'output_'+str(int(time.time()))
            # writes data to WAV file
            data = ''.join(data)
            wf = wave.open(filename + '.wav', 'wb')
            wf.setnchannels(1)
            wf.setsampwidth(p.get_sample_size(pyaudio.paInt16))
            wf.setframerate(16000)  # TODO make this value a function parameter?
            wf.writeframes(data)
            wf.close()
            return filename + '.wav'

        def decode_phrase(self, wav_file):
            self.decoder.start_utt()
            stream = open(wav_file, "rb")
            while True:
              buf = stream.read(1024)
              if buf:
                self.decoder.process_raw(buf, False, False)
              else:
                break
            self.decoder.end_utt()
            words = []
            [words.append(seg.word) for seg in self.decoder.seg()]
            return words

        def run(self):
            """
            Listens to Microphone, extracts phrases from it and calls pocketsphinx
            to decode the sound
            """
            self.setup_mic()

            #Open stream
            p = pyaudio.PyAudio()
            stream = p.open(format=self.FORMAT, 
                            channels=self.CHANNELS, 
                            rate=self.RATE, 
                            input=True, 
                            frames_per_buffer=self.CHUNK)

            audio2send = []
            cur_data = ''  # current chunk of audio data
            rel = self.RATE/self.CHUNK
            slid_win = deque(maxlen=self.SILENCE_LIMIT * rel)
            #Prepend audio from 0.5 seconds before noise was detected
            prev_audio = deque(maxlen=self.PREV_AUDIO * rel)
            started = False

            while True:
                cur_data = stream.read(self.CHUNK)
                slid_win.append(math.sqrt(abs(audioop.avg(cur_data, 4))))

                if sum([x > self.THRESHOLD for x in slid_win]) > 0:
                    if started == False:
                        print "Bắt đầu ghi âm"
                        started = True
                    audio2send.append(cur_data)

                elif started:
                    print "Hoàn thành ghi âm"
                    filename = self.save_speech(list(prev_audio) + audio2send, p)
                    r = self.decode_phrase(filename)
                    print "RESULT: ", r
# hot word for me " no one" if r.count('one') and r.count("no") > 0 the end programs
                    if r.count("one") > 0 and r.count("no") > 0:
                        Mic.playaudiofromAudio().play("/home/l/Desktop/PROJECT/Audio/beep_hi.wav")
                        os.remove(filename)
                        return
                    # Removes temp audio file
                    os.remove(filename)
                    # Reset all
                    started = False
                    slid_win = deque(maxlen=self.SILENCE_LIMIT * rel)
                    prev_audio = deque(maxlen= 0.5 * rel)
                    audio2send = []
                    print "Chế độ nghe ..."

                else:
                    prev_audio.append(cur_data)

            print "* Hoàn thành nghe"
            stream.close()
            p.terminate()