加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

python实现简易的语音关键词识别(一)

(2017-09-07 09:28:12)
标签:

365

分类: python实现语音处理
    目前还在学习语音识别的阶段,最近要做一个简易的语音关键词识别,就是给定一个关键词,然后说一个关键词与给定的关键词进行对比,如果是相同关键词,就返回yes。我自己录了一个词,然后将没有声音的部分剪掉,只剩下关键词部分,得到“speech.wav”。当我再次录入一个关键词时,存为“speech1.wav”,对其提取mfcc特征,然后对比两组特征。但是因为太简易了,存在的问题很多,那就是两段语音的语速要基本相同。错误率很高,这需要通过加入其他算法进行改进。


代码部分

#-*-coding:utf-8-*-

from pyaudio import PyAudio,paInt16
import numpy as np
from datetime import datetime
import wave
import librosa
from math import *
import matplotlib.pyplot as plt


NUM_SAMPLES = 2000      # pyAudio内部缓存的块的大小
SAMPLING_RATE = 8000    # 取样频率

#LEVEL = 1500
SAVE_LENGTH = 8
#COUNT_NUM = 20

channels=1
sampwidth=2

#framerate = 8000

#record time
TIME = 3
#data_path = "voice-data"
#filename1 = '2017-09-01_16_25_50.wav'

#录音
def save_wave_file(filename, data):
    '''save the date to the wav file'''
    wf = wave.open(filename, 'wb')
    wf.setnchannels(channels)
    wf.setsampwidth(sampwidth)
    wf.setframerate(SAMPLING_RATE)
    wf.writeframes("".join(data))
    wf.close()

def record_wave():
    #open the input of wave
    pa = PyAudio()
    stream = pa.open(format = paInt16, channels = 1,rate = SAMPLING_RATE, input = True, frames_per_buffer = NUM_SAMPLES)
    save_buffer = []
    count = 0
    while count < TIME*5:
        #read NUM_SAMPLES sampling data
        string_audio_data = stream.read(NUM_SAMPLES)
        save_buffer.append(string_audio_data)
        count += 1
        print count

    filename = "speech1.wav"
    save_wave_file(filename, save_buffer)
    save_buffer = []

    wav, sr = librosa.load(filename, mono=True)
    #mfcc = librosa.feature.mfcc(wave, sr)
    return wav,sr




if __name__ == '__main__':

    filename1 = 'speech.wav'
    wav, sr = librosa.load(filename1, mono=True)
    mfcc = librosa.feature.mfcc(wav, sr)
    plt.figure(1)
    plt.subplot(211)
    plt.plot(wav)
    orga = mfcc
    
    #归一化
    minVal1 = np.amin(orga)
    maxVal1 = np.amax(orga)
    x1=(orga-minVal1)/(maxVal1-minVal1)
    #print "x1",x1
    
    nowb,wr2 = np.array(record_wave())
    mfcc2 = librosa.feature.mfcc(nowb, wr2)
    minVal2 = np.amin(mfcc2)
    maxVal2 = np.amax(mfcc2)
    x2=(mfcc2-minVal2)/(maxVal2-minVal2)
    #print "x2",x2
    #print len(x2) - len(x1)
    y = []


    #每次移动一帧进行对比
    for i in np.arange(0,(len(x2[0]) - len(x1[0]))):

        y.append(np.abs(x1[0:,0:] - x2[0:,i:(len(x1[0])+i)]).sum())
       # print "when label =", i, "mfcc2[0:,i:(len(x1[0])+i)] = ",mfcc2[0:,i:(len(x1[0])+i)]


    print y
    #print len(y)
    #y=np.abs(x1 - x2).sum()

    miny = y[0]
    minstate = 0

    for j in np.arange(len(y)):

        if y[j] < miny:
            miny = y[j]
            minstate = j


    print miny
    print minstate

    if miny < 15:
        print "yes"

    plt.subplot(212)
    plt.plot(nowb)
    plt.show()


如果录入相同的关键词,就会得到如下结果:
如果录入的关键词与给定的关键词不同,则得到以下结果:

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有