日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

如何利用Python播放和录制声音

發(fā)布時間:2025/3/15 python 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何利用Python播放和录制声音 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

如果您想使用Python播放或錄制聲音,那么您來對地方了!在本教程中,您將學(xué)習(xí)如何使用一些最流行的音頻庫在Python中播放和錄制聲音。您將了解最直接的播放和錄制聲音的方法,然后您將了解一些提供更多功能的庫,以換取一些額外的代碼行。

在本教程結(jié)束時,您將了解如何:

  • 播放MP3和WAV文件,以及一系列其他音頻格式

  • 播放包含聲音的NumPy和Python數(shù)組

  • 使用Python錄制聲音

  • 以各種不同的文件格式保存錄制文件或音頻文件

播放音頻文件

下面,您將看到如何使用一系列Python庫播放音頻文件。其中一些庫允許您播放一系列音頻格式,包括MP3和NumPy陣列。下面的所有庫都允許您播放WAV文件,其中一些代碼行代碼比其他文件更多:

  • playsound如果你只是想播放WAV或MP3文件,是最簡單的包。除簡單播放外,它不提供任何功能。

  • simpleaudio 讓您播放WAV文件和NumPy數(shù)組,并為您提供檢查文件是否仍在播放的選項。

  • winsound 允許您播放WAV文件或發(fā)出嗶嗶聲,但它僅適用于Windows。

  • python-sounddevice并pyaudio為PortAudio庫提供綁定,以便跨平臺播放WAV文件。

  • pydub需要pyaudio進(jìn)行音頻播放,但ffmpeg安裝后,只需幾行代碼即可播放各種音頻格式。

讓我們一起來看看這些用于音頻播放的庫。

  • playsound

playsound是一個“純Python,跨平臺,單一功能模塊,不依賴于播放聲音。” 使用此模塊,您可以使用一行代碼播放聲音文件:

from playsound import playsound playsound('myfile.wav')

該文件中playsound指出,它已在WAV和MP3文件進(jìn)行測試,但它可能對其他文件格式正常工作。

該庫最后更新于2017年6月。在撰寫本文時似乎運行良好,但目前尚不清楚它是否仍然支持更新的Python版本。

simpleaudio

simpleaudio是一個跨平臺的庫,用于播放沒有依賴關(guān)系的(單聲道和立體聲)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 playing

WAV文件包含表示原始音頻數(shù)據(jù)的一系列位,以及具有 RIFF(資源交換文件格式)格式的元數(shù)據(jù)的標(biāo)題。

對于CD錄制,行業(yè)標(biāo)準(zhǔn)是將每個音頻樣本(與氣壓相關(guān)的單個音頻數(shù)據(jù)點)存儲為16位值,每秒44100個樣本。

為了減小文件大小,以較低的采樣率存儲一些記錄(例如人類語音)可能就足夠了,例如每秒8000個樣本,盡管這確實意味著較高的聲音頻率可能沒有準(zhǔn)確表示。

本教程中討論的一些庫播放和記錄bytes對象,而其他庫使用NumPy數(shù)組來存儲原始音頻數(shù)據(jù)。

兩者都對應(yīng)于一系列數(shù)據(jù)點,這些數(shù)據(jù)點可以以指定的采樣率播放以播放聲音。對于bytes對象,每個樣本存儲為一組兩個8位值,而在NumPy數(shù)組中,每個元素可以包含對應(yīng)于單個樣本的16位值。

這兩種數(shù)據(jù)類型之間的一個重要區(qū)別是bytes對象是不可變的,而NumPy數(shù)組是可變的,使后者更適合生成聲音和更復(fù)雜的信號處理。有關(guān)如何使用NumPy的更多信息,請查看我們的NumPy教程。

simpleaudio允許您使用NumPy和Python數(shù)組和bytes對象simpleaudio.play_buffer()。確保安裝了NumPy以使以下示例正常工作simpleaudio。(pip安裝后,您可以通過pip install numpy從控制臺運行來執(zhí)行此操作。)

有關(guān)如何使用pip安裝包的更多信息,

下面你將看到如何生成一個對應(yīng)于440 Hz音調(diào)的NumPy數(shù)組并使用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,則可以使用內(nèi)置winsound模塊訪問其基本的聲音播放機器。播放WAV文件可以在幾行代碼中完成:

import winsoundfilename = 'myfile.wav' winsound.PlaySound(filename, winsound.SND_FILENAME)

winsound不支持播放WAV文件以外的任何文件。它確實允許您使用揚聲器發(fā)出嗶嗶聲winsound.Beep(frequency, duration)。例如,您可以使用以下代碼將1000 Hz音調(diào)發(fā)出100毫秒的響聲:

import winsound winsound.Beep(1000, 100) # Beep at 1000 Hz for 100 ms

接下來,您將學(xué)習(xí)如何使用該python-sounddevice模塊進(jìn)行跨平臺音頻播放。

python-sounddevice

正如其文檔中所述,python-sounddevice“為PortAudio庫提供綁定,并提供一些便利功能來播放和記錄包含音頻信號的NumPy數(shù)組”。為了播放WAV文件,numpy而且soundfile需要安裝,打開WAV文件作為NumPy的陣列。

隨著python-sounddevice,numpy以及soundfile安裝,您現(xiàn)在可以讀取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()提取原始音頻數(shù)據(jù),以及存儲在其RIFF標(biāo)題中的文件的采樣率,并sounddevice.wait()確保腳本僅在聲音播放完畢后終止。

