Завершить запись sox после обнаружения тишины

16

Я пишу сценарий, который использует sox для записи моего разговора. Теперь мне нужно, чтобы sox подождал, пока он не обнаружит звук, прежде чем начать запись, и я понял это. Но я также должен Сокс выхода , как только там была тишина в течение по крайней мере 3 секунды. Как и сейчас, я должен вручную убить sox, как только я закончу говорить, иначе sox просто ждет снова, пока я не говорю еще, добавляя к выходному файлу (это не то, что я хочу). Вот команда для записи, которую я использую сейчас:

rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3%

Опять же, просто для ясности, Сокс должен подождать, пока я начну говорить, а затем записать, пока я не перестану говорить, тогда программа Сокс должна завершиться.

Исаак
источник

Ответы:

13

Удалите отрицательный знак из вашей исходной команды:

rec /tmp/recording.flac rate 32k silence 1 0.1 3% 1 3.0 3%

Когда «количество ниже» отрицательно, команда молчания обрежет все молчания с середины файла. Когда оно положительное, оно завершает тишину с конца файла.

meetar
источник
1
Это гораздо более простое решение, чем то, которое я придумал, LOL!
Исаак
3

Я подправил вышеупомянутые идеи еще немного. Он записывает вечно, записывает весь шум до (примерно) секунды тишины. Потом:

  • Обеспечивает создание двух подкаталогов
  • Вычисляет два спектрографа записи - один до нормализации, а другой после и записывает в папки с метками даты.
  • Записывает нормализованный файл в папку с датой.
  • Воспроизведение нормализованного файла обратно с двумя звуковыми файлами .ogg (обратно через голосовое радио CB)

(Делает для очень удобного небольшого UHF / 2-метрового эхолота)

#! / Bin / Баш
пока правда; делать
  rec buffer.ogg Безмолвие 1 0,1 5% 1 1,0 5%
  ДАТА = `дата +% Y% m% d% H% M% S`
  DPATH = `дата +% Y /% m /% d /`
  mkdir -p ./spectro/$DPATH
  mkdir -p ./voice/$DPATH
  echo Переименование файла буфера в $ DATE
  sox buffer.ogg -n спектрограмма -x 300 -y 200 -z 100 -t $ DATE.ogg -o ./spectro/$DPATH/$DATE.png
  sox buffer.ogg normbuffer.ogg усиление -n -2
  sox normbuffer.ogg -n спектрограмма -x 300 -y 200 -z 100 -t $ DATE.norm.ogg -o ./spectro/$DPATH/$DATE.norm.png
  mv normbuffer.ogg ./voice/$DPATH/$DATE.ogg
  играть pre.ogg ./voice/$DPATH/$DATE.ogg post.ogg 
сделано
Найджел Уикс
источник
2

Я нашел какой-то шаткий способ, который решает эту проблему.

Я заметил, что при обнаружении молчания sox, естественно, больше ничего не добавляет в файл, пока не услышит больше звука. Поэтому я решил, что могу попытаться воспользоваться этим фактом.

Прежде всего, я запускаю диктофон sox в фоновом режиме:

rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3% &

Затем я получаю PID процесса записи с помощью: p=$!

Затем я даю процессу записи секунду, чтобы закончить запуск, а затем жду, пока файл начнет расти.

спать 1
till ["$ var1"! = "$ var2"]; делать
    var1 = `du" /tmp/recording.flac "`
    спать 1
    var2 = `du" /tmp/recording.flac "`
сделано

После обрыва этого цикла звук будет обнаружен. Так что теперь я создаю еще один цикл, чтобы ждать, пока данные не перестанут добавляться в файл (это произойдет, когда sox снова обнаружит тишину)

эхо "Обнаружен звук"
before ["$ var1" == "$ var2"]; делать
    var1 = `du" /tmp/recording.flac "`
    спать 0,5
    var2 = `du" /tmp/recording.flac "`
сделано

Теперь мне просто нужно выйти rec:

эхо "Обнаружена тишина"
убить $ p

Вот и все. Вот законченный скрипт:

rec /tmp/recording.flac rate 32k Silence 1 0.1 3% -1 3.0 3% &
р = $!
спать 1
till ["$ var1"! = "$ var2"]; делать
    var1 = `du" /tmp/recording.flac "`
    спать 1
    var2 = `du" /tmp/recording.flac "`
сделано
эхо "Обнаружен звук"
before ["$ var1" == "$ var2"]; делать
    var1 = `du" /tmp/recording.flac "`
    спать 0,5
    var2 = `du" /tmp/recording.flac "`
сделано
эхо "Обнаружена тишина"
убить $ p

Теперь я бы предпочел лучший, более стабильный способ сделать это, но сейчас это сработает.

Исаак
источник
1

Он слушает вечно, записывает только последние звуки, пока не услышит одну секунду тишины, затем записывает файл, ставит метки времени и перезапускает:

#!/bin/bash
/usr/bin/sox -t alsa default /home/default/working/recording.wav silence 1 0.1 5% 1 1.0 5%
DATE=$(date +%Y%m%d%H%M%S)
mv /home/default/working/recording.wav /home/default/waiting/$DATE.recording.wav
/home/default/startrecord.sh
Джаред Террелл
источник
2
У Баша есть while trueпетли
Михаил Мрозек