ASR-语音预处理(二):时域转频域

2024-08-24 17:38

本文主要是介绍ASR-语音预处理(二):时域转频域,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一.时域转频域
  • 二.代码:
  • 三.程序输出:

一.时域转频域

这节主要介绍如何经过傅里叶变换将音频转到频域,以便于后续的特征提取和识别。先后进行加窗、分帧、FFT和取log操作。
输入:音频矩阵wavsignal ,帧率fs
例:[[1507 1374 1218 … -78 -127 -43]],16000
输出:转成频域后的音频矩阵data_input

二.代码:

#coding=utf-8
import os
import wave
import numpy as np
import matplotlib.pyplot as plt
import math 
import time
from python_speech_features import mfcc
from python_speech_features import delta
from python_speech_features import logfbank
from scipy.fftpack import fftdef read_wav_data(filename):""":param filename:输入音频的绝对路径(路径+文件名)例:D:\\GitHub\\wav\\dae\\train\\A2_1.wav:return:wave_data,framerate:输出音频矩阵,帧率。例:A2_1 [[1507 1374 1218 ...  -78 -127  -43]]读取wav文件,返回声音信号的时域谱矩阵和播放时间"""wav = wave.open(filename,"rb") #打开wav格式的声音文件filenameaudioname = filename.split('\\')[-1] #音频名num_frame = wav.getnframes() #获取帧数#print("{}帧数为:{}".format(audioname,num_frame))num_channel = wav.getnchannels() #获取声道数#print("{}声道数为:{}".format(audioname,num_channel))framerate = wav.getframerate() # 获取帧率#print("{}帧率为:{}".format(audioname,framerate))num_sample_width = wav.getsampwidth() #获取每一帧的比特宽度#print("{}比特宽度为:{}".format(audioname,num_sample_width))str_data = wav.readframes(num_frame) # 读取全部的帧(二进制字符串)wav.close() # 关闭流wave_data = np.fromstring(str_data,dtype=np.short) # 将声音文件数据从字符串格式转换为数组矩阵形式# print("{} shape: {}".format("wave_data",wave_data.shape))# print("{} type: {}".format("wave_data",wave_data.dtype))# print("{}: {}".format("wave_data",wave_data))wave_data.shape = -1, num_channel #按照声道数将数组整形,单声道是一列,双声道是两列矩阵# print("{} shape(整形后): {}".format("wave_data",wave_data.shape))# print("{}(整形后): {}".format("wave_data",wave_data))wave_data = wave_data.T # 将wave_data矩阵转置# print("{} shape(转置后):{}".format("wave_data",wave_data.shape))# print("{}(转置后):{}".format("wave_data",wave_data))# print("{} len:{}".format("wave_data[0]",len(wave_data[0])))return wave_data, framerate
x = np.linspace(0, 400 - 1, 400, dtype = np.int64)
w = 0.54 - 0.46 * np.cos(2 * np.pi * (x) / (400 - 1) ) # 汉明窗def GetFrequencyFeature(wavsignal, fs):""":param wavsignal:音频矩阵 例:[[1507 1374 1218 ...  -78 -127  -43]]:param fs:帧率 例:16000:return data_input:转成频域后的音频矩阵"""# wav波形 加时间窗以及时移10mstime_window = 25  # 单位mswindow_length = fs / 1000 * time_window  # 计算窗长度的公式,目前全部为400固定值wav_arr = np.array(wavsignal)  # wav_arr:[[1507 1374 1218 ...  -78 -127  -43]]wav_length = wav_arr.shape[1]  # wav_arr.shape[0]:1,wav_arr.shape[1]:163000range0_end = int(len(wavsignal[0]) / fs * 1000 - time_window) // 10  # 计算循环终止的位置,也就是最终生成的窗数data_input = np.zeros((range0_end, 200), dtype=np.float)  # 用于存放最终的频率特征数据data_line = np.zeros((1, 400), dtype=np.float)for i in range(0, range0_end):p_start = i * 160  # 0,160,320,480p_end = p_start + 400  # 400,560,720,880data_line = wav_arr[0, p_start:p_end]  # 分帧data_line = data_line * w  # 加窗(这里是汉明窗)data_line = np.abs(fft(data_line)) / wav_length  # 傅里叶变换data_input[i] = data_line[0:200]  # 设置为400除以2的值(即200)是取一半数据,因为是对称的data_input = np.log(data_input + 1)  # 取logreturn data_inputif(__name__=='__main__'):wave_data, fs = read_wav_data("D:\\GitHub\\wav\\dae\\train\\A2_1.wav")print("wave_data:{}".format(wave_data))freimg = GetFrequencyFeature(wave_data, fs)print("freimg:{}".format(freimg))print("freimg shape:{}".format(freimg.shape))

