zoukankan      html  css  js  c++  java
  • 音乐文件的处理-pydub

    import numpy as np
    import array
    from pydub import AudioSegment
    
    # 读取音频文件
    path = r'E:MLprojectmusicdataDelacey-Dream-It-Possible.mp3'
    
    song = AudioSegment.from_file(file=path)
    
    # 写音频文件
    song.export(out_f=r'E:MLprojectmusicdata	est.wav', format='wav')
    
    # 获取相关属性
    # 长度
    size = len(song)
    print("音频文件的长度信息(毫秒):{}".format(size))
    channel = song.channels
    # 通道数据,音频文件有单通道和双通道
    print("音频文件的通道数据:{}".format(channel))
    # 音频文件的抽样频率
    frame_rate = song.frame_rate
    print("音频文件的抽样频率:{}".format(frame_rate))
    
    # 设置相关属性
    # 如果降低音乐的通道、抽样频率等特征的值会带来音频的损失
    # 但是增加不会带来损失
    song = song.set_channels(channels=2)
    song = song.set_frame_rate(frame_rate=44100)
    song = song.set_sample_width(sample_width=2)
    print("=" * 50)
    print("音频文件的长度信息(毫秒):{}".format(len(song)))
    print("音频文件的通道数目:{}".format(song.channels))
    print("音频文件的样本宽度:{}".format(song.sample_width))
    print("音频文件的抽样频率:{}".format(song.frame_rate))
    song.export(out_f=r'E:MLprojectmusicdata	est01.wav', format='wav')
    
    # 音频文件的截断处理
    # 后去前两分钟的数据保存
    song[:120000].export(out_f=r'E:MLprojectmusicdata	est02.wav', format='wav')
    # 获取前10s数据保存
    song[:10000].export(out_f=r'E:MLprojectmusicdata	est03.wav', format='wav')
    # 获取中间十秒
    mid = len(song) // 2
    song[mid - 5000:mid + 5000].export(out_f=r'E:MLprojectmusicdata	est04.wav',
                                       format='wav')
    
    # 填充保存
    # 将song兑现装换为numpy的array对象
    # 数组的大小 = 音频数据长度(秒为单位)* 通道数 * 抽样频率
    samples = np.array(song.get_array_of_samples()).reshape(-1)
    print("形状:{}".format(samples.shape))
    print("前10个数字:{}".format(samples[:10]))
    print("中间10个数字:{}".format(samples[20000:20010]))
    
    # 填充操作(填充一分钟)
    append_size = 60 * song.channels * song.frame_rate
    """
    数组填充api为numpy中的pad
    pad_with: 给定在什么位置填充,以及填充多少个数据,eg:当前参数在samples这个数组
    前面填充append_size个值
    mode: 填充方式,一般使用constant, 表示常量填充
    constant_value: 填充常数的时候,常数值是什么
    """
    samples = np.pad(samples, pad_width=(append_size, 0), mode='constant', constant_values=(0, 0))
    print(samples.shape)
    
    # 将填充后的数值转换成AudioSegment对象
    song = song._spawn(array.array(song.array_type, samples))
    song.export(out_f=r'E:MLprojectmusicdata	est05.wav', format='wav')
    
    # 音频的增加,减小操作
    (song + 10).export(out_f=r'E:MLprojectmusicdata	est06.wav', format='wav')
    (song - 10).export(out_f=r'E:MLprojectmusicdata	est07.wav', format='wav')
    # 循环
    (song * 2).export(out_f=r'E:MLprojectmusicdata	est08.wav', format='wav')
    
    
  • 相关阅读:
    Flexigrid在IE下不显示数据的处理
    [置顶] ios 网页中图片点击放大效果demo
    WPF仿360卫士9.0界面设计
    Android调用相机并将照片存储到sd卡上
    Android 将文件保存到SD卡,从卡中取文件,及删除文件
    java 正则表达式学习
    linux下的块设备驱动(一)
    已知用经纬度表示的两点,求两点之间的直线距离
    IndiaHacks 2016
    IndiaHacks 2016
  • 原文地址:https://www.cnblogs.com/01black-white/p/14033645.html
Copyright © 2011-2022 走看看