语音识别SpeechRecognition

语音识别

1. 声音的本质是震动,震动的本质是位移关于时间的函数

Signal: s = f(t)

波形文件(.wav)中记录了不同采样时刻的位移

2. 通过傅里叶变换

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

# audio.py
import numpy as np
import numpy.fft as nf  # 傅立叶变换
import scipy.io.wavfile as wf  # 读取wav文件
import matplotlib.pyplot as mpsample_rate, sigs = wf.read('../data/freq.wav')
print("scamlpe rate:", sample_rate)
print("sigs shape:", sigs.shape, "type:", sigs.dtype)
scamlpe rate: 8000
sigs shape: (3251,) type: int16
sigs = sigs / 2 ** 15  # 信息保留多
times = np.arange(len(sigs)) / sample_rate  # 形成采样时间mp.figure('Audio', dpi=120)mp.subplot(121)
mp.title('Time Domain', fontsize=16)
mp.xlabel('Time', fontsize=12)
mp.ylabel('Signal', fontsize=12)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
mp.plot(times, sigs, c='dodgerblue', label='Signal')
mp.legend()freqs = nf.fftfreq(sigs.size, 1 / sample_rate)  # 频率数组
ffts = nf.fft(sigs)  # 
pows = np.abs(ffts)  # 模mp.subplot(122)
mp.title('Frequency Domain', fontsize=16)
mp.xlabel('Frequency', fontsize=12)
mp.ylabel('Power', fontsize=12)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
mp.plot(freqs[freqs >= 0], pows[freqs >= 0], c='orangered', label='Power')
mp.legend()
mp.tight_layout()
mp.show()

png

3. 梅尔频率倒谱系数(MFCC)

通过与声音内容密切相关的13个特殊频率所对应的能量分布,作为语音的特征。

# mfcc.py
import numpy as np
import numpy.fft as nf
import scipy.io.wavfile as wf
import python_speech_features as sf  # python的语音特征抽取
import matplotlib.pyplot as mpsample_rate, sigs = wf.read('../data/speeches/training/orange/orange01.wav')
mfcc = sf.mfcc(sigs, sample_rate)
print("mfcc's shape:", mfcc.shape)
mfcc's shape: (74, 13)
mp.figure('MFCC', dpi=200)
mp.matshow(mfcc.T, cmap='gist_rainbow', fignum='MFCC')
mp.title('MFCC', fontsize=16)
mp.xlabel('Sample', fontsize=12)
mp.ylabel('Feature', fontsize=12)
mp.tick_params(which='both', top=False, labeltop=False, labelbottom=True, labelsize=10)
mp.show()

png

4. 语音识别

# |____training
# | |____apple
# | | |____apple07.wav
# | |____lime
# | | |____lime07.wav
# | | |____lime13.wav
# |____testing
# | |____apple
# | | |____apple15.wav
# | |____kiwi
# | | |____kiwi15.wav
# | |____lime
# | | |____lime15.wav....
# spch.py
import os  # 要从目录中检索
import warnings
import numpy as np
import scipy.io.wavfile as wf
import python_speech_features as sf
import hmmlearn.hmm as hl  # warnings.filterwarnings('ignore', category=DeprecationWarning)
np.seterr(all='ignore')def search_speeches(directory, speeches):directory = os.path.normpath(directory)  # 将路径格式转换为本机格式if not os.path.isdir(directory):raise IOError("The directory" + directory + "doesn't exist")for entry in os.listdir(directory):label = directory[directory.rfind(os.path.sep) + 1:]  # 本机分隔符path = os.path.join(directory, entry)if os.path.isdir(path):  # 如果path是目录search_speeches(path, speeches)elif os.path.isfile(path) and path.endswith('wav'):  # 判断是否为文件if label not in speeches:speeches[label] = []speeches[label].append(path)
# 训练数据的输入输出
train_speeches = {}  # 
search_speeches('../data/speeches/training', train_speeches)
train_x, train_y = [], []
for label, filenames in train_speeches.items():mfccs = np.array([])for filename in filenames:saple_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)
print(len(train_x), len(train_y))
7 7
# 训练模型
models = {}
for mfccs, label in zip(train_x, train_y):# 高斯 hidden 马尔可夫 模型 (基于高斯分布的隐马尔可夫模型)model = hl.GaussianHMM(n_components=4, covariance_type='diag', n_iter=1000)models[label] = model.fit(mfccs)
# 测试数据的测试
test_speeches = {}  # 
search_speeches('../data/speeches/testing', test_speeches)
test_x, test_y = [], []
for label, filenames in test_speeches.items():mfccs = np.array([])for filename in filenames:saple_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)pred_test_y = []
for mfccs in test_x:best_score, best_label = None, Nonefor label, model in models.items():score = model.score(mfccs)  # 相似度得分if (best_score is None) or (best_score < score):best_score, best_label = score, labelpred_test_y.append(best_label)print(test_y)
print(pred_test_y)
['apple', 'kiwi', 'lime', 'banana', 'pineapple', 'orange', 'peach']
['apple', 'kiwi', 'lime', 'banana', 'pineapple', 'orange', 'peach']

