热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

利用Python实现高效语音识别技术

本文探讨了利用Python实现高效语音识别技术的方法。通过使用先进的语音处理库和算法,本文详细介绍了如何构建一个准确且高效的语音识别系统。提供的代码示例和实验结果展示了该方法在实际应用中的优越性能。相关文件可从以下链接下载:链接:https://pan.baidu.com/s/1RWNVHuXMQleOrEi5vig_bQ,提取码:p57s。

本文所用文件的链接

链接:https://pan.baidu.com/s/1RWNVHuXMQleOrEi5vig_bQ
提取码:p57s

语音识别

语音识别可以实现通过一段音频信息(wav波) 识别出音频的内容.

通过傅里叶变换, 可以将时间域的声音分解为一系列不同频率的正弦函数的叠加. 通过频率谱线的特殊分布, 建立音频内容与文本之间的对应关系, 以此作为模型训练的基础.

语音识别

梅尔频率倒谱系数(MFCC) 描述了与声音内容密切相关的13个特殊频率所对应的能量分布. 那么我们就可以使用梅尔频率倒谱系数(MFCC)矩阵作为语音识别的特征. 基于隐马尔科夫模型进行模式识别, 找到测试样本最匹配的声音模型, 从而识别语音内容.

  1. 准备多个声音样本作为训练数据. 并且为每个音频都标明其类别.
  2. 读取每一个音频文件, 获取音频文件的mfcc矩阵.
  3. 以mfcc作为训练样本, 进行训练.
  4. 对测试样本进行测试. (基于隐马模型)

MFCC相关API:

import scipy.io.wavfile as wf
import python_speech_features as sfsample_rate, sigs = wf.read('../xx.wav')
mfcc = sf.mfcc(sigs, sample_rate)

案例: MFCC提取

"""
MFCC提取
"""

import scipy.io.wavfile as wf
import python_speech_features as sf
import matplotlib.pyplot as mpsample_rate, sigs=wf.read('../ml_data/filter.wav')
mfcc = sf.mfcc(sigs, sample_rate)
print(mfcc.shape)mp.matshow(mfcc.T, cmap='gist_rainbow')
mp.title('MFCC')
mp.ylabel('Features', fontsize=14)
mp.xlabel('Samples', fontsize=14)
mp.tick_params(labelsize=10)
mp.show()

在这里插入图片描述
隐马尔科夫模型相关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_mfcc)

案例:

"""
语音识别
"""

import os
import numpy as np
import scipy.io.wavfile as wf
import python_speech_features as sf
import hmmlearn.hmm as hldef search_files(directory):directory = os.path.normpath(directory)# {'apple':[dir,dir,dir], 'banana':[dir..]}objects = {}#当前目录, 当前目录子目录, 文件列表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 objectstrain_samples = \search_files('../ml_data/speeches/training')# 整理训练集, 把每一个类别中的音频的mfcc
# 摞在一起, 基于隐马模型开始训练.
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 = mfccelse:mfccs = np.append(mfccs, mfcc, axis=0)train_x.append(mfccs)train_y.append(label)# 基于隐马模型进行训练, 把所有类别的模型都存起来
# 一共7个类别循环7次
models = {}
for mfccs, label in zip(train_x, train_y):model = hl.GaussianHMM(n_components=4, covariance_type='diag', n_iter=1000)models[label] = model.fit(mfccs)# 读取测试集中的文件, 使用每个模型对文件进行
# 评分, 取分值大的模型对应的label作为预测类别
test_samples = \search_files('../ml_data/speeches/testing')# 整理测试集, 提取每一个文件的mfcc
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 = mfccelse:mfccs = np.append(mfccs, mfcc, axis=0)test_x.append(mfccs)test_y.append(label)# 使用7个模型, 对每一个文件进行预测得分.
pred_test_y = []
# test_x一共7个样本, 遍历7次, 每次验证1个文件
for mfccs in test_x:best_score, best_label &#61; None, Nonefor label, model in models.items():score &#61; model.score(mfccs)if (best_score is None) or \(best_score < score):best_score, best_label&#61;score,labelpred_test_y.append(best_label)print(test_y)
print(pred_test_y)


推荐阅读
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 解决Element UI中Select组件创建条目为空时报错的问题
    本文介绍如何在Element UI的Select组件中使用allow-create属性创建新条目,并处理创建条目为空时出现的错误。我们将详细说明filterable属性的必要性,以及default-first-option属性的作用。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • PyCharm中配置Pylint静态代码分析工具
    本文详细介绍如何在PyCharm中配置和使用Pylint,帮助开发者进行静态代码检查,确保代码符合PEP8规范,提高代码质量。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 本文详细介绍了如何在ECharts中使用线性渐变色,通过echarts.graphic.LinearGradient方法实现。文章不仅提供了完整的代码示例,还解释了各个参数的具体含义及其应用场景。 ... [详细]
author-avatar
小dej_531
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有