我正在玩使用Google语音文本API的脚本。该api需要flac编码的文件,因此脚本的记录部分如下所示:
arecord -q -t wav -d 0 -f S16_LE -r 16000 | flac - -f --best --sample-rate 16000 -s -o "$TEMP_FILE"
Run Code Online (Sandbox Code Playgroud)
该命令将一直记录,直到用户使用ctrl-c退出,并且应将wav记录的格式以flac格式通过管道传送到flac程序以输出,然后该脚本应继续。
我遇到的问题是,按ctrl-c会完全结束脚本,并切断某些音频(flac文件仍会输出)。如果我在不使用管道的情况下运行脚本:
arecord -q -t wav -d 0 -f S16_LE -r 16000 some.wav
Run Code Online (Sandbox Code Playgroud)
然后按ctrl-c只会结束录制,并继续执行脚本。
如何解决此问题,以便ctrl-c仅停止arecord命令并允许脚本的其余部分(包括管道flac编码)完成?
我认为你想做的事情无法完成。
免责声明:以下内容基于我自己在 Ubuntu 12.04 上的实验,仅进行了一些研究。如果我错了请告诉我。
症结所在:
SIGINT向管道中的所有进程发送信号。trap- 但这样的 shell 陷阱只有在管道进程收到信号并具有通常被它终止)。在您的具体情况下,arecord旨在以有序的方式捕获和退出作为响应。
相比之下,似乎没有——它被强制终止。
然而,即使也确实陷阱彻底关闭,考虑到所涉及的进程接收信号的顺序不确定,您也无法安全地使用管道,同时期望整个处理以有序的方式完成。 SIGINTflacflacSIGINTCtrl-C
(顺便说一句:用终止时arecord会报告退出代码,这让我想知道如何将其与真正的故障区分开来,例如磁盘空间不足。)1Ctrl-C
因此:
arecord作为单独的命令调用并捕获(临时)文件中的输出。flac(并在完成后删除临时文件)。| 归档时间: |
|
| 查看次数: |
4744 次 |
| 最近记录: |