如何利用Python播放和录制声音
如果您想使用Python播放或錄制聲音,那么您來對地方了!在本教程中,您將學習如何使用一些最流行的音頻庫在Python中播放和錄制聲音。您將了解最直接的播放和錄制聲音的方法,然后您將了解一些提供更多功能的庫,以換取一些額外的代碼行。
在本教程結束時,您將了解如何:
-
播放MP3和WAV文件,以及一系列其他音頻格式
-
播放包含聲音的NumPy和Python數組
-
使用Python錄制聲音
-
以各種不同的文件格式保存錄制文件或音頻文件
播放音頻文件
下面,您將看到如何使用一系列Python庫播放音頻文件。其中一些庫允許您播放一系列音頻格式,包括MP3和NumPy陣列。下面的所有庫都允許您播放WAV文件,其中一些代碼行代碼比其他文件更多:
-
playsound如果你只是想播放WAV或MP3文件,是最簡單的包。除簡單播放外,它不提供任何功能。
-
simpleaudio 讓您播放WAV文件和NumPy數組,并為您提供檢查文件是否仍在播放的選項。
-
winsound 允許您播放WAV文件或發出嗶嗶聲,但它僅適用于Windows。
-
python-sounddevice并pyaudio為PortAudio庫提供綁定,以便跨平臺播放WAV文件。
-
pydub需要pyaudio進行音頻播放,但ffmpeg安裝后,只需幾行代碼即可播放各種音頻格式。
讓我們一起來看看這些用于音頻播放的庫。
- playsound
playsound是一個“純Python,跨平臺,單一功能模塊,不依賴于播放聲音。” 使用此模塊,您可以使用一行代碼播放聲音文件:
from playsound import playsound playsound('myfile.wav')該文件中playsound指出,它已在WAV和MP3文件進行測試,但它可能對其他文件格式正常工作。
該庫最后更新于2017年6月。在撰寫本文時似乎運行良好,但目前尚不清楚它是否仍然支持更新的Python版本。
simpleaudio
simpleaudio是一個跨平臺的庫,用于播放沒有依賴關系的(單聲道和立體聲)WAV文件。以下代碼可用于播放WAV文件,并在終止腳本之前等待文件完成播放:
import simpleaudio as sa filename = 'myfile.wav' wave_obj = sa.WaveObject.from_wave_file(filename) play_obj = wave_obj.play() play_obj.wait_done() # Wait until sound has finished playingWAV文件包含表示原始音頻數據的一系列位,以及具有 RIFF(資源交換文件格式)格式的元數據的標題。
對于CD錄制,行業標準是將每個音頻樣本(與氣壓相關的單個音頻數據點)存儲為16位值,每秒44100個樣本。
為了減小文件大小,以較低的采樣率存儲一些記錄(例如人類語音)可能就足夠了,例如每秒8000個樣本,盡管這確實意味著較高的聲音頻率可能沒有準確表示。
本教程中討論的一些庫播放和記錄bytes對象,而其他庫使用NumPy數組來存儲原始音頻數據。
兩者都對應于一系列數據點,這些數據點可以以指定的采樣率播放以播放聲音。對于bytes對象,每個樣本存儲為一組兩個8位值,而在NumPy數組中,每個元素可以包含對應于單個樣本的16位值。
這兩種數據類型之間的一個重要區別是bytes對象是不可變的,而NumPy數組是可變的,使后者更適合生成聲音和更復雜的信號處理。有關如何使用NumPy的更多信息,請查看我們的NumPy教程。
simpleaudio允許您使用NumPy和Python數組和bytes對象simpleaudio.play_buffer()。確保安裝了NumPy以使以下示例正常工作simpleaudio。(pip安裝后,您可以通過pip install numpy從控制臺運行來執行此操作。)
有關如何使用pip安裝包的更多信息,
下面你將看到如何生成一個對應于440 Hz音調的NumPy數組并使用simpleaudio.play_buffer()以下方式播放:
import numpy as np import simpleaudio as safrequency = 440 # Our played note will be 440 Hz fs = 44100 # 44100 samples per second seconds = 3 # Note duration of 3 seconds# Generate array with seconds*sample_rate steps, ranging between 0 and seconds t = np.linspace(0, seconds, seconds * fs, False)# Generate a 440 Hz sine wave note = np.sin(frequency * t * 2 * np.pi)# Ensure that highest value is in 16-bit range audio = note * (2**15 - 1) / np.max(np.abs(note)) # Convert to 16-bit data audio = audio.astype(np.int16)# Start playback play_obj = sa.play_buffer(audio, 1, 2, fs)# Wait for playback to finish before exiting play_obj.wait_done()接下來,讓我們看看如何winsound在Windows機器上播放WAV文件。
winsound
如果使用Windows,則可以使用內置winsound模塊訪問其基本的聲音播放機器。播放WAV文件可以在幾行代碼中完成:
import winsoundfilename = 'myfile.wav' winsound.PlaySound(filename, winsound.SND_FILENAME)winsound不支持播放WAV文件以外的任何文件。它確實允許您使用揚聲器發出嗶嗶聲winsound.Beep(frequency, duration)。例如,您可以使用以下代碼將1000 Hz音調發出100毫秒的響聲:
import winsound winsound.Beep(1000, 100) # Beep at 1000 Hz for 100 ms接下來,您將學習如何使用該python-sounddevice模塊進行跨平臺音頻播放。
python-sounddevice
正如其文檔中所述,python-sounddevice“為PortAudio庫提供綁定,并提供一些便利功能來播放和記錄包含音頻信號的NumPy數組”。為了播放WAV文件,numpy而且soundfile需要安裝,打開WAV文件作為NumPy的陣列。
隨著python-sounddevice,numpy以及soundfile安裝,您現在可以讀取WAV文件作為與NumPy陣列和回放:
import sounddevice as sd import soundfile as sf filename = 'myfile.wav' # Extract data and sampling rate from file data, fs = sf.read(filename, dtype='float32') sd.play(data, fs) status = sd.wait() # Wait until file is done playing該行包含sf.read()提取原始音頻數據,以及存儲在其RIFF標題中的文件的采樣率,并sounddevice.wait()確保腳本僅在聲音播放完畢后終止。
接下來,我們將學習如何使用pydub播放聲音。通過安裝正確的依賴項,它允許您播放各種音頻文件,并為您提供更多的音頻處理選項python-soundevice。
pydub
雖然pydub可以在沒有任何依賴性的情況下打開和保存WAV文件,但您需要安裝音頻播放包才能播放音頻。simpleaudio強烈建議,但是pyaudio,ffplay和avplay有其他選擇。
以下代碼可用于播放WAV文件pydub:
from pydub import AudioSegment from pydub.playback import play sound = AudioSegment.from_wav('myfile.wav') play(sound)為了播放其他音頻類型,如MP3文件,ffmpeg或者libav應該安裝。看一看在文檔中pydub的說明。作為文檔中描述的步驟的替代,ffmpeg-python提供綁定ffmpeg,并可以使用pip安裝:
$ pip install ffmpeg-python隨著ffmpeg安裝,播放MP3文件,只需要在我們的前面的代碼一個小的變化:
from pydub import AudioSegment from pydub.playback import playsound = AudioSegment.from_mp3('myfile.mp3') play(sound)使用該AudioSegment.from_file(filename, filetype)結構,您可以播放任何類型的支持音頻文件ffmpeg。例如,您可以使用以下方式播放WMA文件:
sound = AudioSegment 。from_file ('myfile.wma' , 'wma' )除了播放聲音文件之外,還pydub可以使用不同的文件格式保存音頻(稍后會詳細介紹),切片音頻,計算音頻文件的長度,淡入或淡出以及應用交叉淡入淡出。
AudioSegment.reverse()創建一個向后播放的AudioSegment的副本,該文檔描述為“對Pink Floyd有用,可以使用,以及一些音頻處理算法”。
pyaudio
import pyaudio import wavefilename = 'myfile.wav'# Set chunk size of 1024 samples per data frame chunk = 1024 # Open the sound file wf = wave.open(filename, 'rb')# Create an interface to PortAudio p = pyaudio.PyAudio()# Open a .Stream object to write the WAV file to # 'output = True' indicates that the sound will be played rather than recorded stream = p.open(format = p.get_format_from_width(wf.getsampwidth()),channels = wf.getnchannels(),rate = wf.getframerate(),output = True)# Read data in chunks data = wf.readframes(chunk)# Play the sound by writing the audio data to the stream while data != '':stream.write(data)data = wf.readframes(chunk)# Close and terminate the stream stream.close() p.terminate()您可能已經注意到,播放聲音pyaudio比使用您之前看到的庫播放聲音要復雜一些。這意味著如果您只想在Python應用程序中播放聲音效果,它可能不是您的首選。
但是,由于pyaudio為您提供了更多的低級控制,因此可以為輸入和輸出設備獲取和設置參數,并檢查CPU負載和輸入或輸出延遲。
它還允許您在回調模式下播放和錄制音頻,其中當需要播放或可用于錄制時需要新數據時調用指定的回調函數。pyaudio如果您的音頻需求不僅僅是簡單的播放,這些選項可以使用合適的庫。
現在您已經了解了如何使用許多不同的庫來播放音頻,現在是時候看看如何使用Python自己錄制音頻了。
錄制音頻
在python-sounddevice和pyaudio庫提供的方式來錄制音頻和Python。python-sounddevice記錄到NumPy數組和pyaudio記錄到bytes對象。這兩個都可以分別使用scipy和wave庫存儲為WAV文件。
python-sounddevice
python-sounddevice允許您錄制麥克風的音頻并將其存儲為NumPy陣列。這是一種方便的聲音處理數據類型,可以使用該scipy.io.wavfile模塊轉換為WAV格式進行存儲。確保安裝scipy以下示例的模塊(pip install scipy)。這會自動將NumPy安裝為其依賴項之一:
import sounddevice as sd from scipy.io.wavfile import writefs = 44100 # Sample rate seconds = 3 # Duration of recordingmyrecording = sd.rec(int(seconds * fs), samplerate=fs, channels=2) sd.wait() # Wait until recording is finished write('output.wav', fs, myrecording) # Save as WAV filepyaudio
在本文的前面部分,您學習了如何通過閱讀來播放聲音pyaudio.Stream()。錄制音頻可以通過寫入此流來完成:
import pyaudio import wavechunk = 1024 # Record in chunks of 1024 samples sample_format = pyaudio.paInt16 # 16 bits per sample channels = 2 fs = 44100 # Record at 44100 samples per second seconds = 3 filename = "output.wav"p = pyaudio.PyAudio() # Create an interface to PortAudioprint('Recording')stream = p.open(format=sample_format,channels=channels,rate=fs,frames_per_buffer=chunk,input=True)frames = [] # Initialize array to store frames# Store data in chunks for 3 seconds for i in range(0, int(fs / chunk * seconds)):data = stream.read(chunk)frames.append(data)# Stop and close the stream stream.stop_stream() stream.close() # Terminate the PortAudio interface p.terminate()print('Finished recording')# Save the recorded data as a WAV file wf = wave.open(filename, 'wb') wf.setnchannels(channels) wf.setsampwidth(p.get_sample_size(sample_format)) wf.setframerate(fs) wf.writeframes(b''.join(frames)) wf.close()現在您已經了解了如何用python-sounddevice和記錄音頻pyaudio,您將學習如何將錄音(或任何其他音頻文件)轉換為一系列不同的音頻格式。
保存和轉換音頻
您之前看到可以使用該scipy.io.wavfile模塊將NumPy陣列存儲為WAV文件。該wavio模塊同樣允許您在WAV文件和NumPy數組之間進行轉換。如果您想以不同的文件格式存儲音頻,pydub并且soundfile派上用場,因為它們允許您讀取和寫入一系列流行的文件格式(例如MP3,FLAC,WMA和FLV)。
wavio
此模塊依賴于numpy并允許您將WAV文件讀取為NumPy陣列,并將NumPy陣列保存為WAV文件。
要將NumPy數組保存為WAV文件,您可以使用wavio.write():
import waviowavio.write("myfile.wav", my_np_array, fs, sampwidth=2)在此示例中,my_np_array包含音頻的NumPy數組fs是記錄的采樣率(通常為44100或44800 Hz),并且sampwidth是音頻的采樣寬度(每個采樣的字節數,通常為1或2個字節)。
soundfile
該soundfile庫可以讀寫所有支持的文件格式libsndfile。雖然它無法播放音頻,但它允許您將音頻轉換為FLAC,AIFF和一些不太常見的音頻格式。要將WAV文件轉換為FLAC,可以使用以下代碼:
import soundfile as sf# Extract audio data and sampling rate from file data, fs = sf.read('myfile.wav') # Save as FLAC file at correct sampling rate sf.write('myfile.flac', data, fs)類似的代碼將用于轉換支持的其他文件格式libsndfile。
pydub
pydub讓您以任何ffmpeg支持的格式保存音頻,其中包括您日常生活中可能遇到的幾乎所有音頻類型。例如,您可以使用以下代碼將WAV文件轉換為MP3:
from pydub import AudioSegment sound = AudioSegment.from_wav('myfile.wav')sound.export('myfile.mp3', format='mp3')使用AudioSegment.from_file()是一種加載音頻文件的更通用的方法。例如,如果要將文件從MP3轉換回WAV,可以執行以下操作:
from pydub import AudioSegment sound = AudioSegment.from_file('myfile.mp3', format='mp3')sound.export('myfile.wav', format='wav')此代碼應適用于任何格式的音頻文件是ffmpeg支持。
結論:在Python中播放和錄制聲音
在本教程中,您學習了如何使用一些最流行的音頻庫來播放和錄制Python中的音頻。您還了解了如何以多種不同格式保存音頻。
你現在能夠:
播放各種音頻格式,包括WAV,MP3和NumPy陣列
將麥克風的音頻錄制到NumPy或Python陣列
將錄制的音頻存儲為各種格式,包括WAV和MP3
將聲音文件轉換為一系列不同的音頻格式
總結
以上是生活随笔為你收集整理的如何利用Python播放和录制声音的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转载】几个比较靠谱的即时通讯软件
- 下一篇: 即时通讯软件线上系统维护工作总结