• 语音识别


    '''
        语音识别:声音的本质是震动,震动的本质是位移关于时间的函数,波形文件(.wav)中记录了不同采样时刻的位移。
                通过傅里叶变换,可以将时间域的声音函数分解为一系列不同频率的正弦函数的叠加,通过频率谱线的特殊分布,
                建立音频内容和文本的对应关系,以此作为模型训练的基础。
    
                梅尔频率倒谱系数(MFCC)通过与声音内容密切相关的13个特殊频率所对应的能量分布,可以使用梅尔频率倒谱系数矩阵作为语音识别的特征。
                基于隐形马尔科夫模型进行模式识别,找到测试样本最匹配的声音模型,从而识别语音内容。
    
        梅尔频率倒谱系数相关API:
                import scipy.io.wavfile as wf
                import python_speech_features as sf
    
                sample_rate, sigs = wf.read('../data/freq.wav')
                mfcc = sf.mfcc(sigs, sample_rate)
    
    '''
    import scipy.io.wavfile as wf  # 读取 音频文件
    import python_speech_features as sf  # 提取MFCC
    import numpy as np
    
    import matplotlib.pyplot as mp
    
    sample_rate, sigs = wf.read('./ml_data/speeches/training/apple/apple01.wav')
    print(sample_rate, sigs.shape)
    # 获取MFCC矩阵
    mfcc = sf.mfcc(sigs, sample_rate)
    print(mfcc.shape)
    
    mp.matshow(mfcc.T, cmap='gist_rainbow')
    mp.show()
    
    
    输出结果:
    8000 (2694,)
    (33, 13)
    '''
    隐马尔科夫模型相关API:----音频识别
    import hmmlearn.hmm as hl
    # n_components: 用几个高斯分布函数拟合样本数据
    # covariance_type: 相关矩阵的辅对角线进行相关性比较
    # n_iter: 最大迭代上限
    model = hl.GaussianHMM(n_components=4, covariance_type='diag', n_iter=1000)
    model.fit(mfccs)
    # 使用模型匹配测试mfcc矩阵的分值
    score = model.score(test_mfccs)

    案例:对speeches文件夹下的七个单词文件进行语音识别
    步骤:
    1.读取每个音频类别的文件夹,加载每个类别的音频文件数据
    2.得到每个音频的mfcc,训练HMM模型
    3.每个类别将会训练得到一个HMM模型,并保存模型
    4.读取测试数据,得到测试音频的mfcc
    5.使用每个HMM模型对该mfcc进行得分预测,取其大者作为音频类别
    '''
    import os
    import numpy as np
    import scipy.io.wavfile as wf
    import python_speech_features as sf
    import hmmlearn.hmm as hl


    def search_files(directory):
    # 读取目录的内容,返回一个字典:{'apple':[url1,url2...],'banana':[url1,url2...],}
    # 把directory目录改为当前平台系统所能识别的目录
    directory = os.path.normpath(directory)
    objects = {}
    # curdir当前文件夹,subdirs子文件夹,files子文件夹项下的文件
    for curdir, subdirs, files in os.walk(directory):
    for file in files:
    if file.endswith('.wav'):
    label = curdir.split(os.path.sep)[-1]
    if label not in objects:
    objects[label] = []
    path = os.path.join(curdir, file)
    objects[label].append(path)
    return objects


    print(search_files('../ml_data/speeches/training/'))

    # 整理训练集
    train_samples = search_files('../ml_data/speeches/training/')
    train_x, train_y = [], []
    for label, filenames in train_samples.items():
    mfccs = np.array([])
    for filename in filenames:
    sample_rate, sigs = wf.read(filename)
    mfcc = sf.mfcc(sigs, sample_rate)
    if len(mfccs) == 0:
    mfccs = mfcc
    else:
    mfccs = np.append(mfccs, mfcc, axis=0)
    train_x.append(mfccs)
    train_y.append(label)

    # 基于HMM模型,训练样本
    # models: {'apple':<model object>, ...}
    models = {}
    for mfccs, label in zip(train_x, train_y):
    model = hl.GaussianHMMz(n_components=4, covariance_type='diag', n_iter=1000)
    models[label] = model.fit(mfccs)

    # 针对测试集样本进行测试

    # 整理测试集
    test_samples = search_files('../ml_data/speeches/testing/')
    test_x, test_y = [], []
    for label, filenames in test_samples.items():
    mfccs = np.array([])
    for filename in filenames:
    sample_rate, sigs = wf.read(filename)
    mfcc = sf.mfcc(sigs, sample_rate)
    if len(mfccs) == 0:
    mfccs = mfcc
    else:
    mfccs = np.append(mfccs, mfcc, axis=0)
    test_x.append(mfccs)
    test_y.append(label)

    # test_x与test_y有7组数据
    # 遍历test_x,使用每个HMM模型对同一个样本进行得分判比
    pred_test_y = []
    for mfccs in test_x:
    best_score, best_label = None, None
    for label, model in models.items():
    score = model.score(mfccs)
    if (best_score is None) or (best_score < score):
    best_score = score
    best_label = label
    pred_test_y.append(best_label)

    print(test_y)
    print(pred_test_y)
  • 相关阅读:
    1050. String Subtraction
    1041. Be Unique
    1033. 旧键盘打字
    1029. 旧键盘
    1080. Graduate Admission
    1083. List Grades
    1075. PAT Judge
    sed指令进阶操作
    Mysql最大连接数
    javascript自写工具方法
  • 原文地址:https://www.cnblogs.com/yuxiangyang/p/11241257.html
Copyright © 2020-2023  润新知