получить текущую частоту аудио для каждой 0,1 секунды аудиофайла с помощью ffmpeg sox или opus в file.txt - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь получить статистику звуковой частоты из записи вызова в file.opus за каждую 0,1 секунду, попробуйте ffmpeg (spectrum) ffprobe, например sox '.$file.' −n rate 6k spectrogram −z 62 -w Hamming -o aaaaaa/test10.png stat -freq 2>aaaaaa/test10.txt обратный спектр все они возвращают значения, но никакая частота не обнаружила другую библиотеку? Или что я делаю не так? Я сейчас перезапускаю спектр, но мне нужна конкретная частота человеческого голоса, это возможно с помощью ffmpeg, ffprobe или sox? Я работаю в php, но при запуске команд шел любая помощь будет в восторге. Каким должен быть мой следующий шаг? Я потерян, я понятия не имею, как можно получить частоту из этих чисел или "это возможно" ??? Что такое первый шаг команды в sox и т. Д.

1 Ответ

0 голосов
/ 15 марта 2019

Итак, я думаю, что "не очень" решение для новичка в аудио хорошая статья поможет мне БПФ для новичка , затем изучите документацию для Статистика SOX используйте следующий код для получить

  1. Грубая частота
$z = 0;
$timeFrom = 0;
$freqencies = array();
$fftPoints = 4098/2; 
//sox could give only 2048 freqencies spectrum
$file = 'myMp3Test.mp3';// 10 seconds
$interval = 1/8;//1/8 second 
//best results I got with this interval smaller gives as well zeros
//80 because 10 seconds interval 1/8 = 80 measurments
while($z <= 80){

    $outputexec = '';   

    exec('sox  '.$file.' −n trim '.$timeFrom.' '.$interval.' rate 1024 stat -freq  2>&1', $outputexec);

    $timeFrom = $timeFrom + $interval;

    $resultLength = (count($outputexec)-12) ;
  // - 12 means extra 12 rows in result with stats
    $cycles = $resultLength / $fftPoints ;

  $x = 1;
    while($x<=$cycles){

        $buffer = array();
        $till = $fftPoints*$x;

        $i = $till - $fftPoints;

        while($i < $till){
            $prA = explode("  ",$outputexec[$i]);
            if(isset($prA[1])){ $buffer[] = $prA[1]; }
            $i = $i + 1;
        }   

        $maxValue = max($buffer);

        $j = ($till>$fftPoints)? $till - $fftPoints: 0;

        while($j < $till){
            $prB = explode("  ",$outputexec[$j]);
            if(isset($prB[1])){
                if($prB[1] == $maxValue) { 
                     $freqencies[] = $prB[0];
                    break;
                }
            }           
            $j = $j + 1;
        }

        $x = $x + 1;
    }
    $z = $z+1;
}

//result is in freqencies arrray
  1. Средний объем
exec('ffmpeg -i "'.$file.'" -filter:a volumedetect  -f null /dev/null 2>&1', $outputrmsA );
foreach($outputrmsA as $vysledok){
    if(preg_match("/mean_volume/", $vysledok)){
        $vprenos = explode('mean_volume: ',$vysledok);
        $mean_volume = (trim(str_replace(" ", "",(str_replace(" dB", "",$vprenos[1])))));
    }
}
var_dump($mean_volume);
  1. Spectrum, PNG exec('sox '.$file.' −n rate 4096 spectrogram −z 60 -w Hamming -o aaaaaa/ORG.png');

Я открыт для исправлений или лучших ответов, спасибо за любые советы Я проверил это на своем личном mp3, и это было с допуском 0,005 ОК

...