作者exFREEzy (~RadicalDreamer~)
看板Ajax
标题[ JS ] Speech Synthesis Markup Language
时间Sun Nov 17 14:40:59 2013
这篇算是 Justin/twitch 平台应用的记录 内容可能很杂乱 ︿︿")
一般人对於 Text to Speech 文字转换语音的印象
最接近的一次应该就属 Google 翻译
http://ppt.cc/qOq4
不过有感於浏览器日渐肥大 实际应用时还可能会干扰到原本的使用习惯
因此开始考虑 摆脱浏览器的使用方式
以下为使用 LimeChat2 + JavaScript 的心得
真要说起来 CreateObject("SAPI.SpVoice").Speak"I love you" 是一切的滥觞
对这串没啥印象? 那麽这个标题
「你知道吗? 电脑其实也有性别」「检查你的电脑是男生还是女生」
不晓得有没有看过类似的网路流言 XD
原文是采用 VBScript 呼叫 Speech Application Programming Interface(SAPI)
延伸阅读:http://webptt.com/cn.aspx?n=bbs/digitalk/M.1381463983.A.7D4.html
可惜 SAPI 方面没有找到合用的台湾腔语音引擎
因此改往 Microsoft Speech Platform(MSSP)作研究
刚开始其实很不在意语音参数 想说 MSSP 能用就好
只是看到 spcbght.bat:
http://denspe.blog84.fc2.com/blog-entry-29.html
不信邪为什麽人家可以办得到 参考之下才发现大有玄机
//SAPI5のVoiceオブジェクトには
//「速度」「音量」のプロパティはあるが「音程」はない。
//音程を指定する场合は<pitch absmiddle="音量値">
//を使いXMLモードで再生する必要がある。
//その场合は第二引数に「SPF_IS_XML(0x08)」を指定してXMLを强制する。
这注解乍看之下是 SAPI 没想到意外的也能作用於 MSSP
VoiceObj.Speak('<pitch absmiddle="'+VoicePitch+'">'+SpeakText+"</pitch>"
,0x00|0x08);
搭配最後一行的注解 让我更是在意 Speak method 葫芦里到底卖的是什麽药?!
回头去找
http://msdn.microsoft.com/library/ee125647.aspx
终於让我发现了 SpeechVoiceSpeakFlags(SVSF)
http://msdn.microsoft.com/library/ee125223.aspx
也才注意到原来预设的同步 是指朗读的时候会将执行中的程式锁住(防止下一步操作
改为 Asynchronous Speaking 非同步语音 整个就非常合乎使用了
而 SAPI text-to-speech (TTS) extensible markup language (XML) 标签
也改为 MSSP 的 Speech Synthesis Markup Language (SSML)
http://msdn.microsoft.com/library/hh378377.aspx
这真的是要暴力解才会这样子用 因为 MSSP 与 SSML 完全没提到这件事情
最後就产生了这个大杂烩的 JavaScript
将 SAPI.SpVoice 改为 Speech.SpVoice 呼叫 MSSP
但实际上 Object 仍保有 SAPI 性质
所以 Speak method 让 MSSP 支援 SVSF
达成 非同步 与支援 SSML 可自订语音参数
https://drive.google.com/file/d/0B3hkFOHrzSukU3hvVE12OElld3M
过程中 TRY & ERROR 真的是充满各种撞墙期
尤其是有些参数都不会回报错误讯息
1)想说有看到
http://www.w3.org/TR/speech-synthesis11/
结果用 <speak version="1.1"> 就是毫无反应
2)又譬如 SSML prosody Element 搭配 parseInt 时好时坏
後来抓 log 出来看才发现 正数 都…(默
少了个 + 就是死给你看 ╮(﹀_﹀")╭
不过後续修补也加入了 isNaN 算是难得的防呆
3)常用到 String.match 或 String.replace 这功能
这次好好的重新回顾了 RegExp
http://rubular.com
4)平常用 != '' 习惯了
有时候太顺手会打出 == '' 这种鬼东西(被巴头
订正十次 == null 请养成好习惯
目前还有打算改善的地方有两个
1)一个是读取文件的方式
由於 . 跟 : 都会影响 array
LimeChat2 能够使用的函式又有限
目前还没想到怎麽回避 o(><;)o
2)另外就是注音符号了 语音的字典档没办法念
是有考虑过这种方法
http://winscript.jp/azurea/4
不过实作上 应该用关键字替代更实际 XD
最後附上释出前发现的网站
http://tdc.putonghuaonline.com/tool/index.php
之前浏览了一下 似乎也不少这种 TTS App
有兴趣的话才玩玩看吧
--
旧文,挖坑前置作业
Gesmic7:
http://webptt.com/cn.aspx?n=bbs/Live/M.1381476020.A.B9E.html
附上各种参考资料
http://www.neko.ne.jp/~freewing/software/speech_app_11/
http://mahoro-ba.net/e1591.html
http://www36.atwiki.jp/jikkyosha_ust/pages/80.html#id_32933629
接下来才看有没有动力转移到 Perl 或 python
这样子就连 hexchat 都有机会用用看了 _(:3J∠)_
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 49.158.75.98