当前位置:   article > 正文

使用 Python 做音频处理·总章(持续更新)_soundfile音频文件追加

soundfile音频文件追加

待看:
Python音频处理
Python pydub音频处理

1. 常用的工具和库

概述

wave 是Python的标准模块,Python 处理音频数据等常见模块有两个:

  • librosa:擅长音频信号处理,内部用 numpy 存储数据,读写文件依赖 soundfile 模块(不支持mp3)
  • pydub :底层基于 ffmpeg 读写文件,代码简洁,支持切割、格式转换、音量、ID3等常用功能,门槛低。(ffmpeg 是一个极其强大的开源视频处理软件)

使用建议:日常用 pydub 足够应付,更强大的信号处理则需要 librosa,但有一定数学门槛,需要了解信号处理原理,掌握傅立叶变换等基本算法。

wave

wave 是Python的标准模块,Python 音频处理:wave 记录了它的一些简单介绍和源码

pydub

Pydub lets you do stuff to audio in a way that isn’t stupid

pydub 可以让我们处理音频文件,但是Pydub只支持原生的wav格式的文件处理。所以如果你想处理其他格式的音频,或者说你想处理媒体文件中的音频那你需要在你本地安装FFmpeg支持。

其官方文档中记录了很多简单实用的代码样例:API Documentation

pydub 中的 AudioSegment() 是不可改变对象,其中包含了丰富的操作对象,比如音量的增减、音频的合并、读取音频时长、截取音频等操作。注意处理多个音频时,首先确保它们有相同的 通道数、帧率、采样率、比特深等。

下面简单记录了基本所有的用法:

  • AudioSegment(…).from_file(),打开音频并返回一个AudioSegment 实例
  • AudioSegment(…).export(),将 AudioSegment 写入一个文件。
  • AudioSegment.empty(),创建一个空的(时长为0)的 AudioSegment。
  • AudioSegment.silent(),创建一个静音音频片段
  • AudioSegment.from_mono_audiosegments(),融合多个单通道的音频,注意每个单通道音频需要有相同的长度,直到帧计时开始。
  • AudioSegment(…).dBFS,返回以dBFS (db relative to the maximum possible loudness)为度量的声音响度。
  • AudioSegment(…).rms,返回以 rms 为度量的响度
  • AudioSegment(…).channels
  • AudioSegment(…).sample_width
  • AudioSegment(…).frame_rate
  • AudioSegment(…).frame_width
  • AudioSegment(…).max,返回音频中的最大振幅
  • AudioSegment(…).max_dBFS,以 dBFS 返回音频中的最大振幅
  • AudioSegment(…).duration_seconds,返回音频时长,单位是 ms(milliseconds)
  • AudioSegment(…).raw_data,返回原始音频
  • AudioSegment(…).frame_count(),返回帧数
  • AudioSegment(…).append(),合并音频,比如 combined = sound1.append(sound2),默认crossfade=100ms
  • AudioSegment(…).overlay(),用一个音频覆盖在其上,但是多余部分会被切除。(有待深究)
  • AudioSegment(…).apply_gain(gain),改变 amplitude (generally, loudness) ,其中,Gain的单位是 dB。
  • AudioSegment(…).fade(),一个更通用(更灵活)的淡化(fade)方法,可以设置参数,比如起止点或者起点和持续时长。
  • AudioSegment(…).fade_out(),淡出
  • AudioSegment(…).fade_in(),淡入
  • AudioSegment(…).reverse(),生成一个反向播放的拷贝版本
  • AudioSegment(…).set_frame_rate(),设置指定的帧率,单位是Hz
  • AudioSegment(…).set_channels()
  • AudioSegment(…).split_to_mono(),切分声道
  • AudioSegment(…).apply_gain_stereo(),在立体声的左右声道添加增益(gain)
  • AudioSegment(…).pan(),设置 pan 参数,比如-1.0 (100% left) and +1.0 (100% right)
  • AudioSegment(…).get_array_of_samples(),返回原始音频数据作为(数值)样本的数组
  • AudioSegment(…).get_dc_offset(),返回-1.0到1.0之间的值,表示通道的直流偏移量。
  • AudioSegment(…).remove_dc_offset(),从通道中移除直流偏移
  • AudioSegment(…).invert_phase(),复制此音频段并反转信号的相位。

还有一些文档还未加入:

在这里插入图片描述

下面也记录了其它人总结的一些用法,可供参考。

