Estou escrevendo um script que usa sox para me gravar falando. Agora preciso que o sox espere até detectar o som antes de começar a gravar, e eu tenho isso resolvido. Mas também preciso que o sox saia quando houver silêncio por pelo menos 3 segundos. Como é agora, eu tenho que matar manualmente o sox assim que terminar de falar, caso contrário, o sox apenas espera novamente até falar um pouco mais, anexando ao arquivo de saída (não é isso que eu quero). Aqui está o comando para gravação que estou usando agora:
rec /tmp/recording.flac rate 32k silence 1 0.1 3% -1 3.0 3%
Novamente, só para esclarecer, o Sox deve esperar até eu começar a falar e gravar até eu parar de falar, e o programa sox deve sair.
Eu ajustei as idéias acima um pouco mais. Ele grava para sempre, grava todo o ruído até que (aproximadamente) um segundo de silêncio seja encontrado. Então:
(Cria um repetidor de eco UHF / 2 metros muito prático)
fonte
Eu encontrei um tipo de maneira instável que meio que resolve esse problema.
Percebi que quando o silêncio é detectado, o sox naturalmente não acrescenta mais nada ao arquivo até ouvir mais som. Então eu decidi que poderia tentar tirar proveito desse fato.
Primeiro, inicio o gravador de som do sox em segundo plano:
Em seguida, recebo o PID do processo de gravação com:
p=$!
Depois, dou um segundo ao processo de gravação para concluir a inicialização e espero até o arquivo começar a crescer.
Após a quebra desse loop, isso significa que o som foi detectado. Então agora eu crio outro loop para esperar até que os dados parem de ser anexados ao arquivo (isso acontecerá quando o sox detectar o silêncio novamente).
Agora só preciso sair
rec
:E é isso. Aqui está o script completo:
Agora, eu preferiria uma maneira melhor e mais estável de fazer isso, mas isso terá que funcionar por enquanto.
fonte
Isso ouve para sempre, grava apenas os últimos sons até ouvir um segundo de silêncio, depois grava o arquivo, marca o tempo e reinicia:
fonte
while true
loops