news 2026/4/18 16:36:24

语音指令分类模型训练(基于机器学习方法)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
语音指令分类模型训练(基于机器学习方法)

1、统计音频长度信息,便于后续参数的设定

import os import librosa import numpy as np # 配置参数 DATA_PATH = "data4c" # 数据集根目录 FIXED_SAMPLE_RATE = 16000 def stat_audio_lengths(): # 存储所有音频的长度(采样点数)和时长(秒) all_lengths = [] all_durations = [] # 遍历所有类别文件夹 labels = os.listdir(DATA_PATH) for label in labels: label_path = os.path.join(DATA_PATH, label) if not os.path.isdir(label_path): continue # 遍历文件夹下所有音频文件 for fname in os.listdir(label_path): fpath = os.path.join(label_path, fname) try: # 读取音频 y, sr = librosa.load(fpath, sr=FIXED_SAMPLE_RATE) length = len(y) # 长度:采样点数 duration = length / sr # 时长:秒 all_lengths.append(length) all_durations.append(duration) # 打印单个文件信息 print(f"{fpath} -> 采样点数: {length}, 时长: {duration:.2f}s") except Exception as e: print(f"读取失败: {fpath} -> {e}") # 计算统计指标 if all_lengths: print(f"总文件数: {len(all_lengths)}") print( f"采样点数 - 最大值: {np.max(all_lengths)}, 最小值: {np.min(all_lengths)}, 平均值: {np.mean(all_lengths):.0f}") print( f"时长 - 最大值: {np.max(all_durations):.2f}s, 最小值: {np.min(all_durations):.2f}s, 平均值: {np.mean(all_durations):.2f}s") else: print("没有读取任何音频文件!") # 运行统计 if __name__ == "__main__": stat_audio_lengths()

2、加载数据集,提取mfcc特征,并特征对齐

import os import librosa import numpy as np from sklearn.model_selection import train_test_split FIXED_SAMPLE_RATE = 16000 # 统一采样率16000Hz(语音标准) MAX_LEN = 36000 # 采样点 N_MFCC = 13 # 特征数,通常取13维 # 加载数据集(用于机器学习模型分类) # X_2d:(samples, n_mfcc_feature), y_1d:(samples,) def load_data4ml(data_pt): X, y = [], [] labels = os.listdir(data_pt) f = open("result/label.txt", 'w+') for label in labels: folder = os.path.join(data_pt, label) f.write(str(label) + " " + label + "\n") for fname in os.listdir(folder): fpath = os.path.join(folder, fname) # y:音频时域信号 sr:采样率 y_audio, sr = librosa.load(fpath, sr=FIXED_SAMPLE_RATE) # 提取MFCC特征 mfccs = librosa.feature.mfcc( y=y_audio, sr=sr, n_mfcc=N_MFCC, # 提取13维MFCC n_fft=512, # FFT窗长 hop_length=256, # 帧移 n_mels = 40 # 梅尔滤波器组数量 ) # 统一帧数,末尾补零 / 截断尾部 n_mfcc, current_frames = mfccs.shape if current_frames > MAX_LEN: # 过长: 截断尾部 mfccs_fixed = mfccs[:, :MAX_LEN] else: # 过短: 在末尾补零 pad_length = MAX_LEN - current_frames mfccs_fixed = np.pad(mfccs, ((0, 0), (0, pad_length)), mode='constant') # 特征归一化(特征维度N_MFCC, 帧数MAX_LEN) mfcc = (mfccs_fixed - np.mean(mfccs_fixed,axis=1,keepdims=True))/(np.std(mfccs_fixed,axis=1,keepdims=True)+1e-8) # 一阶差分 + 二阶差分, 拼接成 39 维特征 delta_mfcc = librosa.feature.delta(mfcc) delta2_mfcc = librosa.feature.delta(mfcc, order=2) mfcc_39d = np.concatenate([mfcc, delta_mfcc, delta2_mfcc], axis=0) feature = mfcc_39d.flatten() # 2d特征-->1d特征 X.append(feature) y.append(label) X= np.array(X) y = np.array(y) X_train, X_test, y_train, y_test = train_test_split(X, y) print("训练样本及标签:",X_train.shape,y_train.shape) print("测试样本及标签:",X_test.shape,y_test.shape) return X_train, X_test, y_train, y_test

3、使用机器学习算法训练语音分类模型