5. 声音合成

import json
import numpy as np
import scipy.io.wavfile as wfwith open('../data/12.json', 'r') as f:freqs = json.loads(f.read())
print(freqs)
{'C0': 16.35, 'C#0': 17.32, 'D0': 18.35, 'D#0': 19.45, 'E0': 20.6, 'F0': 21.83, 'F#0': 23.12, 'G0': 24.5, 'G#0': 25.96, 'A0': 27.5, 'A#0': 29.14, 'B0': 30.87, 'C1': 32.7, 'C#1': 34.65, 'D1': 36.71, 'D#1': 38.89, 'E1': 41.2, 'F1': 43.65, 'F#1': 46.25, 'G1': 49.0, 'G#1': 51.91, 'A1': 55.0, 'A#1': 58.27, 'B1': 61.74, 'C2': 65.41, 'C#2': 69.3, 'D2': 73.42, 'D#2': 77.78, 'E2': 82.41, 'F2': 87.31, 'F#2': 92.5, 'G2': 98.0, 'G#2': 103.83, 'A2': 110.0, 'A#2': 116.54, 'B2': 123.47, 'C3': 130.81, 'C#3': 138.59, 'D3': 146.83, 'D#3': 155.56, 'E3': 164.81, 'F3': 174.61, 'F#3': 185.0, 'G3': 196.0, 'G#3': 207.65, 'A3': 220.0, 'A#3': 233.08, 'B3': 246.94, 'C4': 261.63, 'C#4': 277.18, 'D4': 293.66, 'D#4': 311.13, 'E4': 329.63, 'F4': 349.23, 'F#4': 369.99, 'G4': 392.0, 'G#4': 415.3, 'A4': 440.0, 'A#4': 466.16, 'B4': 493.88, 'C5': 523.25, 'C#5': 554.37, 'D5': 587.33, 'D#5': 622.25, 'E5': 659.25, 'F5': 698.46, 'F#5': 739.99, 'G5': 783.99, 'G#5': 830.61, 'A5': 880.0, 'A#5': 932.33, 'B5': 987.77, 'C6': 1046.5, 'C#6': 1108.73, 'D6': 1174.66, 'D#6': 1244.51, 'E6': 1318.51, 'F6': 1396.91, 'F#6': 1479.98, 'G6': 1567.98, 'G#6': 1661.22, 'A6': 1760.0, 'A#6': 1864.66, 'B6': 1975.53, 'C7': 2093.0, 'C#7': 2217.46, 'D7': 2349.32, 'D#7': 2489.02, 'E7': 2637.02, 'F7': 2793.83, 'F#7': 2959.96, 'G7': 3135.96, 'G#7': 3322.44, 'A7': 3520.0, 'A#7': 3729.31, 'B7': 3951.07, 'C8': 4186.01, 'C#8': 4434.92, 'D8': 4698.63, 'D#8': 4978.03, 'E8': 5274.04, 'F8': 5587.65, 'F#8': 5919.91, 'G8': 6271.93, 'G#8': 6644.88, 'A8': 7040.0, 'A#8': 7458.62, 'B8': 7902.13}
tones = [('G5', 1.5),('A5', 0.5),('G5', 1.5),('E5', 0.5),('D5', 0.5),('E5', 0.5),('D5', 0.5),('C5', 0.5),('A4', 0.5),('C5', 0.75)]sample_rate = 44100
music = np.empty(shape=1)
for tone, duration in tones:times = np.linspace(0, duration, duration * sample_rate)sound = np.sin(2 * np.pi * freqs[tone] * times)music = np.append(music, sound)
music *= 2 ** 15
music = music.astype(np.int16)wf.write('../data/music1.wav', sample_rate, music)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30091.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

