【问题标题】:(Unix) piping tail -f to festival(Unix)管道tail -f到节日
【发布时间】:2013-09-14 02:04:35
【问题描述】:

我正在尝试将文件末尾的流(通过 tail -f)发送到节日,这是一个文本到语音程序。 tail -f ./文件名 |节日 --tts 很适合这个。

这是我的问题: 我想更改来自 tail -f 的流,以便节日可以更好地合成它,并避免它说出整个时间戳。我知道像 sed 和 grep 这样的程序可以做到这一点。不幸的是 tail -f ./filename | sed 's/:/ 说/' | Festival --tts 不输出任何声音。

是的,我已经检查是否 tail -f ./filename | sed 's/:/says/' 输出任何东西,而且效果很好。

我也尝试过使用 grep 进行此操作,但在编辑我的信息流后,我无法让 festival --tts 说任何话。

任何允许我的流被编辑然后说出来的东西都会受到欢迎,我不受 sed 和 grep 的束缚。

【问题讨论】:

  • 问题可能是 sed 缓冲 I/O 导致它在一段时间内不写入任何内容。您可以通过仅用 tail 命令替换 tail -f 来测试它。通常有改变缓冲的方法,但通常是特定于命令的。尝试sed --helpsed -? 看看是否有任何选项提到无缓冲输出等。

标签: unix sed grep piping festival


【解决方案1】:

tail -f 本身不起作用,因为 Festival 在输出音频之前正在等待输入流关闭。以tail -f 作为输入,输入流永远不会关闭。

但是,您可以使用 bash read 命令分解尾部输出,通过 grep 运行它,然后使用如下脚本在单独的进程中将其传递给节日:

tail -f ./filename | grep something |  while read line; do 
  echo "$line" | festival --tts
done

如果您的 grep 过滤器没有返回太多数据,则 grep 缓冲区填充和刷新需要一些时间。要减小 grep 缓冲区的大小,请使用 grep --line-buffered something。 sed 具有类似的缓冲功能,您可以使用 sed 中的-u(无缓冲)选项来禁用它们。

【讨论】:

  • 您也可以尝试将festival 移动到循环的末尾,即... done | festival --tts 以避免为festival 重复创建进程,但这里可能也会出现缓冲问题。祝大家好运。
猜你喜欢
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多