背景
刚从 B 站上看过倒放挑战之后也想体验下, 心血来潮一个晚上完成了基本的实现. 其中倒放与播放部分使用了 pydub 这个音频库, 十分快捷方便, 但是它完整一套的配置让我还是踩了几个坑. 特将其配置过程记录于此, 方便大家.
Windows10 系统
<Pydub in GitHub> https://github.com/jiaaro/pydub.git
安装 Pydub
Anaconda: 打开 Anaconda prompt,activate 切换至工作环境下, 键入 pip install pydub
Pycharm:setting 下 project, 将 pydub 安装进 pip 环境
安装 FFMPEG(或选择 libav)
下载 FFMPEG
<FFMPEG 官网> https://ffmpeg.org/ : 找到对应的系统版本下载.
将压缩包解压到任意目录.
将安装安装目录下的 bin 文件夹添加到系统的 Path 环境变量中.
如果添加环境变量成功后, 打开 cmd, 键入 FFMPEG -version, 就可以看到版本信息.
下载 FFMPEG 包
除了按完成以上下载之外, 还需要在 python 中导入 FFMPEG 包
同上 Pydub 包导入 - pip install FFMPEG
安装 Pyaudio
可以仅使用纯 Pydub 打开或保存 WAV 文件. 为了打开或保存非 WAV 文件 -- 比如 MP3-- 你需要 ffmepg 或是 libav. 而如果需要播放音频, 则需要安装以下包:
- simpleaudio
- pyaudio
- ffplay (通常随 FFMPEG 安装)
- avplay ((通常随 libav 安装)
官网是强烈推荐安装 simpleaudio, 而我选择的是 pyaudio, 因为之后程序的其他部分还需要用到, 所以就直接选择了 pyaudio.
包安装同上 Pydub - pip install pyaudio
至此安装配置工作完成, 可试验以下代码看是否能运行.
- from pydub import AudioSegment
- from pydub.playback import play
- sound = AudioSegment.from_file("0.mp3", "mp3")
- play(sound)
问题:[Errno 13] Permission denied
安装了 pydub 和 FFMPEG, 但是缺少播放音频的包, 安装后不再显示.
问题 [WinError 2] 系统找不到指定的文件
安装了 FFMPEG 其中的一项, 还缺少另外一项, 安装后不再显示.
常用 API
打开一个 XXX 类型文件:
- mp4_version = AudioSegment.from_file("never_gonna_give_you_up.mp3", "mp3")
- wma_version = AudioSegment.from_file("never_gonna_give_you_up.wav", "wav")
- aac_version = AudioSegment.from_file("never_gonna_give_you_up.mp4", "mp4")
对音频段切片
- # pydub 做任何操作的时间尺度都是毫秒
- ten_seconds = 10 * 1000
- first_10_seconds = song[:ten_seconds]
- last_5_seconds = song[-5000:]
连接音频段
without_the_middle = beginning + end
让开头更响和让结束更弱
- # 声音增益 6dB
- beginning = first_10_seconds + 6
- # 声音减弱 3dB
- end = last_5_seconds - 3
重复
- # 将片段重复两遍
- do_it_over = with_style * 2
倒放
- # 读取想要倒放的音频文件
- ted = AudioSegment.from_file("ted.mp3")
- # 将音频倒放赋给变量 backwards
- backwards = ted.reverse()
保存结果 / 音频格式转换
awesome.export("mashup.mp3", format="mp3")
批量处理音频
- from pydub import AudioSegment
- # i 从 0 到 9 取值
- for i in range(10):
- # 按顺序读取 00i.m4a 文件
- temp = AudioSegment.from_file(f"00{i}.m4a")
- # 将 00i.m4a 转换为 答案 00i.mp3
- temp.export(f"答案 00{i}.mp3")
- # 将音频倒放
- backplay = temp.reverse()
- # 将倒放音频存为 音谜 00i.mp3
- backplay.export(f"音谜 00{i}.mp3")
- # 打印个 done 提示完成
- print("done")
举个例子:
- 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')
来源: https://www.cnblogs.com/ymjun/p/12150811.html