Завершіть запис на соксі, коли виявиться тиша


16

Я пишу сценарій, який використовує сокс для запису моєї розмови. Тепер мені потрібно сокс чекати, поки він не почує звук, перш ніж він почне записувати, і я це зрозумів. Але мені також потрібен сокс для виходу, коли тиша принаймні 3 секунди. Як зараз, мені доведеться вручну вбити сокс, як тільки я закінчу розмову, інакше сокс просто знову чекає, поки я ще трохи поговору, додаючи до вихідного файлу (Це не те, що я хочу). Ось команда для запису, яку я зараз використовую:

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

Знову ж таки, щоб було зрозуміло, Сокс повинен почекати, поки я почну розмову, а потім записувати, поки я не перестану говорити, тоді програма Sox повинна вийти.

Відповіді:


13

Видаліть негативний знак із початкової команди:

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

Коли значення "нижче підрахунку" від'ємне, команда мовчання обріже всі тиші з середини файлу. Коли він позитивний, він обрізає тишу з кінця файлу.


1
Це набагато простіше рішення, ніж те, що я придумав, LOL!
Ісаак

3

Я переробив вищезазначені ідеї ще трохи. Він записує назавжди, записує весь шум до тих пір, поки (приблизно) не наступить секунда тиші. Потім:

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

(Створює дуже маленький ехолот UHF / 2 метри)

#! / бін / баш
поки правда; робити
  rec buffer.ogg тиша 1 0,1 5% 1 1,0 5%
  DATE = `дата +% 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 у фоновому режимі:

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

Далі я отримую PID процесу запису за допомогою: p=$!

Потім я даю процесу запису на секунду, щоб закінчити запуск, а потім чекаю, поки файл почне рости.

сон 1
до ["$ var1"! = "$ var2"]; робити
    var1 = `du" /tmp/recording.flac "`
    сон 1
    var2 = `du" /tmp/recording.flac "`
зроблено

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

відлуння "Виявлено звук"
до ["$ var1" == "$ var2"]; робити
    var1 = `du" /tmp/recording.flac "`
    сон 0,5
    var2 = `du" /tmp/recording.flac "`
зроблено

Тепер мені просто потрібно кинути rec:

відлуння "Виявлена ​​тиша"
вбити $ p

І це все. Ось виконаний сценарій:

rec /tmp/recording.flac швидкість 32k тиша 1 0,1 3% -1 3,0 3% &
p = $!
сон 1
до ["$ var1"! = "$ var2"]; робити
    var1 = `du" /tmp/recording.flac "`
    сон 1
    var2 = `du" /tmp/recording.flac "`
зроблено
відлуння "Виявлено звук"
до ["$ 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петлі
Майкл Мрозек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.