Emacs中的文本到语音转换

时间:2010-01-02 03:56:37

标签: emacs text-to-speech festival

我不是盲目的,我只想让我的Windows机器读取缓冲区的内容。以下是基本要求:

  • 阅读任何英文文本缓冲区。
  • 随时暂停阅读并随时恢复(当有人走进我的办公室时,不要等待几分钟才能完成大缓冲)。
  • 在播放时调整回读速度。
  • 突出显示当前正在阅读的文字(可选)

我找到了几个可能的解决方案:

  • Emacspeak:专为盲人设计。看起来像一个独立的程序,而不是Emacs插件
  • festival.el:需要节日。我找不到Windows Binaries for Festival。有人有吗?
  • 我也可以写自己的。文字转语音(TTS)库现在很多。交互式暂停功能可能是最大的技巧,但必须有一些库可以做到这一点。

哪个选项是最好的计划?我不想在这里进行为期一周的项目。 Windows中的编译节是一个痛苦的实验。 Emacspeak对于我想要的东西看起来有点过分。

2 个答案:

答案 0 :(得分:6)

适用于Windows的Festival here。我不能保证festival.el会使用这些二进制文件。不过,我确实有使用这些二进制文件的经验,所以如果你在Emacs以外的地方工作时遇到问题,我可以提供帮助。

我认为你不会控制节日播放速度,但我可能会弄错。至于保留对它的控制权,我会说你最好的选择就是对其进行编程,使其一次只能向节日发送一小部分内容。否则,在完成之前,确实没有办法阻止它阅读。

基本上,我认为没有任何工作可以满足您的最低要求。

编辑:在回顾过你的要求之后,我会说最好的方法是破解festival.el一次向Festival发送一个句子。然后你可以编程一个会杀死它的击键,这样它只会完成当前的句子。同时,您的脚本可以突出显示当前发送到Festival的句子。

答案 1 :(得分:1)

我有一个基于Python pyttsx模块的简单解决方案。这会将一个python脚本作为emacs进程启动,并将其发送给要读出的字符串。

(defvar tts nil "text to speech process")

(defun tts-up ()
  (interactive)
  (and (not (null tts))
       (eq (process-status tts) 'run)))

(defun tts-start ()
  (interactive)
  (if (not (tts-up))
      (setq tts
            (start-process "tts-python"
                           "*tts-python*"
                           "python" "speak.py"))))

(defun tts-end ()
  (interactive)
  (delete-process tts)
  (setq tts nil))

(defun tts-say (text)
  (interactive)
  (tts-start)
  (process-send-string tts (concat text "\n")))

python文件speak.py:

import pyttsx

engine = pyttsx.init()

def say(data):
    engine.say(data)
    engine.runAndWait()

while True:
    say(raw_input())