1、eyeD3html
如下是eyed3的官方介紹python
eyeD3 is a Python tool for working with audio files, specifically mp3 files containing ID3 metadata (i.e. song info).git
It provides a command-line tool (eyeD3) and a Python library (import eyed3) that can be used to write your own applications or plugins that are callable from the command-line tool.github
For example, to set some song information in an mp3 file called song.mp3:windows
$ eyeD3 -a Nobunny -A "Love Visions" -t "I Am a Girlfriend" -n 4 song.mp3markdown
簡單來講,eyeD3 這個庫只要是用來處理MP3文件的,特別是帶ID3 metadata的文件(通常MP3文件都會帶有一些額外信息,好比說歌手、專輯之類的,後面會說怎麼提取這些信息)。eyeD3 提供了兩種使用方法,一種是使用command line 直接在命令行中執行 eyeD3 --...就能夠對MP3進行處理,還有一種是在python中使用 import eyed3 導入。app
上面的例子就是官方提供的一個使用eyeD3 命令行執行的語句,-a 是 --artist 的簡寫,即添加歌手信息,-A 是 --album的簡寫,即添加專輯信息,-t 是 --title的簡寫,即添加歌曲名字,-n 是 --track-num 的簡寫,即添加磁道數。這些通常都是 MP3文件ID3 tag 的默認屬性。咱們若是直接輸入 eyeD3 song.mp3 就會直接顯示歌曲的基本信息,ide
windows下測試截圖以下:函數
能夠看出確實常見的信息都顯示出來了。工具
eyeD3 命令行講完以後,再來講下如何在Python中使用。仍是看官方給的例子吧:
import eyed3
audiofile = eyed3.load("song.mp3")
audiofile.tag.artist = u"Nobunny"
audiofile.tag.album = u"Love Visions"
audiofile.tag.album_artist = u"Various Artists"
audiofile.tag.title = u"I Am a Girlfriend"
audiofile.tag.track_num = 4
audiofile.tag.save()
上面的代碼,使用 import eyed3 導入eyeD3 庫,而後使用load方法加載mp3文件,後面的幾行分別是設置 artist,album等等 ID3 tag ,直接看代碼就能看出來,就不說了。若是想顯示mp3文件內部的ID3 tag信息,直接print 相應的tag就好了,好比 print(audiofile.tag.artist)等等,固然,前提是你的MP3 metadata得儲存了這些信息。其實還有一些更復雜和高級的用法,我就不講了,你們有興趣直接去官方文檔看吧,地址:http://eyed3.nicfit.net/index.html。eyeD3 主要就是處理 MP3文件的metadata的,至於解析音頻之類的就得用其餘的庫了。
2、pydub
第一個介紹的eyeD3 通常只能處理MP3文件,功能上相對來講也是比較簡單一點。下面介紹的pydub庫就要強大的多。老規矩,仍是先看一下它的官方介紹:
Manipulate audio with a simple and easy high level interface http://pydub.com 就一句話,簡單,易用的處理音頻的高度抽象的接口,嘿,這不就是咱們要找的麼。github項目地址爲:https://github.com/jiaaro/pydub/ 有1800多的star,說明這個
庫仍是很受歡迎的。安裝直接很簡單,直接 pip install pydub 就能夠安裝。可是須要注意的是:
You can open and save WAV files with pure python. For opening and saving non-wav files – like mp3 – you'll need ffmpeg orlibav.
這裏是說python自帶的wave模塊只能處理 wav 格式的音頻文件,若是要想處理相似MP3格式的文件,就得要裝 ffmpeg或者libav了。
什麼是ffmpeg 呢?
ffmpeg 是一個跨平臺的 能夠用來 記錄、轉化音頻與視頻的工具,若是你作過數字信號處理方面的工做,對它應該不陌生。還有一個libav,實際上是從ffmpeg分出來的一個分支,功能和 ffmpeg差很少,兩者你任選一個下載就能夠了。windows下直接選擇可執行文件安裝便可。
仍是看官網的例子來介紹吧。
I:打開 mp3或者mp4等文件
能夠採用以下的命令:
from pydub import AudioSegment
song = AudioSegment.from_wav("never_gonna_give_you_up.wav")
song = AudioSegment.from_mp3("never_gonna_give_you_up.mp3")
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")
能夠打開任何 ffmpeg支持的文件類型,從上面能夠看出,主要有 from_filetype()方法,filetype爲具體的文件類型,好比 wav,mp3等
或者通用的 from_file()方法,可是這個方法必須在第二個參數指定打開文件的類型,返回的結果都是 AudioSegment對象。
II:切割音頻
# pydub does things in milliseconds
ten_seconds = 10 * 1000
first_10_seconds = song[:ten_seconds]
last_5_seconds = song[-5000:]
注意pydub中的標準時間爲毫秒,上面的代碼就獲得了音樂的前10秒和後5秒,很是簡單。
III:調整音量
# boost volume by 6dB
beginning = first_10_seconds + 6
# reduce volume by 3dB
end = last_5_seconds - 3
+6 就表示將音樂的音量提升6分貝,-3就表示將音樂的音量下降3分貝
IV: 拼接兩段音樂
without_the_middle = beginning + end
without_the_middle.duration_seconds
拼接以後的音樂時長是兩段音樂時長之和,能夠經過 .duration_seconds方法來獲取一段音樂的時長。這與使用 len(audio)/1000.0獲得的結果是同樣的。
V:將音樂翻轉(reverse)
# song is not modified
# AudioSegments are immutable
backwards = song.reverse()
注意 AudioSegment 對象是不可變的,上面使用reverse 方法不會改變song這個對象,而是會返回一個新的AudioSegment對象,其餘的方法也是這樣,須要注意。reverse簡單來講就是 將音樂從尾部向頭部開始逆序播放,我試了一下,發現轉換以後還真的挺有意思的。
VI:crossfade(交叉漸入漸出方法)
# 1.5 second crossfade
with_style = beginning.append(end, crossfade=1500)
crossfade 就是讓一段音樂平緩地過渡到另外一段音樂,上面的crossfade = 1500 表示過渡的時間是1.5秒。
VII:repeat(重複音樂片斷)
# repeat the clip twice
do_it_over = with_style * 2
上面的代碼讓音樂重複播放兩次
VIII:fade in and fade out(逐漸加強與逐漸減弱)
# 2 sec fade in, 3 sec fade out
awesome = do_it_over.fade_in(2000).fade_out(3000)
逐漸加強2秒,逐漸減弱3秒
XI:save(保存)
awesome.export("mashup.mp3", format="mp3")
awesome.export("mashup.mp3", format="mp3", tags={'artist': 'Various artists', 'album': 'Best of 2011', 'comments': 'This album is awesome!'})
這裏展現了兩種保存的形式,都是使用export方法,要指定保存的格式,使用format 參數,但第二種方法多了一個tags參數,其實看一下應該就很容易明白,是保存 歌曲ID3 tag信息的。
以上只是pydub 使用方法的初步介紹,還有其餘很是多的功能,請自行移步官方API 文檔:https://github.com/jiaaro/pydub/blob/master/API.markdown
介紹的很是詳細。
3、PyAudio
又是一個功能強大的處理音頻庫。官方介紹:
PyAudio provides Python bindings for PortAudio, the cross-platform audio I/O library. With PyAudio, you can easily use Python to play and record audio on a variety of platforms. PyAudio is inspired by:
Pyaudio 提供了對於跨平臺的 PortAudio(處理 audio輸入輸出的庫)的綁定,PyAudio可讓你輕鬆錄製與播放音頻。
廢話很少說,直接看官方文檔(https://people.csail.mit.edu/hubert/pyaudio/docs/)提供的一個quick start 的代碼
"""PyAudio Example: Play a wave file."""
import pyaudio
import wave
import sys
CHUNK = 1024
if len(sys.argv) < 2:
print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
sys.exit(-1)
wf = wave.open(sys.argv[1], 'rb')
# instantiate PyAudio (1)
p = pyaudio.PyAudio()
# open stream (2)
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
# read data
data = wf.readframes(CHUNK)
# play stream (3)
while len(data) > 0:
stream.write(data)
data = wf.readframes(CHUNK)
# stop stream (4)
stream.stop_stream()
stream.close()
# close PyAudio (5)
p.terminate()
固然,這個提供的是使用命令行參數接收音頻文件的形式,CHUNK 是一次讀取的音頻byte數量,p = pyaudio.PyAudio()初始化一個
PyAudio對象,而後使用其open方法打開一個輸入輸出流,這裏指定了output=True說明這是一個輸出流,即咱們是往stream中添加data,若是這裏改成 input = True就是變成輸入流了,通常是從設備的標準 audio device ,對於電腦來講可能就是麥克風了,來讀取音頻data。使用wave打開一個 .wav 文件,而後使用 readframes方法每次讀取 CHUNK 這麼多的數據,將數據寫入 stream,直到讀完爲止。寫入stream的audio data 就會不斷經過麥克風播放出來了,因而咱們就能夠聽到音樂了。最後在結束的時候,注意要關閉相應的對象以釋放資源。
還有一種方法是使用callback(回調函數)函數,代碼以下:
"""PyAudio Example: Play a wave file (callback version)."""
import pyaudio
import wave
import time
import sys
if len(sys.argv) < 2:
print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
sys.exit(-1)
wf = wave.open(sys.argv[1], 'rb')
# instantiate PyAudio (1)
p = pyaudio.PyAudio()
# define callback (2)
def callback(in_data, frame_count, time_info, status):
data = wf.readframes(frame_count)
return (data, pyaudio.paContinue)
# open stream using callback (3)
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True,
stream_callback=callback)
# start the stream (4)
stream.start_stream()
# wait for stream to finish (5)
while stream.is_active():
time.sleep(0.1)
# stop stream (6)
stream.stop_stream()
stream.close()
wf.close()
# close PyAudio (7)
p.terminate()
不細說了。
下面來看一個使用pyaudio + numpy + pylab 可視化音頻的代碼,下面的代碼打開電腦的麥克風,而後接受音頻輸入,再以圖像的形式展現出來。
# -*- coding: utf-8 -*-
import pyaudio
import numpy as np
import pylab
import time
RATE = 44100
CHUNK = int(RATE/20) # RATE/number of updates per second
def sound_plot(stream):
t1 = time.time() # time starting
data = np.fromstring(stream.read(CHUNK),dtype = np.int16)
pylab.plot(data)
pylab.title(i)
pylab.grid()
pylab.axis([0,len(data),-2**8,2**8])
pylab.savefig("sound.png",dpi=50)
pylab.show(block = False)
time.sleep(0.5)
pylab.close('all')
print("took %.2f ms." % (time.time() - t1)*1000)
if __name__ == '__main__':
p = pyaudio.PyAudio()
stream = p.open(format = pyaudio.paInt16,channels = 1,rate = RATE,
input = True,frames_per_buffer = CHUNK)
for i in range(int(20*RATE/CHUNK)):
# for 10 seconds
sound_plot(stream)
stream.stop_stream()
stream.close()
p.terminate()
代碼應該比較容易理解。獲得的大概是像下面這樣的圖形:
須要注意的是,若是不是在交互式命令下執行pylab或者matplotlib的plot命令,其plt.show()函數是一個block函數,這會致使最後的
plt.close('all') 關閉全部的窗口只會在手動關閉了圖像以後纔會執行,全部咱們沒法看到連續變化的圖像,爲了解決這個問題,咱們將plt.show()函數block參數設爲False,這樣show函數就不是block函數了,能夠直接執行plt.close('all')命令,爲了避免由於圖像刷新太快咱們看不清變化,因此使用time.sleep(0.5) 暫停0.5秒。