Python + GalateaTalk

NVDA というオープンソースのWindows用スクリーンリーダーで GalateaTalk が使えないか、という話があったので、調べてみました。

最新の 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行くらい喋った!!

でも、すぐに音声合成がハングアップ。やっぱり「音切れ」の処理を実装しないとダメですね。

続きは明日!!