Galatea ToolkitのGtalkをJavaで扱うサンプルコード

Gtalkの呼び出し方と、Gtalkで生成されたRawデーターをJavaSoundで再生する方法がわかると思います。

/*
* Created on 2005/03/19
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package rcp_gtalk;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;

/**
*
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class Test {

public static void main(String argv){
String text="春ですね。桜が咲いています";
String output="save.raw";

Runtime runtime=Runtime.getRuntime();
String gtalkPath="C:\\Program Files\\galatea4win\\engine\\SSM\\gtalk-1.0\\";

String gtalkSetting="C:\\Program Files\\galatea4win\\engine\\SSM\\gtalk-1.0\\ssm.conf";

String values="";
values+="set Speaker=female01"+"\r\n";

values+="set Text="+text+"\r\n";
values+="set Save="+output+"\r\n";

values+="set Speaker=male01"+"\r\n"; //dummy for get finish?
//values+="set Speak=NOW"+"\r\n"; //if you want play use this.

String match="rep Speaker = male01";
try {
Process p=runtime.exec(new String
{gtalkPath+"gtalk.exe","-C",gtalkSetting},new String[0],new File(gtalkPath));

System.out.println(gtalkPath+" -C "+gtalkSetting);


BufferedReader reader=new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
line=reader.readLine();
//System.out.println(line);
PrintWriter writer=new PrintWriter(p.getOutputStream());
writer.write(values);
writer.close();
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {

e1.printStackTrace();
}

/*// for play stop
while( (line=reader.readLine() )!=null){
System.out.println(line);
if(line.equals("rep Speak.stat = IDLE")){
break;
}
}*/

while( (line=reader.readLine() )!=null){
System.out.println(line);
if(line.equals(match)){
break;
}

}

p.destroy();

play(new File(gtalkPath+"save.raw"));

System.exit(0);
} catch (IOException e) {

e.printStackTrace();
}
}

public static void play(File file) {
try{
System.out.println(file.getAbsolutePath());
AudioFormat format =new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,16000f,16,1,2,16000f,false);

AudioInputStream inputStream=new AudioInputStream(new FileInputStream(file),format,file.length()/2);

DataLine.Info info = new DataLine.Info(SourceDataLine.class,format);
SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);
line.open(format);
line.start();

int readBytes = 0;
byte[] bytedata = new byte[256];
while (readBytes != -1) {

readBytes = inputStream.read(bytedata, 0, bytedata.length);
if (readBytes >= 0) {

line.write(bytedata, 0, readBytes);
}
}
line.drain();
line.close();

inputStream.close();
}catch(Exception e){
e.printStackTrace();
}
}
}