各种情人节,程序员教你5个表白代码,牢牢主抓她的心

刚过完年就来到了一个相当重要的节日&#xff1a;情人节。一个有人欢喜有人愁的节日&#xff0c;虽然对一些单身人士不太友好&#xff0c;但还有不少人都在等这个节日进行表白。毕竟这个日子的成功率会高一些。 情人节少不了送花送礼物&#xff0c;作为一个程序员&#xff0c;…

技术创业者必读:从验证想法到技术产品商业化的全方位解析

导语 | 技术创业之路往往充满着挑战和不确定性&#xff0c;对于初入创业领域的人来说&#xff0c;如何验证自己的创业想法是否有空间、如何选择靠谱的投资人、如何将技术产品商业化等问题都需要认真思考和解决。在「TVP 技术夜未眠」第六期直播中&#xff0c;正马软件 CTO、腾讯…

麦肯锡给CEO的元宇宙指南

ChatGPT突然大张旗鼓地登上全球新闻的头条时&#xff0c;元宇宙似乎如明日黄花般过气了&#xff0c;未来渺茫起来。而麦肯锡的4位合伙人在今年1月给全球CEO们的“元宇宙指南”中强调&#xff0c;“太大元宇宙 &#xff0c;不容忽视”。《元宇宙日爆》编译了这份指南供企业管理者…

AI大模型只能沦为“锦上添花”吗?

出品 | 虎嗅科技组作者 | 齐健编辑 | 廖影头图 | 虎嗅 “每个人咨询的第一个问题都是&#xff1a;你们在大模型方面做了什么&#xff1f;” 7月8日&#xff0c;2023世界人工智能大会&#xff08;下称WAIC&#xff09;&#xff0c;一位参展商告诉笔者他的感受。——“大模型”&a…

chatgpt赋能python:Python在Win7上的安装教程

Python在Win7上的安装教程 如果你是一名Win7用户&#xff0c;并且打算开始学习或者使用Python编程语言&#xff0c;那么本文将会为你提供一个简单易懂的Python安装教程。 1. 下载Python 在安装Python之前&#xff0c;你需要先去Python的官方网站&#xff08;https://www.pyt…

chatgpt赋能python:Python安装两个版本详细教程

Python安装两个版本详细教程 Python是一种广泛使用的编程语言&#xff0c;由于不同版本之间的差异&#xff0c;部分开发者需要同时安装两个不同版本的Python。本篇文章将为大家详细介绍Python安装两个版本的方法。 为何需要安装两个不同版本的Python Python的发行版&#xf…

chatgpt赋能python:使用Python编写的程序如何运行

使用Python编写的程序如何运行 Python是一种高级编程语言&#xff0c;适用于多种应用&#xff0c;例如Web开发&#xff0c;数据分析和人工智能。很多人都知道Python是一种很强大的语言&#xff0c;但是他们可能不知道如何运行Python程序。在这篇文章中&#xff0c;我们将介绍P…

chatgpt赋能python:Python程序运行方法介绍

Python 程序运行方法介绍 在 Python 编程中&#xff0c;了解如何运行程序是非常重要的。本篇文章将介绍 Python 中如何运行程序&#xff0c;以及不同的运行方法及其优缺点。作为一名有10年 Python 编程经验的工程师&#xff0c;我相信这篇文章将对 Python 新手和有经验的开发者…

chatgpt赋能python:Python怎么post请求

Python怎么post请求 Python作为一种高级编程语言&#xff0c;拥有丰富的库和模块来处理各种编程任务。其中&#xff0c;处理网络请求和数据交互是Python非常擅长的领域之一。在Python中&#xff0c;我们可以使用标准库或第三方库的HTTP模块来实现HTTP协议的请求和响应。 本篇…

