Php 确定说话声音的基本频率

Php 确定说话声音的基本频率,php,audio,frequency-analysis,aubio,Php,Audio,Frequency Analysis,Aubio,我试图确定音频样本的感知音调(仅声音,无背景或音乐),然后将声音识别为低音、男高音、中音、女中音、女中音 为此,我使用aubio,它返回任何给定音频文件的时间码列表和相应频率 我很难找到最好的方法来使用数据来确定音高。我最初的想法要么不好,要么执行得不好: 我取aubio返回的频率列表,然后计算中位数,如下所示: exec('aubiopitch/pathtomp3file/audio.mp3',$output); //迭代aubio返回的时间/频率 //$output是一个数字对列表(每行一对

我试图确定音频样本的感知音调(仅声音,无背景或音乐),然后将声音识别为低音、男高音、中音、女中音、女中音

为此,我使用aubio,它返回任何给定音频文件的时间码列表和相应频率

我很难找到最好的方法来使用数据来确定音高。我最初的想法要么不好,要么执行得不好:

  • 我取aubio返回的频率列表,然后计算中位数,如下所示:
  • exec('aubiopitch/pathtomp3file/audio.mp3',$output);
    //迭代aubio返回的时间/频率
    //$output是一个数字对列表(每行一对):
    //时间码后跟空格,后跟频率
    //当时的代码是赫兹。
    foreach($sample输出){
    //提取频率信息
    $freq_sample=substr($sample,strpos($sample,”);
    //向阵列添加频率
    $freqs[]=地板($freq_样本);
    }       
    //要计算中值频率,请使用频率对数组排序
    //在中间取元素
    排序($freqs);
    $median=$freqs[楼层(计数($freqs)/2)];
    
  • 然后,我将找到的中值频率映射到“低音”、“男中音”、“男高音”、“中音”等
  • 不幸的是,结果并不一致。例如,很多时候,一个非常深沉的声音的中位数频率太高了

    我相信我试图确定基频的方法有缺陷,但我很难找到更好的方法

    例如,出现了以下问题:

  • 我是否应该放弃上面的任何频率,例如400hz,因为它们可能来自“s”等声音

  • 当人类感知到声音的音调时,我们实际上在听什么?基频?某些频率的能量

  • 概括起来,总的问题是:

    “使用aubio的数据,计算语音记录(说话,而不是唱歌)的感知音调的正确编程方法是什么?”

    编辑–我如何使用AUBIO

    exec('aubiopitch/pathtomp3file/audio.mp3',$output);
    
    $output
    中有什么?如果你没有得到数据,那么就不可能检测到。这就像说,从白光中挑出绿色,当你仅有的数据是流明输出时,它是一个行列表,每个行都有两个数字:时间码后跟一个空格,然后是该时间码的频率(赫兹)。你如何使用
    aubio
    ?你能在你确定音高的地方添加代码吗?我使用aubio和任何特殊参数,只是默认设置。然后我提取数据。请参阅问题中我的编辑。