# -*- coding: utf-8 -*-
# @Author  : FELIX
# @Date    : 2018/5/18 15:13

from pydub import AudioSegment

sound=AudioSegment.from_file("aaa.mp3","mp3")
sound2=AudioSegment.from_file('bbb.mp3','mp3')
# 把一个多声道音频分解成两个单声道
# index[0]为左声道
# index[1]为右声道
# sounds=sound.split_to_mono()
# print(sounds)


# 将两个单声道合并成多声道
# stereo_sound = AudioSegment.from_mono_audiosegments(sounds[0], sounds[1])



# # 取得音频的分贝数
# loudness = sound.dBFS
# print(loudness)
# # 获取音频音量大小,该值通常用来计算分贝数(dB= 20×lgX)
# loudness = sound.rms
# print(loudness)
# # 取得音频的声道数
# channel_count = sound.channels
# print(channel_count)
# # 取得音频文件采样宽度
# bytes_per_sample = sound.sample_width
# print(bytes_per_sample)
#
# # 取得音频文件采样频率
# frames_per_second = sound.frame_rate
# print(frames_per_second)
# #取得音频文件帧宽度
# bytes_per_frame = sound.frame_width
# print(bytes_per_frame)
#
# #取得音频中的最大振幅
# normalized_sound = sound.apply_gain(-sound.max_dBFS)
# print(normalized_sound)
# #取得音频的持续时间,同 len()
# print(sound.duration_seconds)
# print((len(sound) / 1000.0))
# #取得音频数据
# raw_audio_data = sound.raw_data
# # print(raw_audio_data)
# #取得音频的frame数量
# number_of_frames_in_sound = sound.frame_count()
# number_of_frames_in_200ms_of_sound = sound.frame_count(ms=200)
# print(number_of_frames_in_sound)
# print(number_of_frames_in_200ms_of_sound)

# 拼接sound1与sound2,返回一个新的AudioSegment实例
# cossfade:交叉渐变间隔 ms
# no_crossfade1 = sound.append(sound2, crossfade=5000)
# print(no_crossfade1)
# no_crossfade1.export(r'cc.wav',format='wav') # 输出

# 把sound2覆盖在sound1上,两个音频文件会叠加,如果sound2较长,则会被截断。
# 参数:
# position:覆盖起始位置(毫秒)
# loop:是否循环覆盖(true/false)
# times:重复覆盖次数(默认1)
# gain_during_overlay:调整被覆盖音频的音量(eg,-6.0)
# played_togther = sound.overlay(sound2)
# # sound2_starts_after_delay = sound.overlay(sound2, position=5000)
# # volume_of_sound1_reduced_during_overlay = sound.overlay(sound2, gain_during_overlay=-8)
# # sound2_repeats_until_sound1_ends = sound.overlay(sound2, loop=True)
# # sound2_plays_twice = sound.overlay(sound2, times=2)
# played_togther.export(r'dd.wav',format='wav') # 输出



#调整音量大小
# louder_via_method = sound.apply_gain(+3.5) # 提高
# quieter_via_method = sound.apply_gain(-5.7) # 减小


#淡出
# 参数:
# to_gain:淡出结束时音频音量下降到的分贝数
# from_gain:设置淡出前的所有音频分贝数
# start:淡出的起始位置
# end:淡出的结束位置
# duration:淡出持续时间
# fade_in_the_hard_way = sound.fade(from_gain=-120.0, start=0, duration=5000)
# fade_out_the_hard_way = sound.fade(to_gain=-120.0, end=0, duration=5000)

# 反向输出
# sound.reverse().export(r'ee.wav',format='wav') # 输出

# 调整多声道音频的左右声道音量
# 如果单声道音频调用此方法,它将先被转换为多声道
# stereo_balance_adjusted = sound.apply_gain_stereo(-6, +2)
#
# #左右声道平衡,按百分比增大一边,减小另一边
# # pan the sound 15% to the right
# panned_right = sound.pan(+0.15)
# # pan the sound 50% to the left
# panned_left = sound.pan(-0.50)
#
#
# # 基于DSP的渲染
# # 产生一个反向信号的副本,来消除反相位波,或者降低噪音
# sound.invert_phase()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108

librosa

ffmpeg

pyaudio (还有这个,先挖个坑)

2. 其它常见的处理汇总

参考:点击

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/966997
推荐阅读
相关标签
  

闽ICP备14008679号