zoukankan      html  css  js  c++  java
  • 语音预处理(一):音频读取

    一.音频读取

    这是语音识别系列的第一篇博文,主要介绍音频如何读取以及如何转成矩阵形式。
    输入: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]]

  • 相关阅读:
    你可能不知道的 30 个 Python 语言的特点技巧
    正则替换sql为动态sql
    列表按指定个数分割后格式化输出
    多线程队列下载天涯帖子
    多线程下载图片
    sublime text3 运行python配置
    01_什么是接口测试
    02_Fiddler使用
    01_Fiddler安装
    05_功能测试
  • 原文地址:https://www.cnblogs.com/jianxiong0117/p/9583362.html
Copyright © 2011-2022 走看看