分享好友 最新动态首页 最新动态分类 切换频道
【class14】人工智能初步之语音识别
2024-12-26 08:46
以下是从提供的《实验指导.docx》文档中提炼出来的关于人工智能语音识别Python代码概要: ### 1. 解压数据集 ```python !unzip -q data/data300576/recordings.zip -d wc_work ``` ### 2. 切分数据集 ```python import os import random # 获取所有音频文件路径 recordings = ['recordings/' + name for name in os.listdir('work/recordings')] total = [] # 遍历每个音频文件路径,提取标签 for recording in recordings: label = int(recording[11]) total.append(f'{recording} {label}') # 创建训练集、验证集和测试集文件 train = open('work/train.tsv', 'w', encoding='UTF-8') dev = open('work/dev.tsv', 'w', encoding='UTF-8') test = open('work/test.tsv', 'w', encoding='UTF-8') # 打乱数据顺序 random.shuffle(total) # 确定数据集划分的索引 split_num = int((len(total) - 100) * 0.9) # 写入训练集数据 for line in total[:split_num]: train.write(line) # 写入验证集数据 for line in total[split_num:-100]: dev.write(line) # 写入测试集数据 for line in total[-100:]: test.write(line) # 关闭文件 train.close() dev.close() test.close() ``` ### 3. 音频数据预处理 ```python import random import numpy as np import scipy.io.wavfile as wav from python_speech_features import mfcc, delta def get_mfcc(data, fs): # 提取MFCC特征 wav_feature = mfcc(data, fs) # 计算一阶差分 d_mfcc_feat = delta(wav_feature, 1) # 计算二阶差分 d_mfcc_feat2 = delta(wav_feature, 2) # 拼接特征 feature = np.concatenate([ wav_feature.reshape(1, -1, 13), d_mfcc_feat.reshape(1, -1, 13), d_mfcc_feat2.reshape(1, -1, 13) ], axis=0) # 统一时间维度 if feature.shape[1] > 64: feature = feature[:, :64, :] else: feature = np.pad(feature, ((0, 0), (0, 64 - feature.shape[1]), (0, 0)), 'constant') # 调整数据维度 feature = feature.transpose((2, 0, 1)) feature = feature[np.newaxis, :] return feature def loader(tsv): datas = [] with open(tsv, 'r', encoding='UTF-8') as f: for line in f: audio, label = line.strip().split(' ') fs, signal = wav.read('work/' + audio) feature = get_mfcc(signal, fs) datas.append([feature, int(label)]) return datas def reader(datas, batch_size, is_random=True): features = [] labels = [] if is_random: random.shuffle(datas) for data in datas: feature, label = data features.append(feature) labels.append(label) if len(labels) == batch_size: features = np.concatenate(features, axis=0).reshape(-1, 13, 3, 64).astype('float32') labels = np.array(labels).reshape(-1, 1).astype('int64') yield features, labels features = [] labels = [] ``` ### 4. 模型搭建 ```python import paddle.fluid as fluid from paddle.fluid.dygraph import Linear, Conv2D, BatchNorm from paddle.fluid.layers import softmax_with_cross_entropy, accuracy, reshape class Audio(fluid.dygraph.Layer): def __init__(self): super(Audio, self).__init__() self.conv1 = Conv2D(13, 16, 3, 1, 1) self.conv2 = Conv2D(16, 16, (3, 2), (1, 2), (1, 0)) self.conv3 = Conv2D(16, 32, 3, 1, 1) self.conv4 = Conv2D(32, 32, (3, 2), (1, 2), (1, 0)) self.conv5 = Conv2D(32, 64, 3, 1, 1) self.conv6 = Conv2D(64, 64, (3, 2), 2) self.fc1 = Linear(8 * 64, 128) self.fc2 = Linear(128, 10) def forward(self, inputs, labels=None): out = self.conv1(inputs) out = self.conv2(out) out = self.conv3(out) out = self.conv4(out) out = self.conv5(out) out = self.conv6(out) out = reshape(out, [-1, 8 * 64]) out = self.fc1(out) out = self.fc2(out) if labels is not None: loss = softmax_with_cross_entropy(out, labels) acc = accuracy(out, labels) return loss, acc else: return out ``` ### 5. 查看网络结构 ```python import paddle audio_network = Audio() paddle.summary(audio_network, input_size=[(64, 13, 3, 64)], dtypes=['float32']) ``` ### 6. 模型训练 ```python import numpy as np import paddle.fluid as fluid from visualdl import LogWriter from paddle.fluid.optimizer import Adam from paddle.fluid.dygraph import to_variable, save_dygraph writer = LogWriter(logdir="https://blog.csdn.net/fmc121104/article/details/log/train") train_datas = loader('work/train.tsv') dev_datas = loader('work/dev.tsv') place = fluid.CPUPlace() epochs = 10 with fluid.dygraph.guard(place): model = Audio() optimizer = Adam(learning_rate=0.001, parameter_list=model.parameters()) global_step = 0 max_acc = 0 for epoch in range(epochs): model.train() train_reader = reader(train_datas, batch_size=64) for step, data in enumerate(train_reader): signal, label = [to_variable(_) for _ in data] loss, acc = model(signal, label) if step % 20 == 0: print(f'train epoch: {epoch} step: {step}, loss: {loss.numpy().mean()}, acc: {acc.numpy()}') writer.add_scalar(tag='train_loss', step=global_step, value=loss.numpy().mean()) writer.add_scalar(tag='train_acc', step=global_step, value=acc.numpy()) global_step += 1 loss.backward() optimizer.minimize(loss) model.clear_gradients() model.eval() dev_reader = reader(dev_datas, batch_size=64, is_random=False) accs = [] losses = [] for data in dev_reader: signal, label = [to_variable(_) for _ in data] loss, acc = model(signal, label) losses.append(loss.numpy().mean()) accs.append(acc.numpy()) avg_acc = np.array(accs).mean() avg_loss = np.array(losses).mean() if avg_acc > max_acc: max_acc = avg_acc print(f'the best accuracy: {max_acc}') print('saving the best model') save_dygraph(optimizer.state_dict(), 'best_model') save_dygraph(model.state_dict(), 'best_model') print(f'dev epoch: {epoch}, loss: {avg_loss}, acc: {avg_acc}') writer.add_scalar(tag='dev_loss', step=epoch, value=avg_loss) writer.add_scalar(tag='dev_acc', step=epoch, value=avg_acc) print(f'the best accuracy: {max_acc}') print('saving the final model') save_dygraph(optimizer.state_dict(), 'final_model') save_dygraph(model.state_dict(), 'final_model') ``` ### 7. 模型测试 ```python import os import numpy as np import paddle.fluid as fluid from paddle.fluid.dygraph import to_variable, load_dygraph test_datas = loader('work/test.tsv') print(f'{len(test_datas)} data in test set') with fluid.dygraph.guard(fluid.CPUPlace()): model = Audio() model.eval() params_dict, _ = load_dygraph('best_model') model.set_dict(params_dict) test_reader = reader(test_datas, batch_size=100, is_random=False) accs = [] for data in test_reader: signal, label = [to_variable(_) for _ in data] _, acc = model(signal, label) accs.append(acc.numpy()) avg_acc = np.array(accs).mean() print(f'test acc: {avg_acc}') ``` ### 8. 用训练好的模型识别语音 ```python import numpy as np import webrtcvad import paddle.fluid as fluid from paddle.fluid.dygraph import to_variable, load_dygraph def vad(file_path, mode=3): samp_rate, signal_data = wav.read(file_path) vad = webrtcvad.Vad(mode=mode) signal = np.pad(signal_data, (0, 160 - (signal_data.shape[0] % int(samp_rate * 0.02))), 'constant') lens = signal.shape[0] signals = np.split(signal, lens // int(samp_rate * 0.02)) audio = [] audios = [] for signal_item in signals: if vad.is_speech(signal_item.tobytes(), samp_rate): audio.append(signal_item) elif len(audio) > 0 and not vad.is_speech(signal_item.tobytes(), samp_rate): audios.append(np.concatenate(audio, 0)) audio = [] return audios, samp_rate audios, samp_rate = vad('data/audio.wav') features = [] for audio in audios: feature = get_mfcc(audio, samp_rate) features.append(feature) features = np.concatenate(features, 0).astype('float32') with fluid.dygraph.guard(place=fluid.CPUPlace()): model = Audio() params_dict, _ = load_dygraph('final_model') model.set_dict(params_dict) model.eval() features = to_variable(features) out = model(features) result = ' '.join([str(num) for num in np.argmax(out.numpy(), 1).tolist()]) print(f'语音数字的识别结果是:{result}') ```
最新文章
预算管理有哪些功能,如何使用
预算管理支持“费用预算”、“按量编制预算”、“使用率与覆盖率预算”三种预算类型:费用预算:您可以按照财务单元、账号、产品等维度,设置以年、季、月为周期的消费金额预算和对应的预警阈值。当实际消费金额或预测金额达到您设置的预警
被人遗忘的MAX_FILE_SIZE文件上传限制大小参数
 在文件上传中,我们经常会要求显 示用户上传文件大小,超过上传限制的文件就会不允许用户上传。虽然我们可以用程序去判断上传文件是否超过限制,但是其实我们的PHP程序是无法判断用户本 地文件大小的。所以等到我们的PHP来判断文件大小的
