NVDA というオープンソースのWindows用スクリーンリーダーで GalateaTalk が使えないか、という話があったので、調べてみました。
- http://www.nvda-project.org/snapshots/
- http://sourceforge.jp/projects/galateatalk/
- http://nabe.jot.com/WikiHome/NVDAJp
最新の NVDA snapshots には NVDAJp の活動の成果が取り込まれています。
まず、python で gtalk を実行してみます。下記を UTF-8 で保存して実行。
# -*- coding: utf-8 -*- import popen2 import os import codecs os.chdir("c:\\work\\istc\\SSM\\gtalk\\") cmd = "gtalk -C ssm-win.conf" (cout, cin) = popen2.popen4( cmd ) cin = codecs.getwriter('shift_jis')(cin) text = u'こんにちは' cin.write("set Text = " + text + "\n") cin.write("set Speak = NOW\n") for line in cout.readlines(): print line
あちこちからパクったソースです。「こんにちは」と喋ってくれました。
次は NVDA のドライバー実装です。
NVDA/synthDrivers/display.py をコピーして gtalk.py を作り、
class SynthDriver(silence.SynthDriver): name = "gtalk" description = "galatea talk (experimental)"
にしてみたら、とりあえず NVDA 起動→ Ctrl-Shift-S で gtalk が選択可能に。
def initialize(self): os.chdir("c:\\work\\istc\\SSM\\gtalk") cmd = "gtalk -C ssm-win.conf" (self.cout, self.cin) = popen2.popen4( cmd ) self.cin = codecs.getwriter('shift_jis')(self.cin) text = u'子猫が隠れんぼをしています' self.cin.write("set Text = " + text + "\n") self.cin.write("set Speak = NOW\n") self.frame = SynthFrame()
gtalk ドライバー選択時に「子猫が・・」と喋ってくれました。
def speakText(self,text,wait=False,index=None): self.cin.write("set Text = " + text + "\n") self.cin.write("set Speak = NOW\n") self.frame.textCtrl.AppendText(text + "\n")
お、最初の2行くらい喋った!!
でも、すぐに音声合成がハングアップ。やっぱり「音切れ」の処理を実装しないとダメですね。
続きは明日!!