python - 声波的最小表示?

标签 python audio scipy signal-processing wav

我想从一个音轨中提取一个一维的单一 vector ,该 vector 仅表示给定时间的“音量”或“强度”(对此术语我不确定)。

以一个可用的示例为例:
wget https://freewavesamples.com/files/Ensoniq-ESQ-1-Sympy-C4.wav
并将其转换为mono:
ffmpeg -i Ensoniq-ESQ-1-Sympy-C4.wav -acodec pcm_s16le -ac 1 -ar 44100 audio_test.wav
我以这种方式从related Q&A thread收集了声音,以使其可视化:

from scipy.io.wavfile import read
import matplotlib.pyplot as plt

input_data = read("audio_test.wav")
audio = input_data[1]

plt.plot(audio)
plt.ylabel("Amplitude")
plt.xlabel("Time")  
plt.title("Sample Wav")
plt.show()

simple wave plot

“正”和“负”侧是相当对称的,但不是完全对称的。有没有办法将它们合并为一条“正”行?如果是,如何从audio变量中提取此类数据点?

非常感谢您的帮助 !

最佳答案

遵循@anerisgreat和一位同事的建议,我达到了此解决方案(在更大的音频样本中更有意义):

wget https://file-examples.com/wp-content/uploads/2017/11/file_example_WAV_10MG.wav
ffmpeg -i file_example_WAV_10MG.wav -acodec pcm_s16le -ac 1 -ar 44100 audio_test.wav

from scipy.io.wavfile import read
import matplotlib.pyplot as plt

def positive_enveloppe(wav_dat):
    freq = wav_dat[0]
    pts = np.absolute(wav_dat[1])
    pos_env = np.zeros(len(pts) // freq + int(bool(len(pts) % freq)))

    env_idx, pts_idx = 0, 0
    while pts_idx < len(pts):
        sub_ar = pts[pts_idx:pts_idx+freq]
        mov_avg = np.mean(sub_ar)
        pos_env[env_idx] = mov_avg
        pts_idx += freq
        env_idx += 1

    return pos_env

input_data = read("audio_test.wav")
enveloppe_data = positive_enveloppe(input_data)
plt.plot(enveloppe_data)
plt.show()

屈服:

positive enveloppe

关于python - 声波的最小表示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58727410/

相关文章:

python - cron 没有运行 django 命令

python - 使用python自动发布到facebook页面

python - 查找单词中字符替换的每个排列

python - scipy.interpolate.splev() 错误,不明白来源

来自 t 统计的 Python p 值

python - 欧几里德距离(python3,sklearn): efficiently compute closest pairs and their corresponding distances

python - Pandas ExcelWriter .save() 出错;权限错误 [WinError 32]

facebook - 如何在Bot中访问Facebook语音消息?

audio - Unity 3D声音太低

ios - 延时播放音频文件