三.程序输出:

wave_data:[[1507 1374 1218 … -78 -127 -43]]
freimg:
[[2.42781686e-01 3.74806474e-01 1.57395831e-01 … 2.44499564e-03 3.97955672e-03 2.58199104e-03]
[4.53051376e-01 5.93472204e-01 2.75825723e-01 … 4.04953736e-03 2.93284484e-03 2.91292203e-03]
[7.36420845e-01 5.12987026e-01 3.08367617e-01 … 3.05346426e-03 1.78931565e-03 1.43100353e-03]

[2.66626609e-02 1.66521460e-01 1.30265491e-01 … 3.11282926e-04 1.49347950e-03 2.64074732e-03]
[3.03173655e-01 2.10056810e-01 5.29090247e-02 … 2.23561051e-03 1.90130764e-03 2.44626778e-03]
[2.42738928e-01 4.61532521e-02 1.34021807e-01 … 7.12491485e-04 8.06380446e-04 1.50869641e-03]]
freimg shape:(1016, 200)

这篇关于ASR-语音预处理(二):时域转频域的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1103154

相关文章

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

动手学深度学习【数据操作+数据预处理】

import osos.makedirs(os.path.join('.', 'data'), exist_ok=True)data_file = os.path.join('.', 'data', 'house_tiny.csv')with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n') # 列名f.write('NA

基于人工智能的智能家居语音控制系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 随着物联网(IoT)和人工智能技术的发展,智能家居语音控制系统已经成为现代家庭的一部分。通过语音控制设备,用户可以轻松实现对灯光、空调、门锁等家电的控制,提升生活的便捷性和舒适性。本文将介绍如何构建一个基于人工智能的智能家居语音控制系统,包括环境准备

LLM系列 | 38:解读阿里开源语音多模态模型Qwen2-Audio

引言 模型概述 模型架构 训练方法 性能评估 实战演示 总结 引言 金山挂月窥禅径,沙鸟听经恋法门。 小伙伴们好,我是微信公众号《小窗幽记机器学习》的小编:卖铁观音的小男孩,今天这篇小作文主要是介绍阿里巴巴的语音多模态大模型Qwen2-Audio。近日,阿里巴巴Qwen团队发布了最新的大规模音频-语言模型Qwen2-Audio及其技术报告。该模型在音频理解和多模态交互

【阅读文献】一个使用大语言模型的端到端语音概要

摘要 ssum框架(Speech Summarization)为了 从说话人的语音提出对应的文本二题出。 ssum面临的挑战: 控制长语音的输入捕捉 the intricate cross-mdoel mapping 在长语音输入和短文本之间。 ssum端到端模型框架 使用 Q-Former 作为 语音和文本的中介连接 ,并且使用LLMs去从语音特征正确地产生文本。 采取 multi-st

【语音告警】博灵智能语音报警灯JavaScript循环播报场景实例-语音报警灯|声光报警器|网络信号灯

功能说明 本文将以JavaScript代码为实例,讲解如何通过JavaScript代码调用博灵语音通知终端 A4实现声光语音告警。主要博灵语音通知终端如何实现无线循环播报或者周期播报的功能。 本代码实现HTTP接口的声光语音播报,并指定循环次数、播报内容。由于通知终端采用TTS语音合成技术,所以本次案例中无需预先录制音频。 代码实战 为了通过JavaScript调用博灵语音通知终端,实现HT

【动手学深度学习】04 数据操作 + 数据预处理(个人向笔记)

数据操作 N维数组是机器学习和神经网络的主要数据结构其中 2-d 矩阵中每一行表示每一行表示一个样本 当维度来到三维的时候则可以表示成一张图片,再加一维就可以变成多张图片,再加一维则可以变成一个视频 访问元素 冒号表示从冒号左边的元素到冒号右边的前一个元素(开区间),其中如果左边为空,那么表示从第一个开始,如果右边为空,那么表示访问到最后一个,如果两边都为空,则表示全部访问其中一行中我们指

数据预处理与协同过滤推荐算法——从数据清洗到个性化电影推荐

推荐系统在现代应用中占据了重要地位,尤其在电影、音乐等个性化内容推荐中广泛使用。本文将介绍如何使用数据预处理、特征工程以及多种推荐算法(包括协同过滤、基于内容的推荐、混合推荐等)来实现电影推荐系统。通过Pandas、Scikit-learn、TensorFlow等工具,我们将展示如何从数据清洗开始,逐步实现各类推荐算法。  完整项目代码: 基于协同过滤的电影推荐系统 一、数据预处