Quando si utilizza il comando say
, posso assegnargli un'opzione -o (file name)
affinché registri su un file. Tuttavia, ciò sopprime l'uscita audio.
C'è un modo per farlo eseguire entrambi in un unico comando?
Sembra difficile o impossibile con il comando built-in say
.
Potresti essere in grado di reindirizzare l'audio da say
ad un ascolto AUNetSend che a sua volta scrive su disco e suona l'audio; vedi Audio Hijack di seguito.
Puoi utilizzare l'open source espeak
e ffplay
strumenti per raggiungere questo obiettivo. Il seguente comando dice "Hello world" e crea un file .wav
della registrazione:
espeak --stdout "hello world" | tee -a hello.wav | ffplay -i -
Il comando combina tre strumenti:
espeak
converte il testo in audio. tee
è usato per deviare una copia di stdout
in un file. ffplay
riproduce l'audio. espeak
può leggere da un file o da una pagina Web utilizzando il flag f
:
espeak --stdout -f myfile.txt | tee -a myfile.wav | ffplay -i -
È possibile utilizzare un altro strumento come ffmpeg
o iTunes per convertire il file wav
in un file MP3 o AAC.
Per installare espeak e ffplay, usa HomeBrew o MacPorts . Con HomeBrew impostato, il comando install è:
brew install espeak ffmpeg
In alternativa, una buona opzione è utilizzare uno strumento di terze parti come Hijack audio :
Record any audio, with Audio Hijack! Save audio from applications like iTunes, Skype or Safari, or from hardware devices like microphones and mixers.
Questa schermata mostra Audio Hijack in uscita da Skype, registrazione su disco e riproduzione attraverso l'altoparlante.
In un comando con il comando say
incorporato, no; in due comandi incorporati ( say
e afplay
), sì:
$ say -o /tmp/output-file.aiff Hello
$ afplay /tmp/output-file.aiff
Nel mio esempio, questo introduce un ritardo molto piccolo:
$ time sh -c "say Hello"
real 0m0.778s
user 0m0.008s
sys 0m0.012s
$ time sh -c "say -o /tmp/output-file.aiff Hello && afplay /tmp/output-file.aiff"
real 0m1.048s
user 0m0.050s
sys 0m0.048s
Leggi altre domande sui tag command-line