在Python中语音或无语音检测

时间:2013-08-02 05:14:46

标签: python speech-recognition

我正在写一个识别语音的程序。它的作用是从麦克风录制音频并使用Sphinx将其转换为文本。我的问题是我只想在用户说出某些内容时开始录制音频。

我通过从麦克风读取音频电平进行实验,并仅在电平高于特定值时进行录制。但它并没有那么有效。程序在检测到任何响亮的声音时开始录制。这是我用的代码

import audioop
import pyaudio as pa
import wav

class speech():
    def __init__(self):
        # soundtrack properties
        self.format = pa.paInt16
        self.rate = 16000
        self.channel = 1
        self.chunk = 1024
        self.threshold = 150
        self.file = 'audio.wav'

        # intialise microphone stream
        self.audio = pa.PyAudio()
        self.stream = self.audio.open(format=self.format,
                                  channels=self.channel,
                                  rate=self.rate,
                                  input=True,
                                  frames_per_buffer=self.chunk)


    def record(self)
        while True:
            data = self.stream.read(self.chunk)
            rms = audioop.rms(data,2) #get input volume
            if rms>self.threshold: #if input volume greater than threshold
                break

        # array to store frames
        frames = []
        # record upto silence only
        while rms>threshold:
            data = self.stream.read(self.chunk)
            rms = audioop.rms(data,2)
            frames.append(data)

        print 'finished recording.... writing file....'
        write_frames = wav.open(self.file, 'wb')
        write_frames.setnchannels(self.channel)
        write_frames.setsampwidth(self.audio.get_sample_size(self.format))
        write_frames.setframerate(self.rate)
        write_frames.writeframes(''.join(frames))
        write_frames.close()

有没有办法在Python中区分人声和其他噪音?希望有人能找到我的解决方案。

3 个答案:

答案 0 :(得分:5)

我认为你的问题是,目前你在没有识别语音的情况下进行录音,因此它没有辨别力 - 可识别的语音是在识别后产生有意义的结果的任何东西 - 所以捕获22.你可以通过寻找来简化问题用于打开关键字。你也可以过滤voice frequency range作为人耳和电话公司都做的,你可以看一下标记空间比例 - 我相信有一些出版物可以追溯到那个但是注意 - 它因语言而异语言。快速的谷歌可以提供非常丰富的信息。您还可以找到有趣的this文章。

答案 1 :(得分:2)

我认为你正在寻找的是VAD(语音活动检测)。 VAD可用于ASR的语音预处理。这是VAD link实现的一些开源项目。可以帮到你。

答案 2 :(得分:-1)