Hallo,

ich weis nicht ob das Verwenden von Zusatzbilbiotheken erlaubt ist aber mit ICU4J und FreeTTS bekommt man das gewünschte recht einfach hin.
http://site.icu-project.org/ ( Wenn man eclipse installiert hat findet man ICU unter %ECLIPSE_HOME%/plugins/com.ibm.icu_xxxxxx.jar )
http://www.tutorials.de/forum/java/3...ml#post1649104
http://freetts.sourceforge.net/docs/index.php
http://www.jugsaar.de/?p=73

Hier mal eine prototypische Realisierung:
Code java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package de.tutorials;
 
import static java.lang.String.format;
import static java.util.Calendar.HOUR_OF_DAY;
import static java.util.Calendar.MINUTE;
 
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
import com.ibm.icu.text.RuleBasedNumberFormat;
import com.sun.speech.freetts.Voice;
import com.sun.speech.freetts.VoiceManager;
 
/**
 * @author Tom
 * 
 */
public class NaviComputer {
    RuleBasedNumberFormat ruleBasedNumberFormat = new RuleBasedNumberFormat(Locale.GERMANY, RuleBasedNumberFormat.SPELLOUT);
    boolean exit = false;
 
    public static void main(String[] args) {
        new NaviComputer().run();
    }
 
    private void run() {
        Scanner input = new Scanner(System.in);
        while (!exit) {
            System.out.print("> ");
            String line = input.nextLine();
            process(line);
        }
        input.close();
    }
 
    private void process(String input) {
        if (input.startsWith("exit")) {
            exit = true;
        } else if (input.matches("\\d+")) {
            String numberSpelledOut = ruleBasedNumberFormat.format(Long.parseLong(input));
            System.out.println(numberSpelledOut);
        } else if (input.startsWith("/clock")) {
            Calendar now = new GregorianCalendar();
            int hour = now.get(HOUR_OF_DAY);
            int minute = now.get(MINUTE);
            System.out.println(format("%s Uhr %s (%s)", ruleBasedNumberFormat.format(hour), ruleBasedNumberFormat.format(minute), new SimpleDateFormat("HH:mm").format(now.getTime())));
        } else if (input.startsWith("/number ")) {
            String numberSpelledOut = input.substring(8);
            try {
                Number number = ruleBasedNumberFormat.parse(numberSpelledOut);
                System.out.println(number);
            } catch (ParseException e) {
                System.out.println(format("Konnte die Eingabe %s nicht in eine Zahl Umwandeln! (%s)", numberSpelledOut, e.getMessage()));
            }
        } else if (input.startsWith("/speak ")) {
            try {
                String number = input.substring(7);
                String numberSpelledOut = ruleBasedNumberFormat.format(Long.parseLong(number));
 
                VoiceManager voiceManager = VoiceManager.getInstance();
                Voice voice = voiceManager.getVoice("kevin");
                try {
                    voice.allocate();
                    voice.speak(numberSpelledOut);
                } finally {
                    voice.deallocate();
                }
            } catch (Exception e) {
 
                e.printStackTrace();
            }
 
        } else {
            Matcher matcher = Pattern.compile("(\\d+)").matcher(input);
            String s = input;
            while (matcher.find()) {
                String number = matcher.group();
                String numberSpelledOut = ruleBasedNumberFormat.format(Long.parseLong(number));
                s = s.replaceAll(number, numberSpelledOut);
            }
            System.out.println(s);
        }
    }
}

Ausgabe:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> 15
fünfzehn
> 102
hundertzwei
> 851
achthunderteinundfünfzig
> /clock
dreiundzwanzig Uhr fünfundzwanzig (23:25)
> In 500m hinter dem nächsten Baum rechts
In fünfhundertm hinter dem nächsten Baum rechts
> 25
fünfundzwanzig
> /number fünfundzwanzig
25
> /speak 25

Gruß Tom