快捷搜索: 王者荣耀 脱发

ASR-语音预处理(一):音频读取

一.音频读取

这是语音识别系列的第一篇博文,主要介绍音频如何读取以及如何转成矩阵形式。 输入:wav文件 例:A2_1.wav 输出:输入的wav文件所对应的数据矩阵wave_data和帧率framerate。 例:[[1507 1374 1218 … -78 -127 -43]] ,16000

二.代码:

#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 fft

def 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格式的声音文件filename
    audioname = 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))

    return wave_data, framerate


if(__name__==__main__):
       wave_data, fs = read_wav_data("D:\GitHub\wav\dae\train\A2_1.wav")

三.程序输出:

A2_1.wav帧数为:163000 A2_1.wav声道数为:1 A2_1.wav帧率为:16000 A2_1.wav比特宽度为:2 wave_data shape: (163000,) wave_data type: int16 wave_data: [1507 1374 1218 … -78 -127 -43] wave_data shape(整形后): (163000, 1) wave_data(整形后): [[1507] [1374] [1218] … [ -78] [-127] [ -43]] wave_data shape(转置后):(1, 163000) wave_data(转置后):[[1507 1374 1218 … -78 -127 -43]]
经验分享 程序员 微信小程序 职场和发展