python - 使用 Python 实时分析音频电平

标签 python audio raspberry-pi3 pyaudio pulseaudio

我试图让我的覆盆子根据播放歌曲的音频级别(声音输出)做一些事情。这首歌不一定是 Raspberry 上的本地 mp3 文件。让我这样解释:

如果(音频电平高于阈值):
做点什么..

我找到了 http://freshfoo.com/posts/pulseaudio_monitoring/我猜这几乎就是我要寻找的东西,但我必须能够读取单个样本,以便将其与将使用的阈值进行比较。 Analyze audio using Fast Fourier Transform如果有关于创建者如何获得这些数字的代码/解释,这也是一个可以提供帮助的主题。
我希望你能帮我解决这个问题,更多信息请询问:)

最佳答案

看看raspberry-vu project ,它与用 C 编写的 cpu 密集部分类似的功能。这在 RPi 上相当重要。

你可以修改src/impulse.csrc/test-impulse.c如果您还链接到 gsl,则可以做您想做的事和 cblas (gsl 的部门)并包括 <gsl/gsl_statistics_double.h> .您会注意到您从 im_getSnapshot() 返回了一个数组 [256]其中包含 FFT 幅度。将该数组传递给您想要的函数。对我来说是sd = gsl_stats_sd(array, 1, 256) ,它会将标准差作为简单的 double 值传回。对你来说,你会想要使用 mean = gsl_stats_mean(array, 1, 256)这将为您提供所有光谱分布的平均值。然后你可以根据 mean 的值做一些事情.

我正在做一个类似的项目来暂停/取消暂停基于白噪声检测的 RTP 源(白噪声的 SD 非常低)。如果 SD 非常低,RTP 接收器被挂起。否则它被启用。这意味着只有在发现非白噪声时才会发生大量 RTP 数据包。

这可能是您对音频电平信号使用react的最简单方法。我在这里制作了一个片段,代表我正在监视的音频的标准差和平均值。

#include <unistd.h>
#include "impulse.h"
#include <stdio.h>
#include <gsl/gsl_statistics_double.h>

int main( ) {
        int i;
        double stddev, stddev_max=0, mean;

        im_start( );

        while ( 1 ) {
                usleep( 1000000 / 10 );
                double *array = im_getSnapshot( IM_FFT );
                for ( i = 0; i < 256; i+=16 )
                {
                        printf( " %.3f,", array[ i ] );
                }

                stddev = gsl_stats_sd(array, 1, 256);
                mean = gsl_stats_mean(array, 1, 256);
                if (stddev > stddev_max)
                    stddev_max = stddev;

                printf("  = [%.05f, %.05f] %.05f\n", stddev, stddev_max, mean);
                fflush( stdout );

                // if (mean > some_value) { do_something(); }
                // else { do_something_else(); }
        }

        im_stop( );

        return 0;
}

关于python - 使用 Python 实时分析音频电平,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41057570/

相关文章:

javascript - 使用授权 header 时出现 CORS header 错误

python - 如何在 python 中取消转义 unicode 转义字符串?

iphone - 是否可以在不停止 iPod 音乐的情况下播放声音?

c++ - Raspberry Pi 使用 SQLite3 和 SDL2 编译多个 C++ 文件

c - 如何修复 freetype 错误加载字符

python - 在 matplotlib 图中渲染 Pandas 'to_latex' 方法的输出

python - 如果我没有在 requests.get() 中指定用户代理会发生什么?

c# - 在Windows Phone上同时播放声音

flash - 在Flash播放器中再现(几种)同时声音的最佳方法

image - 通过socket.recv()在python中通过tcp/ip接收损坏的图像