เมื่อใช้say
คำสั่งฉันสามารถให้ตัวเลือก-o (file name)
เพื่อบันทึกลงไฟล์ อย่างไรก็ตามนั่นจะระงับสัญญาณเสียง
มีวิธีทำให้ทั้งสองอย่างในคำสั่งเดียวหรือไม่?
เมื่อใช้say
คำสั่งฉันสามารถให้ตัวเลือก-o (file name)
เพื่อบันทึกลงไฟล์ อย่างไรก็ตามนั่นจะระงับสัญญาณเสียง
มีวิธีทำให้ทั้งสองอย่างในคำสั่งเดียวหรือไม่?
คำตอบ:
มันดูเหมือนยากหรือเป็นไปไม่ได้ด้วยsay
คำสั่งในตัว
คุณอาจสามารถเปลี่ยนเส้นทางเสียงจากsay
การเป็นAUNetSendที่จะเขียนไปยังดิสก์และเล่นเสียง ดู Audio Hijack ด้านล่าง
คุณสามารถใช้โอเพ่นซอร์สespeak
และffplay
เครื่องมือต่าง ๆ เพื่อให้บรรลุเป้าหมายนี้ คำสั่งต่อไปนี้บอกว่า "Hello world" และสร้าง.wav
ไฟล์ของการบันทึก:
espeak --stdout "hello world" | tee -a hello.wav | ffplay -i -
คำสั่งรวมเครื่องมือสามอย่าง:
espeak
แปลงข้อความเป็นเสียงtee
ถูกใช้เพื่อโอนสายสำเนาของstdout
ไฟล์ffplay
เล่นเสียงespeak
สามารถอ่านจากไฟล์หรือเว็บเพจโดยใช้f
แฟล็ก:
espeak --stdout -f myfile.txt | tee -a myfile.wav | ffplay -i -
เครื่องมืออื่นเช่นffmpeg
หรือ iTunes สามารถใช้เพื่อแปลงwav
ไฟล์เป็นไฟล์ MP3 หรือ AAC
การติดตั้งและ eSpeak ffplay ใช้HomebrewหรือMacPorts ด้วยการตั้งค่า HomeBrew คำสั่ง install คือ:
brew install espeak ffmpeg
อีกทางเลือกหนึ่งที่ดีคือการใช้เครื่องมือของบุคคลที่สามเช่นAudio Hijack :
บันทึกเสียงใด ๆ ด้วย Audio Hijack! บันทึกเสียงจากแอปพลิเคชันเช่น iTunes, Skype หรือ Safari หรือจากอุปกรณ์ฮาร์ดแวร์เช่นไมโครโฟนและเครื่องผสม
ภาพหน้าจอนี้แสดงให้เห็นถึง Audio Hijack ที่ถ่ายจาก Skype บันทึกลงดิสก์และเล่นผ่านลำโพง
AUNetSend
โมดูลน่าจะเป็นตัวเลือกที่ดีที่สุดของคุณ โชคดี.
ในหนึ่งคำสั่งด้วยคำสั่งในตัวsay
ไม่มี; ในสองคำสั่งในตัว ( say
และafplay
) ใช่:
$ say -o /tmp/output-file.aiff Hello
$ afplay /tmp/output-file.aiff
ในตัวอย่างของฉันนี่ทำให้เกิดความล่าช้าเล็กน้อย
$ 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