吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3784|回复: 7
收起左侧

[Python 转载] 使用Python对音频文件进行数据预处理

  [复制链接]
dingallen216 发表于 2021-4-17 16:28
使用Python对音频文件进行数据预处理

导入一些基本的库
[Python] 纯文本查看 复制代码
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import sklearn
import pandas as pd
import os
import sys
import time
import tensorflow as tf
from tensorflow import keras
import pathlib
import seaborn as sns
from IPython import display
from scipy.signal import wiener


从音频文件中读取音频信号
当前目录下,有音频文件example.wav,我们以此为示例。由于在大多数场景中,我们需要对数据进行批量处理,所以使用tf.data.Dataset来对数据进行预处理。代码中的AUTOTUNE仅是用来加速的,可以忽略。

[Python] 纯文本查看 复制代码
filenames = ['./example.wav']
filename_dataset = tf.data.Dataset.from_tensor_slices(filenames)

for filename in filename_dataset.take(1):
    print(filename.numpy())

def get_audio_from_filename(filename):
    audio_binary = tf.io.read_file(filename)
    audio, _ = tf.audio.decode_wav(audio_binary)
    return tf.squeeze(audio, axis=-1)

AUTOTUNE = tf.data.AUTOTUNE
waveform_dataset = filename_dataset.map(get_audio_from_filename, num_parallel_calls = AUTOTUNE)

for waveform in waveform_dataset.take(1):
    print(waveform.shape)


输出:

b'./example.wav'
(11146,)

使用读取到的waveform播放音频
example.wav的采样率为16kHz。

[Python] 纯文本查看 复制代码
def playAudio(waveform, sample_rate = 16000):
    display.display(display.Audio(waveform, rate=sample_rate))

playAudio(waveform)


使用stft进行特征提取,获得频谱

[Python] 纯文本查看 复制代码
def get_spectrogram(waveform, frame_length, frame_step):

    waveform = tf.cast(waveform, tf.float32)
    spectrogram = tf.signal.stft(
        waveform, frame_length=frame_length, frame_step=frame_step)
      
    spectrogram = tf.abs(spectrogram)

    return spectrogram

spectrogram = get_spectrogram(waveform, 256, 84)
print(spectrogram.shape)



绘制波形图和频谱图

[Python] 纯文本查看 复制代码
def plot_waveform_and_spectrogram(waveform, spectrogram):
    
    def getstep():
        
        step = waveform.shape[0] // spectrogram.shape[0] 
        
        if waveform.shape[0] % spectrogram.shape[0] == 0:
            return step
        
        return step + 1
    
    fig, axes = plt.subplots(2, figsize=(12, 8))
    timescale = np.arange(waveform.shape[0])
    axes[0].plot(timescale, waveform.numpy())
    axes[0].set_title('Waveform')
    log_spec = np.log(spectrogram.numpy().T)
    height = log_spec.shape[0]
    X = np.arange(waveform.shape[0], step=getstep())
    Y = range(height)
    axes[1].pcolormesh(X, Y, log_spec)
    axes[1].set_title('Spectrogram')
    plt.show()

plot_waveform_and_spectrogram(waveform, spectrogram)


做一个小实验,演示维纳滤波器处理带噪语音
当下目录下有clean.wav和noisy.wav,这两个文件分别是同样一句语音的纯净版和带噪版。下面的代码的编写方式绝不适合在一般的场景中使用,在本文仅用于演示。在最后几行,我们获得了这两个文件的语音波形和频谱。

[Python] 纯文本查看 复制代码
filenames_2 = ['./clean.wav', './noisy.wav']
filename_dataset_2 = tf.data.Dataset.from_tensor_slices(filenames_2)

for filename in filename_dataset_2.take(2):
    print(filename.numpy())

def get_audio_from_filename(filename):
    audio_binary = tf.io.read_file(filename)
    audio, _ = tf.audio.decode_wav(audio_binary)
    return tf.squeeze(audio, axis=-1)

AUTOTUNE = tf.data.AUTOTUNE
dataset = filename_dataset_2.map(get_audio_from_filename, num_parallel_calls = AUTOTUNE)

waves = []

for waveform in dataset.take(2):
    print(waveform.shape)
    waves.append(waveform)

clean_waveform = waves[0]
noisy_waveform = waves[1]

clean_spectrogram = get_spectrogram(clean_waveform, 512, 320)
noisy_spectrogram = get_spectrogram(noisy_waveform, 512, 320)



代码都是可以在python3环境下直接运行的,建议使用jupyter notebook运行查看结果。

免费评分

参与人数 3吾爱币 +3 热心值 +3 收起 理由
rize_bo + 1 + 1 用心讨论,共获提升!
飘雨清风 + 1 + 1 第一次看到这类代码,有意思
joneqm + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

bwuaich 发表于 2021-4-17 17:05
处理音频文件date; 需要导入这么多库?? 这些是什么库; 哪里有介绍; 谢谢LZ分享;
 楼主| dingallen216 发表于 2021-4-17 17:11
bwuaich 发表于 2021-4-17 17:05
处理音频文件date; 需要导入这么多库?? 这些是什么库; 哪里有介绍; 谢谢LZ分享;

这些代码主要旨在进行机器学习前的数据预处理,所以多引入了一些机器学习相关的库,这算是我的一个习惯吧。
w547890 发表于 2021-4-17 18:46

处理音频文件date; 需要导入这么多库?? 这些是什么库; 哪里有介绍; 谢谢LZ分享;
龍謹 发表于 2021-4-17 19:29
PY小白,进来观摩学习。
有点小凡 发表于 2021-4-17 20:20
纯支持,学到现在只会hello world 的小白飘过一下,哈哈哈哈
ytfrdfiw 发表于 2021-4-17 20:46
顶一下。谢谢。
图山Y 发表于 2022-8-21 23:10
谢谢楼主
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 04:06

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表