Python 播放音訊與錄音,介紹音訊基本處理方式
阿新 • • 發佈:2021-01-19
本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理
本文章來自騰訊雲 作者:Python進階者
想要學習Python?有問題得不到第一時間解決?來看看這裡“1039649593”滿足你的需求,資料都已經上傳至檔案中,可以自行下載!還有海量最新2020python學習資料。
點選檢視
"""PyAudio Example: Play a WAVE file.""" import pyaudio import wave CHUNK = 1024 FILENAME = '你的音訊檔案' def play(filename = FILENAME): wf= wave.open(filename, 'rb') p = pyaudio.PyAudio() stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True) data = wf.readframes(CHUNK) while data != b'': stream.write(data) data = wf.readframes(CHUNK) stream.stop_stream() stream.close() p.terminate()
jupyter notebook
在 jupyer notebook 中播放音訊可以使用以下函式:
import IPython.display as ipd ipd.Audio(檔名)
# read wav file from path from scipy.io import wavfile import librosaimport pyaudio # wave file = wave.open(path,'rb') # wavfile rate, data = wavfile.read(path) # librosa y, sr = librosa.load(path)
下面演示一個使用 wavfile 讀取音訊檔案並且畫出波形的例子:
首先要計算音訊到底持續了多長時間,wave 的 shape 就是總的取樣點個數,除以取樣頻率可以得到持續的總時間(秒),乘1000得到總持續時間(毫秒)。接著通過 np.linsapce 產生時間的序列,最後使用 matplotlib 畫出影象。
from scipy.io import wavfile import matplotlib.pyplot as plt import numpy as np %matplotlib inline # 一秒取樣數 sr, wave = wavfile.read('D://QQPCMgr/Desktop/python3/skip.wav') sample_number = wave.shape[0] total_time = int(sample_number / sr * 1000) time_series = np.linspace(0,total_time,sample_number) fig, ax = plt.subplots(1, 1) ax.plot(time_series, wave) ax.set_title('Time*Amplitude') ax.set_xlabel('Time/ms') ax.set_ylabel('Amplitude/dB')
import wave import pyaudio import matplotlib.pyplot as plt import time CHUNK = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 2 RATE = 44100 RECORD_SECONDS = 5 def record(filename='output.wav'): """官方錄音教程 """ p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) print("* recording") frames = [] for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)): data = stream.read(CHUNK) frames.append(data) print("* done recording") stream.stop_stream() stream.close() p.terminate() wf = wave.open(filename, 'wb') wf.setnchannels(CHANNELS) wf.setsampwidth(p.get_sample_size(FORMAT)) wf.setframerate(RATE) wf.writeframes(b''.join(frames)) wf.close() def multi_record(num=3): """implement 多次錄音""" for i in range(1,num+1): print('第{}次錄音準備'.format(i)) filename = 'record_{}.wav'.format(i) record(filename) time.sleep(second) _ = input('進行下一次錄音?') def main(): multi_record() if __name__ == '__main__':