gpt4 book ai didi

bash - 在不停止脚本其余部分的情况下停止记录

转载 作者:行者123 更新时间:2023-11-29 09:05:55 24 4
gpt4 key购买 nike

我正在玩使用谷歌语音到文本 API 的脚本。该 api 需要 flac 编码文件,因此脚本的录制部分如下所示:

arecord -q -t wav -d 0 -f S16_LE -r 16000 | flac - -f --best --sample-rate 16000 -s -o "$TEMP_FILE"

此命令将一直记录,直到用户使用 ctrl-c 退出并且 wav 记录格式应通过管道传输到 flac 程序以以 flac 格式输出,然后脚本应继续。

我遇到的问题是按下 ctrl-c 会完全结束脚本并切断一些音频(flac 文件仍会输出)。如果我在没有管道的情况下运行脚本:

arecord -q -t wav -d 0 -f S16_LE -r 16000 some.wav

然后按 ctrl-c 只会结束录制并继续执行脚本。

我该如何解决这个问题,以便 ctrl-c 仅停止 arecord 命令并允许脚本的其余部分(包括管道 flac 编码)完成?

最佳答案

我认为你想做的事无法完成

免责声明:以下内容基于我自己在 Ubuntu 12.04 上的实验,仅进行了少量研究。如果我错了,请告诉我。

症结所在:

  • 在管道运行时按 Ctrl-C 会向管道中的所有进程发送信号 SIGINT
  • 进程接收信号的顺序不能保证
  • 除非管道中的所有进程都捕获信号,否则脚本将作为一个整体中止(尽管脚本本身可以使用 trap 命令捕获信号 - 但是这样直到管道进程接收到信号并通常被信号终止之后,shell 陷阱才会执行。

在您的特定情况下,arecord 设计 陷阱 SIGINT 并以有序的方式退出作为响应.
相比之下,flac 似乎没有 - 它被强行终止。
然而,即使 flac确实 陷阱 SIGINT 干净地关闭,给定信号接收的不确定顺序涉及的进程,您不能安全地使用带有 Ctrl-C 的管道,同时期望整体处理以有序的方式完成。

(顺便说一句:arecord 在用 Ctrl-C 终止时报告退出代码 1,这让我想知道你如何区分它来自真正的故障,例如磁盘空间不足。)

因此:

  • arecord 作为单独的命令调用,并将输出捕获到(临时)文件中。
  • 之后,将(临时)文件传递给 flac(完成后删除临时文件)。

关于bash - 在不停止脚本其余部分的情况下停止记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24535707/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com