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行くらい喋った!!
でも、すぐに音声合成がハングアップ。やっぱり「音切れ」の処理を実装しないとダメですね。
続きは明日!!