我是一个蟒蛇新手和音频分析新手。如果这不是这个问题的正确位置,请指出我正确的地方。
我有一个只有沉默的mp3音频文件。
使用sox转换为.wav
sox input.mp3 output.wav
from scipy.io.wavfile import read
import matplotlib.pyplot as plt
(fs,x)=read('/home/vivek/Documents/VivekProjects/Silence/silence.wav')
##plt.rcParams['agg.path.chunksize'] = 5000 # for preventing overflow error.
fs
x.size/float(fs)
plt.plot(x)
生成此图片:
我也使用了这个问题的解决方案:How to plot a wav file
from scipy.io.wavfile import read
import matplotlib.pyplot as plt
# read audio samples
from scipy.io.wavfile import read
import matplotlib.pyplot as plt
# read audio samples
input_data = read("/home/vivek/Documents/VivekProjects/Silence/silence.wav")
audio = input_data[1]
# plot the first 1024 samples
plt.plot(audio)
# label the axes
plt.ylabel("Amplitude")
plt.xlabel("Time")
# set the title
plt.title("Sample Wav")
# display the plot
plt.show()
生成此图片:
问题: 我想知道如何解释图表中的不同颜色条(蓝绿色,黄色)。如果你听这个文件只是沉默,我希望看到一条平坦的线条,如果有的话。
我的mp3文件可以从here下载 可以找到sox转换的wav文件here。
即使文件是静音的,甚至Dropbox也会生成波形。我似乎无法弄清楚原因。
答案 0 :(得分:3)
首先,在绘图之前,请务必检查数据的形状。
x.shape
## (3479040, 2)
所以2这里意味着你的.wav文件中有两个通道,默认情况下matplotlib用不同的颜色绘制它们。在这种情况下,您需要逐行切割矩阵。
import matplotlib.pyplot as plt
ind = int(fs * 0.5) ## plot first 500ms
### plot as time series
plt.plot(x[:ind,:])
plt.figure()
#### Visualise distribution
plt.hist(x[:ind,0],bins = 10)
plt.gca().set_yscale('log')
#####
print x.min(),x.max()
#### -3 3
从图中可以看出,信号的绝对值非常低(-3,3)。根据.wav文件的编码(整数或浮点数),它将被转换为幅度(但可能是非常低的幅度,这就是为什么它是静音的)。
我自己不熟悉精确编码。但是此页面可能有所帮助:http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html
- 对于PCM以外的所有格式,格式块必须具有扩展部分。扩展名可以是零长度,但大小 字段(值为0)必须存在。
- 对于浮点数据,满量程为1.位/样本通常为32或64。
- 对于log-PCM格式(μ-law和A-law),Rev。3文档指出了比特/样本字段(wBitsPerSample) 应设置为8位。
- 非PCM格式必须有一个事实块。
醇>
PS:如果你想开始一些更高级的音频分析,请检查我发现超实用的workshop,尤其是能量部分和FFT部分。
答案 1 :(得分:1)
我怀疑你的silence.mp3
文件的音频非常低(低于人类听觉),因为即使我以最大的扬声器播放声音也听不到它。
所以,我遇到了来自here
的mp3
的音频
首先我们将mp3
音频转换为wav
。由于父文件是stero,转换后的wav
文件也是立体声。为了证明有音频,我们只需要单通道。
一旦我们有单一频道wav
音频,我们就可以使用frequency
功率级别的颜色条,将time
与dB
索引进行对比。
import scipy.io.wavfile
from pydub import AudioSegment
import matplotlib.pyplot as plt
import numpy as np
from numpy import fft as fft
#read mp3 file
mp3 = AudioSegment.from_mp3("silence.mp3")
#convert to wav
mp3.export("silence.wav", format="wav")
#read wav file
rate,audData=scipy.io.wavfile.read("silence.wav")
#if stereo grab both channels
channel1=audData[:,0] #left
#channel2=audData[:,1] #right channel, we dont need here
#create a time variable in seconds
time = np.arange(0, float(audData.shape[0]), 1) / rate
#Plot spectrogram of frequency vs time
plt.figure(1, figsize=(8,6))
plt.subplot(211)
Pxx, freqs, bins, im = plt.specgram(channel1, Fs=rate, NFFT=1024, cmap=plt.get_cmap('autumn_r'))
cbar=plt.colorbar(im)
plt.xlabel('Time (s)')
plt.ylabel('Frequency (Hz)')
cbar.set_label('Intensity dB')
plt.show()