接下來,我們將學(xué)習(xí)如何使用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應(yīng)該安裝。看一看在文檔中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)結(jié)構(gòu),您可以播放任何類型的支持音頻文件ffmpeg。例如,您可以使用以下方式播放WMA文件:

sound = AudioSegment 。from_file ('myfile.wma' , 'wma' )

除了播放聲音文件之外,還pydub可以使用不同的文件格式保存音頻(稍后會詳細(xì)介紹),切片音頻,計算音頻文件的長度,淡入或淡出以及應(yīng)用交叉淡入淡出。

AudioSegment.reverse()創(chuàng)建一個向后播放的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()

您可能已經(jīng)注意到,播放聲音pyaudio比使用您之前看到的庫播放聲音要復(fù)雜一些。這意味著如果您只想在Python應(yīng)用程序中播放聲音效果,它可能不是您的首選。

但是,由于pyaudio為您提供了更多的低級控制,因此可以為輸入和輸出設(shè)備獲取和設(shè)置參數(shù),并檢查CPU負(fù)載和輸入或輸出延遲。

它還允許您在回調(diào)模式下播放和錄制音頻,其中當(dāng)需要播放或可用于錄制時需要新數(shù)據(jù)時調(diào)用指定的回調(diào)函數(shù)。pyaudio如果您的音頻需求不僅僅是簡單的播放,這些選項可以使用合適的庫。

現(xiàn)在您已經(jīng)了解了如何使用許多不同的庫來播放音頻,現(xiàn)在是時候看看如何使用Python自己錄制音頻了。

錄制音頻

在python-sounddevice和pyaudio庫提供的方式來錄制音頻和Python。python-sounddevice記錄到NumPy數(shù)組和pyaudio記錄到bytes對象。這兩個都可以分別使用scipy和wave庫存儲為WAV文件。

python-sounddevice

python-sounddevice允許您錄制麥克風(fēng)的音頻并將其存儲為NumPy陣列。這是一種方便的聲音處理數(shù)據(jù)類型,可以使用該scipy.io.wavfile模塊轉(zhuǎn)換為WAV格式進(jìn)行存儲。確保安裝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 file

pyaudio

在本文的前面部分,您學(xué)習(xí)了如何通過閱讀來播放聲音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()

現(xiàn)在您已經(jīng)了解了如何用python-sounddevice和記錄音頻pyaudio,您將學(xué)習(xí)如何將錄音(或任何其他音頻文件)轉(zhuǎn)換為一系列不同的音頻格式。

保存和轉(zhuǎn)換音頻

您之前看到可以使用該scipy.io.wavfile模塊將NumPy陣列存儲為WAV文件。該wavio模塊同樣允許您在WAV文件和NumPy數(shù)組之間進(jìn)行轉(zhuǎn)換。如果您想以不同的文件格式存儲音頻,pydub并且soundfile派上用場,因為它們允許您讀取和寫入一系列流行的文件格式(例如MP3,FLAC,WMA和FLV)。

wavio

此模塊依賴于numpy并允許您將WAV文件讀取為NumPy陣列,并將NumPy陣列保存為WAV文件。

要將NumPy數(shù)組保存為WAV文件,您可以使用wavio.write():

import waviowavio.write("myfile.wav", my_np_array, fs, sampwidth=2)

在此示例中,my_np_array包含音頻的NumPy數(shù)組fs是記錄的采樣率(通常為44100或44800 Hz),并且sampwidth是音頻的采樣寬度(每個采樣的字節(jié)數(shù),通常為1或2個字節(jié))。

soundfile

該soundfile庫可以讀寫所有支持的文件格式libsndfile。雖然它無法播放音頻,但它允許您將音頻轉(zhuǎn)換為FLAC,AIFF和一些不太常見的音頻格式。要將WAV文件轉(zhuǎn)換為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)

類似的代碼將用于轉(zhuǎn)換支持的其他文件格式libsndfile。

pydub

pydub讓您以任何ffmpeg支持的格式保存音頻,其中包括您日常生活中可能遇到的幾乎所有音頻類型。例如,您可以使用以下代碼將WAV文件轉(zhuǎn)換為MP3:

from pydub import AudioSegment sound = AudioSegment.from_wav('myfile.wav')sound.export('myfile.mp3', format='mp3')

使用AudioSegment.from_file()是一種加載音頻文件的更通用的方法。例如,如果要將文件從MP3轉(zhuǎn)換回WAV,可以執(zhí)行以下操作:

from pydub import AudioSegment sound = AudioSegment.from_file('myfile.mp3', format='mp3')sound.export('myfile.wav', format='wav')

此代碼應(yīng)適用于任何格式的音頻文件是ffmpeg支持。

結(jié)論:在Python中播放和錄制聲音
在本教程中,您學(xué)習(xí)了如何使用一些最流行的音頻庫來播放和錄制Python中的音頻。您還了解了如何以多種不同格式保存音頻。

你現(xiàn)在能夠:

播放各種音頻格式,包括WAV,MP3和NumPy陣列
將麥克風(fēng)的音頻錄制到NumPy或Python陣列
將錄制的音頻存儲為各種格式,包括WAV和MP3
將聲音文件轉(zhuǎn)換為一系列不同的音頻格式

總結(jié)

以上是生活随笔為你收集整理的如何利用Python播放和录制声音的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。