99 Bottles of Beer
03/17/03 09:33 AM

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?

Comments (0)