分享和请教:在win emacs中选中文本后朗读出来

装了eSpeak写了个elisp函数搞定

(defun my-read-aloud()
  (interactive)
  (let (wd)
    (if mark-active
        (setq wd (buffer-substring-no-properties
                  (region-beginning) (region-end)))
      (progn
        (setq wd (thing-at-point 'filename) )
        ))
    (shell-command 
     (format "\"C:/Program Files/eSpeak NG/espeak-ng\" %s" wd)
    ) ))

github下载 的espeak-ng windows安装包,不能选安装路径,安装后没有提示怎么用,命令行里没有espeak-ng,环境变量也无,控制面板也找不到,最后在c盘里找到了,于是把整个目录复制到d盘在调用,但是发现用不了,安装时的绝对路径是写死的,可执行文件换一个目录就不能执行。这里只好把绝对路径写上。

另一个问题,就是中文读不出来,espeak-ng -v zh "不会中文",我看源码里是有中文语音数据的,论坛里有使用espeak的吗?有办法能对中文正常发音吗?

换成了日语,乌克兰语试了下,都不能正常读出,看来除了英语以外,其它语言都较难做到正常发音

把问题分开,先不管 Emacs,终端里能正常使用吗?

看了下文档,普通话貌似不是 zh,而是 cmn

我没有用过 espeak-ng 也不能测试。

1 个赞

是在终端命令行里测试的,我把内容写在文件里,终端执行 espeak-ng -v cmn -f d:\file\test.org 读取文件内容,单个字进行测试,发现还是有极少字可以读出来,如:,,大部分字读的与这个字的普通话是完全不同的发声。

有没有这样一种可能:中文贡献者严重缺乏(就没有),开发者也不会读中文,就象征性的支持了几个中文音节,然后就在语言支持列表里把中文加上了

绝大多数中文汉字应该读的出来吧,或许是差字典? --with-extdict-cmn

多音字肯定不管了,随意读一个音

这个读出来的音不太好形容,我英语差,听不明白读的是啥,如 '中' 字可以读出,与'中'发音相近的'重、种、忠'都能读出,'和'字我听不懂读的是啥,只能感觉到是英语读法,与'和'发音相近的'合、河、贺'就都差不多是这个发音。 所以我说支持了几个中文音节。

中文的同音字非常多,即使只支持几个中文音节,只要是近似这个读音的字都能读出,那就已经是支持了很多汉字了。但我确定离 '绝大多数中文汉字' 能准确读出还差得很远

看样子是因为在 windows 上用的 TTS 引擎是 Windows 旧版 SAPI,对中文支持程度不高。因为 API 代码版权问题没法用新版的。Reimplement the SAPI bindings. · Issue #7 · espeak-ng/espeak-ng · GitHub

网上找了个视频,哪怕是英语 macOS 的 TTS 也比这强多了,毕竟 Apple 早在 Macintosh 时代就在做 TTS 了。

显然在 macOS 就会用 macOS 的系统 TTS,对盲人来说 macOS 比 Windows 不要好太多。

20240930更新:

不能读中文其实不重要,装这个本来的目的是也是为了读英文,但英文读得也非常难听,分享一些办法可以提高音质:

提高音量 -a,提高音调 -p,保存成wav文件 -w,这一步最有效果,保存成wav文件后在读这个wav文件音质比直接用eSpeak读明显好得多。读wav文件我使用的是ffplay,D:\local\ffmpeg\bin\ffplay.exe -autoexit -nodisp d:/tmp/espeak/out.wav

后续计划准备借助AI写个浏览器插件,实现在浏览器中选中单词后右键菜单里出现 用本地espeak发音 这个选项。

我估计应该只有windows需要这么折腾,主流linux发行版下的espeak应该不是这个效果或有其它更好的选择,mac os就好得更多了