1. 程式人生 > 實用技巧 >Python 播放音訊與錄音,介紹音訊基本處理方式

Python 播放音訊與錄音,介紹音訊基本處理方式

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理

本文章來自騰訊雲 作者: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 librosa
import 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__':