import joblib from sklearn.svm import SVC from sklearn.neighbors import KNeighborsClassifier from sklearn.neural_network import MLPClassifier from read_data import load_data4ml def train(data_path): X_train, X_test, y_train, y_test =load_data4ml(data_path) print(X_train.shape, X_test.shape, y_train.shape, y_test.shape) # 训练KNN模型,适合指令识别 # model = KNeighborsClassifier(n_neighbors=5) # 支持向量机 # model = SVC() # 多层感知机 model = MLPClassifier(hidden_layer_sizes=(200,100),activation="relu") model.fit(X_train, y_train) # 测试准确率 acc = model.score(X_test, y_test) print(f"训练完成!\n测试准确率:{acc * 100:.2f}%") # 保存模型 if acc>=0.85: joblib.dump(model, "result/mlp_model.pkl") print("模型已保存:result/mlp_model.pkl") if __name__ == "__main__": train(data_path="data4c")

4、使用训练好的模型进行测试

import joblib import librosa import numpy as np from read_data import FIXED_SAMPLE_RATE, MAX_LEN, N_MFCC def process_data(fpt): # y:音频时域信号 sr:采样率 y_audio, sr = librosa.load(fpt, sr=FIXED_SAMPLE_RATE) # 提取MFCC特征 mfccs = librosa.feature.mfcc( y=y_audio, sr=sr, n_mfcc=N_MFCC, # 提取13维MFCC n_fft=512, # FFT窗长 hop_length=256, # 帧移 n_mels=40 # 梅尔滤波器组数量 ) # 统一帧数,末尾补零 / 截断尾部 n_mfcc, current_frames = mfccs.shape if current_frames > MAX_LEN: mfccs_fixed = mfccs[:, :MAX_LEN] else: pad_length = MAX_LEN - current_frames mfccs_fixed = np.pad(mfccs, ((0, 0), (0, pad_length)), mode='constant') # 特征归一化(特征维度N_MFCC, 帧数MAX_LEN) mfcc = (mfccs_fixed - np.mean(mfccs_fixed, axis=1, keepdims=True)) / ( np.std(mfccs_fixed, axis=1, keepdims=True) + 1e-8) # 一阶差分 + 二阶差分, 拼接成 39 维特征 delta_mfcc = librosa.feature.delta(mfcc) delta2_mfcc = librosa.feature.delta(mfcc, order=2) mfcc_39d = np.concatenate([mfcc, delta_mfcc, delta2_mfcc], axis=0) feature = mfcc_39d.flatten() # 2d特征-->1d特征 X = np.array([feature]) return X def predict(file): model = joblib.load("result/mlp_model.pkl") X = process_data(file) lb = file.split('/')[-1].split('_')[0] pred = model.predict(X) print(pred) flg = "正确" if pred[0]==lb else "错误" print(f"识别{flg}\t真实标签:{lb}\t识别结果:{pred[0]}\t") return pred[0] if __name__ == "__main__": # 测试样本 file = "test_data/3_1774506934932.wav" predict(file)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 11:04:14

第209章 宏观量子生命(秀秀)

地球重建区的风,带着净化后土壤的微腥和顽强复苏的初生植物的清苦气息,吹拂着秀秀略显凌乱的发梢。她站在一片刚刚完成生物修复的坡地上,脚下是松软的、富含有机质的泥土,与“新大陆”那精确调控、无菌般的人造环境截然不同。这里的每一次呼吸,都带着一种粗糙而真实的生命…

作者头像 李华
网站建设 2026/4/14 11:04:12

Qwen3-14B新手入门:手把手教你用Ollama跑通第一个智能对话

Qwen3-14B新手入门:手把手教你用Ollama跑通第一个智能对话 1. 准备工作:认识Qwen3-14B Qwen3-14B是通义千问系列的最新成员,拥有140亿参数的中等规模语言模型。相比庞大的百亿级模型,它在资源消耗和性能表现之间取得了完美平衡&…

作者头像 李华
网站建设 2026/4/14 11:04:10

Qwen2.5-VL多模态应用:RTX 4090加持,快速实现图片文字提取与内容分析

Qwen2.5-VL多模态应用:RTX 4090加持,快速实现图片文字提取与内容分析 1. 项目概述 Qwen2.5-VL-7B-Instruct是一款专为RTX 4090显卡优化的多模态大模型工具,能够高效处理图文混合任务。本文将带您快速掌握如何利用这款工具实现图片文字提取与…

作者头像 李华
网站建设 2026/4/14 11:00:02

ARM ATF入门-安全固件软件介绍和代码运行

大家都知道硬件之上是软件,本公众号主要介绍“OS与AUTOSAR”,那么除了这两种类型的软件,是否还有别的软件?本文以ARM SOC硬件为例,“打破砂锅,问到底”,来看看还有哪些软件我们没接触到&#xf…

作者头像 李华
网站建设 2026/4/14 11:00:01

一文速成!Pytest自动化框架面试题,帮你全部搞定!

📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中…

作者头像 李华