【WPS WORD】关于如何快速整理从知网论文中复制过来的文档内容及格式
最近写了一篇文摘性质的报告,由于内容基本取自知网论文,免不了要对下载的内容进行复制粘贴和整理。 众所周知,知网的论文有两种常用下载格式:pdf格式(期刊论文)和caj格式(学位论文)
自己建立公司网站,步骤与策略全解析
在当今数字化的时代,拥有一个专业的公司网站是提升企业品牌形象、扩大市场影响力的重要途径。自己建立公司网站不仅可以节省成本,还能确保网站设计与企业文化和业务需求的高度匹配。本文将为您提供一些关键步骤和策略,帮助您从零开始搭建
风水玄学命理排盘测算工具小程序软件系统搭建开发(成熟案例)
 风水玄学命理排盘测算工具软件开发 需求分析:在开发过程中,我们首先对用户需求进行了深入的调查和分析,了解了用户在使用风水玄学命理排盘测算工具时的需求和痛点,为后续的功能设计和实现提供了有力的支持。 功能设计:根据需求分析
学习总结4
假设开始为1,第二个位置有2和3两个数供选择,如果第2个数选择3,那么第3个数只能选2.返回第二步则可以选择2,又生成另一种排序。之前acm社团讲题时提到过这个算法,但没有代码演示,遂没有深究。但只
支付解决方案一:接入第三方支付,化解电商平台出入金风险!微三云麦超介绍
支付解决方案一:接入第三方支付,化解电商平台出入金风险!微三云麦超介绍前文介绍:微三云云平台分布式系统实现一个系统双服务器部署,核心底层与前端应用分开服务 器部署,基本杜绝类似旧商城和市场上大部分系统黑客通过各种路径进行攻
限时免费!用AI生成超真实美女写真,轻松一键体验!
访问平台:在手机或电脑上搜索【搜狐简单AI】,进入网站或微信小程序。注册账户:如果你还没有账户,按照提示进行注册,完成之后可享受更多功能。选择类型:在主界面选择“美女写真”或其他相关选项,确保你的需求得到满足。上传图片:根据
计算机的硬件包括外部设备和什么,深度详析落实_ZXC版?HII7664
计算机硬件主要包括外部设备(如显示器、键盘等)和内部设备(如CPU、&
怎么把python模型部署到线上_NLP第18课:模型部署上线的几种服务发布方式
在前面所有的模型训练和预测中,我们训练好的模型都是直接通过控制台或者 Jupyter Notebook 来进行预测和交互的,在一个系统或者项目中使用这种方式显然不可能,那在 Web 应用中如何使用我们训练好的模型呢?本文
相关文章
推荐文章
发表评论
0评