最好用的python音频库之一:pydub

2019年11月29日12:55:07 科技 1712

pydub 提供了简洁的高层接口,极大的扩展了python处理音频文件的能力,pydub可能不是最强大的Python音频处理库,但绝对是Python最简洁易用的音频库只要,非要说有什么弊端,大概只有高度依赖ffmpeg,Linux安装起来不太方便吧。其功能足以满足大多数情况下的音频处理需求,如果它真的满足不了你,那为什么不选择更强大的库来开发你的专业应用呢?

最好用的python音频库之一:pydub - 天天要闻

一、快速开始

打开一个音频文件

打开一个WAV文件:

from pydub import AudioSegment

song = AudioSegment.from_wav("never_gonna_give_you_up.wav")

打开一个MP3文件:

song = AudioSegment.from_mp3("never_gonna_give_you_up.mp3")

打开一个OGG或FLV或其他的什么FFMPEG支持的文件:

ogg_version = AudioSegment.from_ogg("never_gonna_give_you_up.ogg")
flv_version = AudioSegment.from_flv("never_gonna_give_you_up.flv")

mp4_version = AudioSegment.from_file("never_gonna_give_you_up.mp4", "mp4")
wma_version = AudioSegment.from_file("never_gonna_give_you_up.wma", "wma")
aac_version = AudioSegment.from_file("never_gonna_give_you_up.aiff", "aac")

对音频段切片

切片操作(从已导入的音频段中提取某一个片段):

# pydub做任何操作的时间尺度都是毫秒
ten_seconds = 10 * 1000

first_10_seconds = song[:ten_seconds]
last_5_seconds = song[-5000:]

让开头更响和让结束更弱

使开头十秒的声音变得更响并使结束的五秒声音变弱:

# 声音增益6dB
beginning = first_10_seconds + 6

# 声音减弱3dB
end = last_5_seconds - 3

连接音频段

连两个接音频段(把一个文件接在另一个后面)

without_the_middle = beginning + end

音频段长度

音频段有多长呢?

without_the_middle.duration_seconds == 15.0

音频段是不可变的

音频段是不可变的

# 音频不可以被修改
backwards = song.reverse()

交叉淡化

交叉淡化(再一次强调,beginning和end都是不可变的)

# 1.5秒的淡入淡出
with_style = beginning.append(end, crossfade=1500)
12

重复

# 将片段重复两遍
do_it_over = with_style * 2

淡化

淡化(注意一下,你可以把许多运算符连成一串使用,因为运算符都会返回一个AudioSegment对象)

# 2秒淡入, 3秒淡出
awesome = do_it_over.fade_in(2000).fade_out(3000)

保存结果

保存编辑的结果(再说一下,支持所有ffmpeg支持的格式)

保存带有标签的结果(元数据)

awesome.export("mashup.mp3", format="mp3", tags={'artist': 'Various artists', 'album': 'Best of 2011', 'comments': 'This album is awesome!'})

你也可以通过指定任意ffmpeg支持的比特率来导出你的结果

awesome.export("mashup.mp3", format="mp3", bitrate="192k")

更多其他的ffmpeg所支持的参数可以通过给’parameters’参数传递一个列表来实现,列表中第一个应该是选项,而第二个是对应的参数。
特别注意一下,这些参数没有得到确认,支持的参数可能会受限于你所使用的特定的 ffmpeg / avlib 构建

# 使用预设MP3质量0(相当于lame -V0)
# ——lame是个MP3编码器,-V设置的是VBR压缩级别,品质从0到9依次递减(译者注)
awesome.export("mashup.mp3", format="mp3", parameters=["-q:a", "0"])

# 混合到双声道并设置输出音量百分比(放大为原来的150%)
awesome.export("mashup.mp3", format="mp3", parameters=["-ac", "2", "-vol", "150"])

0x02 Debugging

人们在运行时遇到到大多数问题都与使用ffmpeg/avlib转换格式有关,pydub提供了一个logger输出子进程的调用来帮助你追踪问题

>>> import logging

>>> l = logging.getLogger("pydub.converter")
>>> l.setLevel(logging.DEBUG)
>>> l.addHandler(logging.StreamHandler())

>>> AudioSegment.from_file("./test/data/test1.mp3")
subprocess.call(['ffmpeg', '-y', '-i', '/var/folders/71/42k8g72x4pq09tfp920d033r0000gn/T/tmpeZTgMy', '-vn', '-f', 'wav', '/var/folders/71/42k8g72x4pq09tfp920d033r0000gn/T/tmpK5aLcZ'])
<pydub.audio_segment.AudioSegment object at 0x101b43e10>