chatgpt赋能python:Python导入包的完整指南

Python导入包的完整指南 如果你是一个Python程序员&#xff0c;你一定知道模块和包在Python中的重要性。Python中有很多内置的模块和包&#xff0c;但是有时候这些内置模块和包不能满足我们的需求&#xff0c;这时就需要导入外部的模块和包。本文将介绍Python中如何导入包和模…

chatgpt赋能python:Python:如何直接运行?

Python&#xff1a;如何直接运行&#xff1f; 如果你想学习编程&#xff0c;或者已经是一名资深工程师&#xff0c;你一定听说过Python这门编程语言。Python是一门易于学习和理解的语言&#xff0c;被广泛应用于很多领域&#xff0c;例如科学计算、数据分析、Web开发和人工智能…

chatgpt赋能python:Python如何直接运行?一篇详细指南

Python如何直接运行&#xff1f;一篇详细指南 Python是一种高级编程语言&#xff0c;可作为通用编程语言进行使用。它被广泛应用于数据科学&#xff0c;Web开发&#xff0c;人工智能等领域。Python最大的优势之一就是其容易学习和使用。本文的主旨是向大家介绍如何直接运行Pyt…

全国海关分区图(含副厅)

全国海关分区图&#xff08;含副厅&#xff09;

美国FBA海运详解:美国FBA海运费用价格有哪些

做亚马逊的人都知道亚马逊FBA虽然利润很高&#xff0c;但成本并不低。除了物流运输成本外&#xff0c;还有一些附加费。根据美国对中国征收关税的产品&#xff0c;将有一定的附加费。大部分产品是不用的&#xff0c;这有一些在列的产品才需要加收FBA空运和FBA海运的产品收附加费…

海关查验会查些什么呢?

海关查柜是会产生一些额外费用的&#xff0c;但这些费用不是海关收取的&#xff0c;而是码头收取的吊柜费、拆柜费等费用&#xff0c;因为是海关查验才有此费用&#xff0c;所以码头一般把这些费用称之为海关查验费&#xff0c;码头会开具正规发票的。 这些查柜费是由SHIPPER来…

海关数据|俄罗斯与中国之间的贸易数据

2022年2月24日至今俄乌战争开始的影响&#xff0c;世界粮食、能源等大宗商品的价格已经出现了明显的波动&#xff0c;进一步加剧了全球通胀的态势。那么俄罗斯与中国之间的贸易又发生了那些变化呢&#xff1f;我们通过贸易动力海关数据系统可以直观的看到2021年01-04月份和2022…

中美加征关税HS码清单列表

中美加征关税HS码清单列表 海关编码即HS编码&#xff0c;为编码协调制度的简称。其全称为《商品名称及编码协调制度的国际公约》&#xff08;International Convention for Harmonized Commodity Description and Coding System&#xff09;简称协调制度&#xff08;Harmonize…

美国fba海运清关基本流程

美国fba海运清关是美国物流运输的重要组成部分&#xff0c;准备好清关材料和正确流程是确保货物安全快速进口到美国的关键。虽然很多客户会选择双清包税的方式&#xff0c;但是当跨境电商越来越大的时候&#xff0c;双清包税的成本也会相应增加。选择自税不包清关&#xff0c;按…

加拿大FBA海运详细说明

从地理环境来看&#xff0c;决定加拿大海运FBA头程物流这一块&#xff0c;都靠的温哥华/王子港着陆。加拿大的亚马逊仓库分布范围&#xff0c;主要包括YVR、YXX,YYC、YEG,YYZ,YOW,YMHYOO八个系列仓针对这个现象&#xff0c;目前市面上推出了温哥华定提快线&#xff0c;即所有货…

海运到美国整柜多少钱?

美国FBA整柜是指&#xff0c;针对亚马逊卖家单次货量达20尺小柜(20GP)、40尺大柜(40GP)、40尺高柜(40HQ)三种形式的标准货柜&#xff0c;用集装箱海运作为头程运输&#xff0c;到达美国洛杉矶、纽约等港口完成清关后&#xff0c;再到联特美国仓库按照FBA入仓标准操作完毕后&…