Posts Tagged ‘发声’

解魔方的机器人攻略27 – 让萝卜头开口说话

上次提到了“甜美的声音”,今天介绍一下如何让萝卜头发出声音。NXT的发声装置就是盒子上那个小喇叭,因为喇叭质量不是很高,所以别太指望萝卜头能演奏世界名曲。从开发角度来说,NXT内置了很多种发声的方式,详细内容可以参考leJOS中文教程 – 播放声音。例如,我们用下面的代码就可以让NXT蜂鸣两声:

Sound.twoBeeps();

NXT还可以直接播放8位的wav文件,播放命令是:

Sound.playSample(new File("Start.wav"));

下面介绍一下如何制作这样的wav文件。

首先要录制声音,用手头的任意录音工具都可以,例如手机,mp3,其实电脑本身也可以录音。萝卜头一共需要三句台词:“开始”、“结束”和“出错啦”。可以一次录完,把三段声音录在一起,每句台词之间留一点停顿,后期容易裁剪。

录好音之后,一般会生成*.wav或者*.mp3的文件。这种直接录好的文件一般都是双声道,而且采样频率比较高。这种高级音频萝卜头是没法识别的,要适当压缩成萝卜头可以处理的格式。

强烈推荐一款叫“CoolEdit”的音频处理工具,打开录好的音频文件,可以看到有声音的部分是波形图,中间停顿的部分几乎是平的直线。可以用鼠标拖动选择相应的音频,然后在菜单中选择“选中部分另存为..”,保存的格式选择“Wave PCM unsigned 8 bit,8000HZ,64kbps,单声道”,就可以生成相应的wav文件了。最后可以生成以下三个文件:

Start.wav
End.wav
Error.wav

下面把这几个文件下载到NXT中,在命令行中运行:E:\lejos_nxj\bin\nxjbrowse.bat。如果萝卜头开机的话,这个工具的“download”功能,依次把三个文件都保存到NXT中。

最后在程序的相应地方加入播放代码即可,上一篇中已经看到了出错信息的播放,“开始”和“结束”的播放程序为:

if(hasCube && isChaotic)
{
	//The cube is read, init the error status
	hasError = false;

	//Play some sound to notice the "Start"
	Thread.sleep(1000);
	Sound.twoBeeps();
	Thread.sleep(1000);
	Sound.playSample(new File("Start.wav"));

	//Ignore solve cube codes......

	if(!hasError)
	{
		//The cube has been solved
		isChaotic = false;

		Sound.playSample(new File("End.wav"));
		Thread.sleep(1000);

		//Rotate the cube two circles for annoucement
		Robot.RotateBottom(8);
	}
}