簡體   English   中英

如何獲取在Python 3.x中記錄的音頻的頻率和幅度?

[英]How do I get the frequency and amplitude of audio that's being recorded in Python 3.x?

我正在嘗試記錄音頻,並在1秒鍾的時間間隔內獲得音頻的平均頻率和幅度,而無需寫入文件。 有許多示例說明了如何使用pyaudio讀取文件,但是對於這種特定情況,可以使用的任何東西都使用了Python 2.7庫,而Python 3.x似乎不存在這種庫。

任何幫助,將不勝感激!

獲取音頻

我不確定您使用的是哪個庫來記錄音頻,但實時記錄/回放的常規方法(在我看來)是PyAudio (您只是提到要從文件中讀取它)。

他們有一個用於實時處理的阻塞非阻塞音頻I / O的示例。 例如,使用阻塞模式示例,您可以在每次收到新的音頻塊時執行DSP處理。

"""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)
    # Do all of your DSP processing here i.e. function call or whatever

# stop stream (4)
stream.stop_stream()
stream.close()

# close PyAudio (5)
p.terminate()

求振幅

如果您想要信號在任何給定點的幅度,那么您要做的就是獲取樣本數組中一個樣本的絕對值,即從音頻塊數據中獲取第三個樣本的幅度。

ampSample3 = abs(data[2])

顯然,這對於單個樣本幅度通常沒有什么用,但是最好查看整個塊。 因此,您可以計算每個值的絕對值,將所有數組求和,然后除以塊大小(平均值)。

blockAmplitudeMean = sum(numpy.absolute(x))/len(x)

但是,在使用音頻時,我們通常需要塊的RMS值。

blockLinearRms= numpy.sqrt(numpy.mean(data**2)) # Linear value between 0 -> 1
blockLogRms = 20 * math.log10(blockLinearRms) # Decibel (dB value) between 0 dB -> -inf dB

獲得頻率

在您的問題中,您僅指定了獲取音頻的頻率 ,這可能意味着兩件事之一。

確定頻譜

通常用於DSP中的頻譜可以使用DFT (離散傅里葉變換)進行分析。 通常,您會以FFT (快速傅立葉變換)的名稱看到它,因為這是DFT最流行的實現。 已經有Python庫為您實現FFT,並且易於使用。

請注意,這將為您提供一個包含塊信息長度的數組,其中包含復雜信息(實際信號+相位信息),即頻率信息。 這並不意味着您可以確定輸入音頻的音調(您不能直接說出某人正在鋼琴上彈A1音符,除非信號的質量很高並且您仍然具有一些基本的DSP處理能力以及FFT)。

以供參考:

如果您想對頻率信息進行某些操作,則可以在處理循環中調用此函數。

確定音高(/音符)

這是許多人試圖完成的一項重要任務。 大多數算法通常都涉及FFT(如前所述),但頂層還有另一層復雜的處理。 我建議使用一個庫,除非您想開發自己的算法:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM