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]]

  • 相关阅读:
    Centos7 yum 安装 oracle-rdbms-server-11gR2-pre
    R语言 小程序
    Hadoop! | 大数据百科 | 数据观 | 中国大数据产业观察_大数据门户
    【R】如何确定最适合数据集的机器学习算法
    R语言 recommenderlab 包
    R语言 推荐算法 recommenderlab包
    R语言进行数据预处理wranging
    统计学 nested_design 嵌套设计
    [LeetCode] 160. 相交链表
    [LeetCode] 155. 最小栈
  • 原文地址:https://www.cnblogs.com/jianxiong0117/p/9583362.html
Copyright © 2011-2022 走看看