不用担心转换中产生的临时文件,它们会被自动地清除。

0x03 安装

安装pydub很容易,但不要忘记安装ffmpeg/avlib(下一部分也在此文档中)

pip install pydub

或者可以从github安装最新的开发中版本(dev version),也可以用像是@v0.12.0这样的发布版本取代@master……

pip install git+https://github.com/jiaaro/pydub.git@master

-或者-

git clone https://github.com/jiaaro/pydub.git

0x04 依赖

你可以仅使用纯Python打开或保存WAV文件。为了打开或保存非WAV文件——比如MP3——你需要ffmepg或是libav。

回放

当你安装了这些的其中之一后,你就可以播放音频了(强烈推荐simpleaudio,哪怕你已经安装了ffmpeg/libav)

  • simpleaudio
  • pyaudio
  • ffplay (通常随ffmpeg安装,参见下一部分)
  • avplay ((通常随libav安装,参见下一部分)
from pydub import AudioSegment
from pydub.playback import play

sound = AudioSegment.from_file("mysound.wav", format="wav")
play(sound)

0x05 安装ffmpeg

你可以安装libav或是ffmpeg。

Mac (使用homebrew):

# libav
brew install libav --with-libvorbis --with-sdl --with-theora

#### OR #####

# ffmpeg
brew install ffmpeg --with-libvorbis --with-sdl2 --with-theora

Linux (使用aptitude):

# libav
apt-get install libav-tools libavcodec-extra

#### OR #####

# ffmpeg
apt-get install ffmpeg libavcodec-extra

Windows:

  1. 从Windows binaries provided here下载并提取libav;
  2. 添加libav /bin 文件夹到你的环境变量(PATH);
  3. pip install pydub;

0x06 注意事项

AudioSegment对象是不可变的

Ogg导出和默认编码器

Ogg的官方说明没有指出该怎样使用编码器,这些选择被抛给了用户。Vorbis和Theora是一大堆可用的编码器中的一部分 (参见RFC第三页),可以被用于封装的数据。
方便起见,当没有指定输出为ogg格式的编码器时,会默认使用vorbis进行输出,像这样:

from pydub import AudioSegment
song = AudioSegment.from_mp3("test/data/test1.mp3")
song.export("out.ogg", format="ogg")
# Is the same as:
song.export("out.ogg", format="ogg", codec="libvorbis")

0x08 使用范例

假设你有一个放满了mp4和flv视频的文件夹,并且你想要把它们转换为mp3,以便于用你的MP3播放器来听这些视频的声音。

import os
import glob
from pydub import AudioSegment

video_dir = '/home/johndoe/downloaded_videos/' # 你保存有视频的文件夹路径
extension_list = ('*.mp4', '*.flv')

os.chdir(video_dir)
for extension in extension_list:
for video in glob.glob(extension):
mp3_filename = os.path.splitext(os.path.basename(video))[0] + '.mp3'
AudioSegment.from_file(video).export(mp3_filename, format='mp3')

再举个例子如何?

from glob import glob
from pydub import AudioSegment

playlist_songs = [AudioSegment.from_mp3(mp3_file) for mp3_file in glob("*.mp3")]

first_song = playlist_songs.pop(0)

# 让我们只包含第一首歌的前30秒 (切片以毫秒为单位)
beginning_of_song = first_song[:30*1000]

playlist = beginning_of_song
for song in playlist_songs:
# 我们不想让结尾听起来像是突然停止,所以我们给它加上10秒的淡化
playlist = playlist.append(song, crossfade=(10 * 1000))

# 让我们给最后一首歌的结尾加上淡出
playlist = playlist.fade_out(30)

# 唔……我还想知道它有多长( len(audio_segment)返回值同样是以毫秒计的 )
playlist_length = len(playlist) / (1000*60)

# 现在保存下来!
out_f = open("%s_minute_playlist.mp3" % playlist_length, 'wb')

playlist.export(out_f, format='mp3')

pydub API文档

如果你正在寻找一些特殊的功能,去看一看源代码或许是个好主意。核心功能大部分都在pydub/audio_segment.py中 – 一部分AudioSegment方法在 pydub/effects.py模块中,同时通过注册效果处理(register_pydub_effect() 装饰器函数)来添加到AudioSegment中。

尚未正式编入文档的部分:

  • Playback 回放功能 (pydub.playback)
  • Signal Processing 信号处理 (压缩, EQ, 标准化, 变速 - pydub.effects, pydub.scipy_effects)
  • Signal generators 信号生成器 (正弦波, 方波, 锯齿波, 白噪声, 等等 - pydub.generators)
  • Effect registration system 效果注册系统 (基本上是 pydub.utils.register_pydub_effect 装饰器)
  • Silence utilities 静音效果 (静音探测, 分别静音, 等等 - pydub.silence)

AudioSegment()

AudioSegment对象是不可变的,同时支持很多运算符。

from pydub import AudioSegment
sound1 = AudioSegment.from_file("/path/to/sound.wav", format="wav")
sound2 = AudioSegment.from_file("/path/to/another_sound.wav", format="wav")

# sound1 增益 6 dB, 然后衰减 3.5 dB
louder = sound1 + 6
quieter = sound1 - 3.5

# 将sound2添加到sound1
combined = sound1 + sound2

# sound1重复三次
repeated = sound1 * 3

# 持续时间
duration_in_milliseconds = len(sound1)

# sound1的前五秒
beginning = sound1[:5000]

# sound1的后五秒
end = sound1[-5000:]

# 将sound1前5秒分割开来
slices = sound1[::5000]

# 高级操作,如果你有原始音频数据:
sound = AudioSegment(
# 原始音频数据 (bytes类型)
data=b'…',

# 2 byte (16 bit)采样
sample_width=2,

# 44.1 kHz 帧速率
frame_rate=44100,

# 立体声
channels=2
)

任何连接了多个AudioSegment对象的操作,都确保这些对象有相同的声道数、帧速率、采样率、位深、等等。当这些属性不匹配时,较低质量的声音会被提升为和用较高质量的对象相同的声音质量,以免于降低音质:单声道将被转换为双声道,并且低采样率/帧速率的将被提升为需要的质量。如果你不想让这些行为进行,那你可能需要通过合适的类方法,明确地减少声道数、比特数、等等。

AudioSegment(…).from_file()

将一个音频文件打开为一个AudioSegment实例,并返回这个实例。方便起见,这里还提供了其他的一些包装,但你应该仅仅直接地使用他们。

from pydub import AudioSegment

# wave和raw不需要使用ffmpeg
wav_audio = AudioSegment.from_file("/path/to/sound.wav", format="wav")
raw_audio = AudioSegment.from_file("/path/to/sound.raw", format="raw",
frame_rate=44100, channels=2, sample_width=2)

# 其他的所有格式都需要使用ffmpeg
mp3_audio = AudioSegment.from_file("/path/to/sound.mp3", format="mp3")

# 使用一个你已经打开了的文件 (advanced …ish)
with open("/path/to/sound.wav", "rb") as wav_file:
audio_segment = AudioSegment.from_file(wav_file, format="wav")

# 同时,对应python 3.6以上版本支持os.PathLike方案
from pathlib import Path
wav_path = Path("path/to/sound.wav")
wav_audio = AudioSegment.from_file(wav_path)

第一个参数是文件的读取路径(以字符串string形式传递)或一个用来读取的文件句柄。

支持的关键字参数:

  • format | 示例: "aif" | 默认: "mp3" 输出文件的格式。 原生支持 "wav"和 "raw",需要 ffmpeg 以支持其他的所有格式. "raw" 文件需要三个额外的关键字参数, sample_width, frame_rate, 和 channels, 用以下表述: raw only。这些额外信息之所以需要,是因为原始音频文件不像WAV文件那样拥有一个自身信息的文件头。
  • sample_width | 示例: 2 raw only — 用 1 表示 8-bit 音频, 2 表示 16-bit (CD品质) and 4 表示 32-bit。这是每种取样的字节数。
  • channels | 示例: 1 raw only — 1 表示单声道, 2 表示双声道。
  • frame_rate | 示例: 2 raw only — 也称为采样率, 其值一般为 44100 (44.1kHz - CD音频), 或是 48000 (48kHz - DVD音频)

AudioSegment(…).export()

将AudioSegment对象写入文件 – 返回一个输出文件的文件句柄 (不过,你不必为此做任何事)。

from pydub import AudioSegment
sound = AudioSegment.from_file("/path/to/sound.wav", format="wav")

# 简单导出
file_handle = sound.export("/path/to/output.mp3", format="mp3")

# 更复杂的导出
file_handle = sound.export("/path/to/output.mp3",
format="mp3",
bitrate="192k",
tags={"album": "The Bends", "artist": "Radiohead"},
cover="/path/to/albumcovers/radioheadthebends.jpg")

# 将声音分割为5秒的片段并导出
for i, chunk in enumerate(sound[::5000]):
with open("sound-%s.mp3" % i, "wb") as f:
chunk.export(f, format="mp3")

第一个参数是用于输出的位置(以string类型), 或一个用于输出的文件句柄。如果你没有给出输出文件或文件句柄,将会创建一个临时文件。

支持的关键字参数:

  • format | 示例: "aif" | 默认: "mp3" 格式的输出文件。原生支持"wav"和"raw" ,需要ffmpeg以支持其他格式。
  • codec | 示例: "libvorbis" 对于可能包含用不同编解码器编码的内容,你可以指定你编码时想要使用的编解码器。举个例子, "ogg"格式通常使用"libvorbis"编码器. (需要ffmpeg)
  • bitrate | 示例: "128k" 对于使用压缩的格式,你可以设置编码时所使用的编码器 (需要 ffmpeg). 每一种编码器接受不同的比特率参数,详情参见ffmpeg文档 (比特率参数通常写作 -b, -ba 或 -a:b).
  • tags | 示例: {"album": "1989", "artist": "Taylor Swift"} 允许你给编码器提供媒体信息标签 (需要ffmpeg). 不是所有格式都可以使用标签 (mp3 可以).
  • parameters | 示例: ["-ac", "2"] 输入额外的 命令行参数 来调用ffmepg. 这些参数可以被添加到调用的末尾 (在输出文件部分).
  • id3v2_version | 示例: "3" | 默认: "4" 设置ffmpeg使用的 ID3v2 版本来添加标签到输出文件. 如果你想让windows文件管理器显示标签, 在这使用 "3" (source).
  • cover | 示例: "/path/to/imgfile.png" 使你可以给音频文件添加封面 (到封面图片的路径). 目前, 只有MP3可以使用这个关键字参数. 封面必须是jpeg, png, bmp,或 tiff格式的文件.

AudioSegment.empty()

创建一个持续时间为零的AudioSegment对象.

from pydub import AudioSegment
empty = AudioSegment.empty()

len(empty) == 0

这是一个很有用的、用于将许多音频集合在一起的循环:

from pydub import AudioSegment

sounds = [
AudioSegment.from_wav("sound1.wav"),
AudioSegment.from_wav("sound2.wav"),
AudioSegment.from_wav("sound3.wav"),
]

playlist = AudioSegment.empty()
for sound in sounds:
playlist += sound

AudioSegment.silent()

创建一个静音的音频段, 可以被用作占位符, 保存间隔,或用做一个用于放置其他声音在其上的画布.

from pydub import AudioSegment

ten_second_silence = AudioSegment.silent(duration=10000)

支持的关键字参数:

  • duration | 示例: 3000 | 默认: 1000 (1 秒) 静音AudioSegment对象的长度,以毫秒为单位。
  • frame_rate | 示例 44100 | 默认: 11025 (11.025 kHz) 静音AudioSegment对象的帧速率 (即采样率) 以Hz为单位

AudioSegment.from_mono_audiosegments()

用多个单声道音频段创建多声道音频段(两个或更多). 每个单声道音频段都应该有相同的时长以及帧速率.

from pydub import AudioSegment

left_channel = AudioSegment.from_wav("sound1.wav")
right_channel = AudioSegment.from_wav("sound1.wav")

stereo_sound = AudioSegment.from_mono_audiosegments(left_channel, right_channel)

AudioSegment(…).dBFS

以dBFS (相当于可能的最大db数的响度)为单位返回AudioSegment对象的响度.一段方波的最大振幅会被简单地定为 0 dBFS (最大响度), 然而一段正弦波的最大振幅会被定为 -3 dBFS.

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

loudness = sound.dBFS

AudioSegment(…).channels

该音频段的声道数 (1 表示单声道, 2 表示双声道)

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

channel_count = sound.channels

AudioSegment(…).sample_width

Number of bytes in each sample (1 means 8 bit, 2 means 16 bit, etc). CD Audio is 16 bit, (sample width of 2 bytes).

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

bytes_per_sample = sound.sample_width

AudioSegment(…).frame_rate

CD音频的采样率为44.1kHz,这意味着帧速率会是 44100 (与采样率相同, 参见 frame_width). 一般值为 44100 (CD), 48000 (DVD), 22050, 24000, 12000 和 11025.

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

frames_per_second = sound.frame_rate

AudioSegment(…).frame_width

每个"frame(帧)"的字节数. 每帧包含每个声道的一次采样 (所以对于双声道而言,每帧被播放时都有两次采样). frame_width 与 channels * sample_width 相同. 对于CD音频这个值将会是 4 (2 双声道,每次采样为 2 字节).

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

bytes_per_frame = sound.frame_width

AudioSegment(…).rms

响度的度量. 用于计算 dBFS, 一种你应该在大多数情况下使用的单位. 响度是以对数计的 (rms 不是), 这使得 dB 成为一种更自然的响度衡量方式.

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

loudness = sound.rms

AudioSegment(…).max

在AudioSegment中每次采样的最大振幅. 对于像音量标准化这样的操作很有用 (在pydub.effects.normalize中提供).

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

peak_amplitude = sound.max

AudioSegment(…).max_dBFS

AudioSegment任何一帧的最大振幅, 以dBFS (相对于可能的最大振幅的值)为单位. 对于像音量标准化这样的操作很有用 (在 pydub.effects.normalize 中提供).

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

normalized_sound = sound.apply_gain(-sound.max_dBFS)

AudioSegment(…).duration_seconds

以秒为单位返回AudioSegment的持续时间 (len(sound) 返回毫秒). 这个方法是为了方便提供的; 它在内部调用了 len() .

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

assert sound.duration_seconds == (len(sound) / 1000.0)

AudioSegment(…).raw_data

音频段的原始音频数据. 对于与其他音频库协作或是使用什么需要字节流格式的音频数据的奇奇怪怪的API时很有用. 当想要实现效果器或是其他什么直接数字信号处理器(DPS)时也很有用.

You probably don’t need this, but if you do… you’ll know.

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

raw_audio_data = sound.raw_data

AudioSegment(…).frame_count()

返回一个AudioSegment的帧数目. 你可以通过在音频AudioSegment中的毫秒数用一个关键字参数 ms 取得帧的数目 (用于切片, 等等).

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

number_of_frames_in_sound = sound.frame_count()

number_of_frames_in_200ms_of_sound = sound.frame_count(ms=200)

支持的关键字参数:

  • ms | 示例: 3000 | 默认: None (输入AudioSegment的持续时间) 指定该参数后, 该方法会返回AudioSegment在 X 毫秒中的帧的数目

AudioSegment(…).append()

通过添加另一个 AudioSegment对象,返回一个新的 AudioSegment对象。 对于被添加的这一个对象 (即添加到末尾的这一个), 可以任意使用淡化. 当使用+添加AudioSegment对象时.AudioSegment(…).append()会被在内部使用。

默认为 100ms (0.1 秒) 的淡化会被用于消除劈啪声和爆裂的声音.

from pydub import AudioSegment
sound1 = AudioSegment.from_file("sound1.wav")
sound2 = AudioSegment.from_file("sound2.wav")

# 默认 100 ms 淡化
combined = sound1.append(sound2)

# 5000 ms 淡化
combined_with_5_sec_crossfade = sound1.append(sound2, crossfade=5000)

# 不进行淡化
no_crossfade1 = sound1.append(sound2, crossfade=0)

# 不进行淡化
no_crossfade2 = sound1 + sound2

支持的关键字参数:

  • crossfade | 示例: 3000 | 默认: 100 (输入AudioSegment的持续时间) 当这个参数被指定后, 该方法返回AudioSegment在X毫秒内的帧数目

AudioSegment(…).overlay()

覆盖一个 AudioSegment在其上. 结果得到的 AudioSegment they 会被同步播放. 如果被覆盖的 AudioSegment 比这一个长, 结果会被截断(所以被覆盖的声音的结果会被切断). 结果总会和这个 AudioSegment相同,甚至当使用loop 和 times 关键字参数时.

尽管 AudioSegment 对象是不可变的, 绕过这个限制覆盖一段短的声音到长的上, 或通过创建一个拥有合适时长的 AudioSegment 对象,然后两个声音到这一个上.

from pydub import AudioSegment
sound1 = AudioSegment.from_file("sound1.wav")
sound2 = AudioSegment.from_file("sound2.wav")

played_togther = sound1.overlay(sound2)

sound2_starts_after_delay = sound1.overlay(sound2, position=5000)

volume_of_sound1_reduced_during_overlay = sound1.overlay(sound2, gain_during_overlay=-8)

sound2_repeats_until_sound1_ends = sound1.overlay(sound2, loop=true)

sound2_plays_twice = sound1.overlay(sound2, times=2)

# 假设 sound1 长30秒,并且 sound2 长5秒:
sound2_plays_a_lot = sound1.overlay(sound2, times=10000)
len(sound1) == len(sound2_plays_a_lot)

支持的关键字参数:

  • position | 示例: 3000 | 默认: 0 (该AudioSegment的开头) 覆盖 AudioSegment会在X毫秒后被覆盖
  • loop | 示例: True | 默认: False (输入 AudioSegment的长度)覆盖AudioSegment会被重复 (在 position 处开始) 直到该AudioSegment结束
  • times | 示例: 4 | 默认: 1 (输入 AudioSegment 的持续时间) 覆盖AudioSegment会被重复X次 (在position处开始) 但仍然会受限于该 AudioSegment 的长度被截断
  • gain_during_overlay | 示例: -6.0 | 默认: 0 (在覆盖中不会改变音量) 再覆盖过程中,以该dB数改变原始音频的音量(增加或减少). 该参数可用于在覆盖音频播放过程中降低原始音频的音量.

AudioSegment(…).apply_gain(gain)

改变AudioSegment的振幅 (总体上的响度).增益以dB为单位指定. 这个方法被用在 + 运算符的内部.

from pydub import AudioSegment
sound1 = AudioSegment.from_file("sound1.wav")

# 给 sound1 增益 3.5 dB
louder_via_method = sound1.apply_gain(+3.5)
louder_via_operator = sound1 + 3.5

# 给 sound1 衰减 5.7 dB
quieter_via_method = sound1.apply_gain(-5.7)
quieter_via_operator = sound1 - 5.7

AudioSegment(…).fade()

一个更一般的 (更灵活的) 淡化方法. 你可以指定 start 和 end, 或指定两者之一和持续时间 (例如, start 和 duration).

from pydub import AudioSegment
sound1 = AudioSegment.from_file("sound1.wav")

fade_louder_for_3_seconds_in_middle = sound1.fade(to_gain=+6.0, start=7500, duration=3000)

fade_quieter_beteen_2_and_3_seconds = sound1.fade(to_gain=-3.5, start=2000, end=3000)

# 更简单易用的方式是使用 .fade_in() 方法. 注意: -120dB 基本是静音.
fade_in_the_hard_way = sound1.fade(from_gain=-120.0, start=0, duration=5000)
fade_out_the_hard_way = sound1.fade(to_gain=-120.0, end=0, duration=5000)

支持的关键字参数

  • to_gain | 示例: -3.0 | 默认: 0 (0dB, 不做任何改变) 结果会改变淡化的末端. -6.0 意味着淡化会从 0dB (不做任何改变) 到 -6dB, 并且在淡化后面的音频响度都会衰减6dB.
  • from_gain | 示例: -3.0 | 默认: 0 (0dB, 不做任何改变) 改变淡化的开端. -6.0 意味着淡化 (以及所有在淡化之前的音频) 都会被衰减-6dB 然后淡化到 0dB – 在淡化后面的剩余部分都会进行0dB的增益 (即不改变).
  • start | 示例: 7500 | 没有默认!没有淡化开始的默认位置! (以毫秒为单位). 5500 意味着淡化会在5.5秒后开始.
  • end | 示例: 4 | 没有默认!覆盖AudioSegment会被重复 X 次 (从 position 开始) 但仍然会受限于AudioSegment而被截断
  • duration | 示例: 4 | 没有默认! 你可以和 start 或 end 一同使用持续时间(duration), 用于替代同时指定这两者 - 这功能是为方便而提供的.

AudioSegment(…).fade_out()

在AudioSegment的末尾淡出到静音. 其内部使用了 .fade() .

支持的关键字参数

  • duration | 示例: 5000 | 没有默认值 淡化的时长(以毫秒为单位). 在内部直接传递给了 .fade()

AudioSegment(…).fade_in()

在 AudioSegment 的开头从静音淡入.其内部使用了 .fade() .

支持的关键字参数

  • duration | 示例: 5000 | 没有默认值 淡化的时长(以毫秒为单位). 在内部直接传递给了 .fade()

AudioSegment(…).reverse()

产生一个AudioSegment对象反向播放的副本. 用于 Pink Floyd, screwing around, 和一些音频处理算法.

AudioSegment(…).set_sample_width()

通过指定采样宽度(以字节为单位)来创建一个与该AudioSegment等效的版本。增大这个值通常不会导致质量的下降,但降低这个值一定会导致质量的下降。更高的采样宽度意味着更宽的动态范围。

AudioSegment(…).set_frame_rate()

通过指帧速率(以赫兹为单位)来创建一个与该AudioSegment等效的版本。增大这个值通常不会导致质量的下降,但降低这个值一定会导致质量的下降。更高的帧速率意味着更大的频响特征(即可以表示更高的频率)

AudioSegment(…).set_channels()

通过指声道数(1表示单声道,2表示双声道)来创建一个与该AudioSegment等效的版本。从单声道转换至双声道不会有任何听得出来的改变,但从双声道转换为单声道可能会导致质量损失(但仅当左右声道有不同时)

AudioSegment(…).split_to_mono()

把一个双声道 AudioSegment 对象分为两个,每个都是其中的一个声道(左或右). 返回一个含有新AudioSegment对象的列表其中左声道索引为0,右声道索引为1.

AudioSegment(…).apply_gain_stereo()

from pydub import AudioSegment
sound1 = AudioSegment.from_file("sound1.wav")

# 将左声道衰减6dB,并将右声道提升2dB
stereo_balance_adjusted = sound1.apply_gain_stereo(-6, +2)

对一个双声道AudioSegment的左右声道分别应用增益.如果这个AudioSegment是单声道的,它在应用增益前会被转换为双声道.

两个增益参数都以dB为单位指出.

AudioSegment(…).pan()

from pydub import AudioSegment
sound1 = AudioSegment.from_file("sound1.wav")

# pan the sound 15% to the right
panned_right = sound1.pan(+0.15)

# pan the sound 50% to the left
panned_left = sound1.pan(-0.50)

接受一个应该在-1.0 (100% left)到+1.0 (100% right)之间的位置参数,pan amount。
当pan_amount == 0.0 时左右平衡(即声像位置)不会改变.

改变声像不会影响感知音量的大小,但由于改变后一边的音量会减小,另一边的音量需要增大以补偿.当声像左移得很厉害时, 左声道会被提升3dB并且右声道会被静音(反之亦然).

AudioSegment(…).get_array_of_samples()

以采样数组的形式返回原始音频数据。注意:如果音频有多个声道,每个声道的采样会被连起来存放 – 举个例子,双声道音频会像这样: [sample_1_L, sample_1_R, sample_2_L, sample_2_R, …].

这个方法主要用于使用效果和其他进行其他处理。

from pydub import AudioSegment
sound = AudioSegment.from_file(“sound1.wav”)

samples = sound.get_array_of_samples()

# 然后修改采样...

new_sound = sound._spawn(samples)

注意一下,当使用numpy或scipy时,在生成前需要把他们转换回数组

import array
import numpy as np
from pydub import AudioSegment

sound = AudioSegment.from_file(“sound1.wav”)
samples = sound.get_array_of_samples()

# 对音频数据的示例操作
shifted_samples = np.right_shift(samples, 1)

# 现在需要把它们转换成一个 array.array
shifted_samples_array = array.array(sound.array_type, shifted_samples)

new_sound = sound._spawn(shifted_samples_array)

AudioSegment(…).get_dc_offset()

返回一个在-1.0到1.0的值表示该声道在直流偏移(DC offset)。该方法使用audioop.avg()统计b并通过采样最大值标准化结果。

支持的关键字参数

  • channel | 示例: 2 | 默认: 1 选择左声道(1) 或右声道(2)来统计直流偏移(DC offset). 如果该段为单声道,这个值将被忽略.

AudioSegment(…).remove_dc_offset()

从声道移除直流偏移(DC offset)。这个方法通过使用audioop.bias()实现,所以要小心溢出。

支持的关键字参数

  • channel | 示例: 2 | 默认值: None 选择左声道(1)或右声道(2)移除直流偏移(DC offset)。如果值为None, 从所有可用的声道中移除。如果该段为单声道,这个值将被忽略.
  • offset | 示例: -0.1 | 默认值: None 将从声道移除的偏移的值。如果这个值为None,将自动计算偏移. 偏移值必须在-1.0到1.0之间.

效果

通过AudioSegment对象生效的DSP效果的集合

AudioSegment(…).invert_phase()

创建该AudioSegment的一个副本并反转信号的相位。可以生成噪音的反相位波以抑制或消除噪音。

科技分类资讯推荐

最沉默的李想,最便宜的理想 - 天天要闻

最沉默的李想,最便宜的理想

导读:“没有新鲜感”,是对理想 L6 的最大褒奖。(文/周盛明 编辑/张广凯)曾经被称为“微博之王”的李想,上一条发言时间停留在 3 月 2 日,至今已过去 1 个月有余。沉默的开始,源于那场众人皆知的风波。在 MEGA 遭遇负面舆论之后,李想并不避讳赤裸地将问题的反思暴露在公众的眼光中。在这封内部信中李想表示,理想存在...
华为官方确认:华为 Pura 70标准版手机不支持“星闪”技术 - 天天要闻

华为官方确认:华为 Pura 70标准版手机不支持“星闪”技术

近日,华为Pura 70系列先锋计划已经开启,目前四款手机均已上架官网。值得注意的是,有部分拿到产品的用户反馈,Pura 70不支持华为带头开发的星闪技术,纷纷惋惜。“星闪”是华为领头开发的中国原生新一代近距离无线联接技术,汇聚了国内外300多家头部企业和机构的集体智慧,用一套标准集合蓝牙和WI-FI等传统无线技术的优势...
华为Pura系列:移动影像与科技美学的新篇章 - 天天要闻

华为Pura系列:移动影像与科技美学的新篇章

自2012年华为P系列首款产品Ascend P1问世以来,P系列一直以其对美的不懈追求和创新精神,不断推动着移动影像技术的发展,不仅给广大消费者带来无与伦比的影像体验,也引领移动影像发展由“人人可记录”的时代迈入“人人能创作”的新时代。历经12载的探索与发展,现如今,华为P系列迎来了全新品牌升级——日前华为官方发布消息称,...
华为nova 12系列迎来HarmonyOS 4.2公测,系统体验更进一步 - 天天要闻

华为nova 12系列迎来HarmonyOS 4.2公测,系统体验更进一步

春天到了,社交平台上的打卡美照也勾起了很多人的换机欲望。如果你近期也有换机打算的话,小编重点推荐华为nova 12 活力版。因为它不仅拍照、通信、系统体验等各方面表现出色,而且价格也十分亲民(2499元起),非常适合学生党,以及初入职场的年轻人。图片来源:璇儿的健康生活;图中机型:华为nova 12 活力版 12号色华为...
整合安卓和 Pixel 硬件资源,谷歌成立新部门押注 AI 领域 - 天天要闻

整合安卓和 Pixel 硬件资源,谷歌成立新部门押注 AI 领域

IT之家 4 月 19 日消息,谷歌公司近日重组旗下的软件和硬件团队,成立了全新的“Platforms and Devices”部门,整合了安卓系统和 Pixel 硬件,由技术高管里克・奥斯特罗(Rick Osterloh)领导。图源:The Verge奥斯特罗此前负责谷歌的硬件部门,监督包括 Pixel、Fitbit 和 Nest 等产品的开发和战略发展。
上蔡县举行短视频大赛颁奖典礼暨春季电商选品会 - 天天要闻

上蔡县举行短视频大赛颁奖典礼暨春季电商选品会

河南县域经济网讯 4月18日,上蔡县第一届短视频大赛颁奖典礼暨春季电商选品会,在上蔡县国家农村产业融合发展示范园电商基地举行。县政府办、团县委、发改委、商务局、农业农村局、文化广电和旅游局、融媒体中心、总工会等县直单位和各乡镇(街道)相关负责人,投资集团相关负责人参加活动。(一等奖获得者合影)(二等奖获...
Meta 发布最新人工智能模型 Llama 3;特斯拉全球裁员已推出赔偿方案,马斯克道歉;华为 Pura 70 系列一分钟售罄|极客早知道 - 天天要闻

Meta 发布最新人工智能模型 Llama 3;特斯拉全球裁员已推出赔偿方案,马斯克道歉;华为 Pura 70 系列一分钟售罄|极客早知道

理想 L6 上市:售价 24.98 万元起,5 月开启大批量交付4 月 18 日,理想 L6 正式宣布上市,售价 24.98 万元起,将在 5 月开启大批量交付。理想 L6 定位中大型 SUV,车长 4925 毫米,车宽 1960 毫米,车高 1735 毫米。配备有电动三人沙发、全景天幕、独立空调、压缩机冰箱、静音座舱等,后备厢支持一键电动放倒和复位。理想.
消息称台积电下半年量产 AMD 的锐龙 PRO 8040/8000 系列AI处理器 - 天天要闻

消息称台积电下半年量产 AMD 的锐龙 PRO 8040/8000 系列AI处理器

IT之家 4 月 19 日消息,AMD 日前发布基于全新 Zen 4 架构 + RDNA 3 架构 + XDNA 架构的锐龙 PRO 系列商用处理器产品,而最新消息称面向笔记本电脑的锐龙 PRO 8040 系列、主打台式机的锐龙 PRO 8000 系列芯片均由台积电代工生产,预估将于今年下半年上市。消息称锐龙 PRO 8040 系列和锐龙 PRO 8000
TikTok越南6700万用户带来了示范效应 - 天天要闻

TikTok越南6700万用户带来了示范效应

【蓝科技观察】美国和越南对TikTok态度迥异,这种态度直接影响着商业趋势。尤其是在碎片化的商业时代,TikTok对于捕捉精准用户,对于帮助企业借助新媒体挖掘增量市场的重要性,不言而喻。 ....