f8g

Juliusを使って音声でPowerPointを操作

Juliusのページのサンプルを参考に。

// PowerPoint (事前にスライドショーを実行しておく)
var ppt = WScript.CreateObject("PowerPoint.Application");
if(ppt.SlideShowWindows.Count == 0) WScript.Quit();
ppt.SlideShowWindows.Item(1).Activate();
var show = ppt.SlideShowWindows.Item(1).View;

// SAPI
var reco = WScript.CreateObject("Sapi.SpSharedRecognizer");
var Ctxt = reco.CreateRecoContext();
WScript.ConnectObject(Ctxt, "Ctxt_");
Ctxt.EventInterests = 18;

var GramCommand_Attendant;
var GramCommand_YesNo;
var DialogState = 0;
var NameString = "";

StartDialog();

while(true){
	WScript.Sleep(500);
}

function StartDialog(){
	GramCommand_YesNo = Ctxt.CreateGrammar(0);
	GramCommand_YesNo.CmdLoadFromFile("./sapi/go.xml", 0);
	GramCommand_YesNo.CmdSetRuleState("S", 1);
}


function Ctxt_Recognition(StreamNum, StreamPos, RecogType, Result){
	print(Result.PhraseInfo.GetText())
	try{
		var prop = Result.PhraseInfo.Properties;
		if(prop.Item(0).Value == 0)
			show.Next();
		else
			show.Previous();
	}
	catch(e){ print(e.description) }
}

function print(s){
	WScript.Echo(s);
}

文法の方もサンプルをちょっとだけ変える。

<?xml version="1.0" encoding="UTF-8"?>
<GRAMMAR>
<RULE name="S" toplevel="ACTIVE">
  <L PROPNAME="NB">
    <P VAL="0">
      <RULEREF name="NEXT"/>
    </P>
    <P VAL="1">
      <RULEREF name="BACK"/>
    </P>
  </L>
</RULE>
<RULE name="NEXT" toplevel="INACTIVE">
  <L>
    <P>つぎ</P>
    <P>/つぎ/つーぎ;</P>
  </L>
</RULE>
<RULE name="BACK" toplevel="INACTIVE">
  <L>
    <P>まえ</P>
    <P>/まえ/まーえ;</P>
  </L>
</RULE>
</GRAMMAR>

ありがちなネタだけど、とても簡単にできるんだなあ。