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')
    
    
  • 相关阅读:
    修改MFC标题栏上的图标
    【转】子窗口刷新父窗口的问题
    水晶报表添加引用
    【转】MetadataType的使用,MVC的Model层数据验证
    poj 1556 The Doors 线段相交判断+最短路
    poj 1269 Intersecting Lines 求直线交点 判断直线平行共线
    string 函数操作
    poj 1066 Treasure Hunt 线段相交判断
    poj 1410 Intersection 线段相交判断
    poj 3347 Kadj Squares 扩大数据化整数
  • 原文地址:https://www.cnblogs.com/01black-white/p/14033645.html
Copyright © 2011-2022 走看看