Получить среднюю амплитуду (только) .wav от sox

C:\Program Files\sox-14-4-0>sox Sample.wav -n stat

Приведенный выше код дает результат ниже

Samples read:             26640
Length (seconds):      3.330000
Scaled by:         2147483647.0
Maximum amplitude:     0.515625
Minimum amplitude:    -0.734375
Midline amplitude:    -0.109375
Mean    norm:          0.058691
Mean    amplitude:     0.000122
RMS     amplitude:     0.101146
Maximum delta:         0.550781
Minimum delta:         0.000000
Mean    delta:         0.021387
RMS     delta:         0.041831
Rough   frequency:          526
Volume adjustment:        1.362

Теперь мне нужна только средняя амплитуда. Как это сделать?


person Nagaraj Alagusundaram    schedule 12.09.2012    source источник


Ответы (1)


Есть несколько способов.

Способ 1:

"C:\Program Files\sox-14-4-0\sox" Sample.wav -n stat | find "Mean    amplitude: " > %TMP%\amp.tmp
set /p meanAMP=<%TMP%\amp.tmp
set meanAMP=%meanAMP:*:     =%
del %TMP%\amp.tmp
echo %meanAMP%

Способ 2:

for /f "tokens=1-3" %%x in ('"%ProgramFiles%\sox-14-4-0\sox" Sample.wav -n stat') do (
  if "%%x %%y"=="Mean amplitude:" set meanAMP=%%z
)
echo %meanAMP%

Самый быстрый:

Способ 3:

for /f "skip=7 tokens=1-3" %%x in ('"%ProgramFiles%\sox-14-4-0\sox" Sample.wav -n stat') do (
  if "%%x %%y"=="Mean amplitude:" set meanAMP=%%z
)
echo %meanAMP%

Способ 4:

for /f "tokens=1-3" %%x in ('"%ProgramFiles%\sox-14-4-0\sox" Sample.wav -n stat ^| find "Mean    amplitude:"') do (
  set meanAMP=%%z
)
echo %meanAMP%

Я подозреваю, что метод 3 будет самым быстрым, потому что:

Метод 1 использует множество шагов, включая внешнюю программу find, создание, доступ и удаление временного файла и переопределение переменной.

Метод 2 проверяет все выходные данные SOX.

Метод 4 использует внешнюю программу find, которая замедляет выполнение.

Метод 3 фактически пропускает первые 7 строк вывода из SOX, а ЗАТЕМ начинает оценивать вывод.

ПРИМЕЧАНИЕ. Все методы 2–4 можно выполнить в одной строке, просто удалите ( и ).

EDIT: Исправлены некоторые ошибки в коде.

ПРИМЕЧАНИЕ. Для использования из командной строки метод 1 должен работать как есть. Методы 2-4 требуют замены всех %% на %.

Например, вы можете вставить это прямо в cmd:

for /f "skip=7 tokens=1-3" %%x in ('"%ProgramFiles%\sox-14-4-0\sox" Sample.wav -n stat') do (
  if "%x %y"=="Mean amplitude:" set meanAMP=%z
)
echo %meanAMP%

Обратите внимание, что это почти точная копия метода 3, за исключением того, что я изменил %%x, %%y и %%z на %x, %y и %z соответственно.

person James K    schedule 15.09.2012
comment
спасибо за ваши ценные ответы. Но я не знаю, куда вставить эти коды. Когда я пробовал в cmd, я получаю 'C:\Program' не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл. Или я получаю %%x был неожиданным в этом время. - person Nagaraj Alagusundaram; 15.09.2012
comment
@Gaan_setaglA - я исправил код для удаления ошибок is not recognized. Метод 1 должен работать как в пакетном файле, так и в командной строке. Method2 2-4 должен быть либо в пакетном файле, либо заменить все %% на %. - person James K; 15.09.2012