Como calcular a duração da saída?

3

Meu objetivo é calcular quanto tempo leva para enviar o texto para o áudio ao usar o comando say .

Por exemplo, say falará em tempo real:

$ say -v Alex "Hello there"

Posso combinar say com time para responder a pergunta no texto, embora tenhamos que esperar até o final da saída de áudio real:

$ time say -v Alex "Hello there. How long will this take?"

real    0m2.993s
user    0m0.006s
sys     0m0.009s
  1. Existe uma maneira de calcular quanto tempo levará para a saída de qualquer comando say sem realmente executá-lo? Como?
  2. Se não, como posso usar grep para extrair a linha real?

Estou tentando algo assim:

time say -v Alex "Hello there. How long will this take?" | grep "^real   .*$"

Mas é claro que não há resultado.

A saída não está sendo passada para grep , grep não funciona para essa saída de várias linhas ou usei a correspondência de padrões errada?

Se grep não funcionar, o que acontecerá?

UPDATE # 1

Na verdade, o que realmente acho que estou procurando é a duração do arquivo de áudio gerado que resulta de say .

    
por kraftydevil 19.07.2018 / 04:35

1 resposta

3

Tempo de execução de say

  1. Is there a way to calculate how long it will take to output any say command without actually executing it? How?

Não vejo como fazer isso usando os switches fornecidos pelo comando say .

  1. If not, how can I use grep to pull out the real line?

Para analisar a saída time , você pode fazer o seguinte:

$ ( time say -v Alex "Hello there. How long will this take?" ) |& grep real
real    0m2.987s

Alternativamente:

$ ( time say -v Alex "Hello there. How long will this take?" ) 2>&1 | grep real
real    0m2.987s

Acima, agrupamos o comando time ... em um subshell e, em seguida, redirecionamos o STDOUT & STDERROR ( |& ) para grep . O formulário 2>&1 faz o mesmo em situações em que |& não funciona para sua versão específica do Bash.

/ dev / null

Por acaso, se você usar o argumento -o <file> para say , poderá acelerar a conversão de texto para áudio. Aqui, como na verdade não queremos o arquivo de áudio, estamos direcionando para /dev/null :

$ ( time say -v Alex "Hello there. How long will this take?" -o /dev/null ) |& grep real
real    0m0.310s

Alternativamente:

$ ( time say -v Alex "Hello there. How long will this take?" -o /dev/null ) 2>&1 | grep real
real    0m0.283s

Observe o quanto é mais rápido quando não precisar utilizar os alto-falantes para fazer essa operação, esse é o atraso no uso da E / S de áudio. Ao direcionar para um arquivo, é muito mais eficiente.

Calculando a duração do áudio

Para determinar a duração do arquivo de áudio resultante de say , você pode fazer o seguinte:

$ say -v Alex "Hello there. How long will this take?" -o a.aiff && \
    ffmpeg -i a.aiff 2>&1 | grep Duration && rm a.aiff
  Duration: 00:00:02.85, start: 0.000000, bitrate: 364 kb/s

Aqui podemos ver que a duração do áudio resultante é de 2,85 segundos.

Melhorias adicionais?

Analisei a saída de say diretamente para ffmpeg , mas say aparentemente não pode fazer isso. Outros chegaram à mesma conclusão, conforme a Pergunta Q & A intitulada: Como canalizar a saída de 'say' para outro comando .

Referências

por 19.07.2018 / 06:27