Monday, March 17, 2003

99 Bottles of Beer

I read an article on Slashdot about a contest which would have programmers write an interesting program printing the lyrics to "99 bottles of beer on the wall". This inspired me to play with the Java Speech API. I wrote a quick program to recite the lyrics. It's really nothing more than a glorified Hello World program, but it let me play with the Speech API:

public class BottlesOfBeer {
public static void main(String[] args) {
Voice voice = null;
Class voiceClass;
try {
voiceClass = Class.forName("com.sun.speech.freetts.en.us.CMUDiphoneVoice");
voice = (Voice) voiceClass.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
if (voice instanceof MbrolaVoice) {
try {
(new MbrolaVoiceValidator((MbrolaVoice) voice)).validate();
} catch (ValidationException ve) {
System.err.println(ve.getMessage());
throw new IllegalStateException("Problem starting MBROLA voice");
}
}
voice.setLexicon(new CMULexicon());
voice.setAudioPlayer(new JavaClipAudioPlayer());
voice.load();
for (int i = 99; i > 0; i--) {
String verse = i + getBottle(i) + " of beer on the wall. " +
i + getBottle(i) + " of beer. " +
"Take one down. Pass it arround. " +
(i - 1) + getBottle(i - 1) + "of beer on the wall.";
voice.speak(verse);
}
voice.speak("Thank you everyone. You've been a great audience. " +
"I'll be here all week!");
}
public static String getBottle(int numberOfBottles) {
return numberOfBottles != 1 ? " bottles" : " bottle";
}
}

For those of you who don't know, the Java Speech API doesn't have a reference implementation. It only defines the api. I used an open source implementation called FreeTTS.

By sharing this code, I've disqualified my self from the contest, but since the code is judged on compactness, obfuscation and originality, I don't think I had much of a shot anyway.

By the way... when did obfuscation become a cherished trait in a programmer?

Labels:

0 Comments:

Post a Comment



<< Home