странная проблема с потоковым аудио в Java - PullRequest
0 голосов
/ 07 июня 2011

Я использую очень простой класс звука Java для потоковой передачи аудио из Bing Translate для произношения китайских иероглифов. Это прекрасно работает для всех 20 слов, которые я тестировал, кроме одного.

Когда я пытаюсь получить произношение слова 你 (что означает «ты»), я получаю неправильный звук. Странно то, что когда я беру URL, который сформирован в коде, и вручную помещаю его в браузер (я использую HTTP-API Bing Translate), я получаю правильный звук. Так что, мне кажется, ошибка должна быть где-то в моем коде. Единственное место, о котором я могу думать, это буфер.

Действительно странная вещь в том, что я не получаю тишину или тарабарщину. Вместо этого возвращающийся звук - это способ сказать «одна половина» (буквально говоря «одна часть двух») на китайском языке. Как я уже говорил ранее, когда я помещаю URL в браузер, я получаю правильный звук для вас.

РЕДАКТИРОВАТЬ: Кроме того, если я поставлю 你们 (это множественное число для вас и включает в себя оригинальный символ), я верну правильный звук.

Мой код ниже. В моем pvsm все, что у меня есть, - это создать экземпляр этого класса, а затем вызвать speakWord (你)

    public class WordSpeaker {
    private static final String TEST_CONN = "http://api.microsofttranslator.com/v2/Http.svc/" +
            "Detect?appId=5768596A4F34453BDAED3138E800D4F7EB5097B9&text=hello";
    private static final String TEST_VAL = "en";

    private static final String URL_FRONT = "http://api.microsofttranslator.com/v2/Http.svc/Speak?appId=" +
            "5768596A4F34453BDAED3138E800D4F7EB5097B9" + "&text=";
    private static final String URL_END = "&language=zh-cn";

    private AudioInputStream audioStream = null;
    private static final int EXTERNAL_BUFFER_SIZE = 128000;


    public WordSpeaker() {

    }

    public void speakWord(String sWord) {
        try {
            URL bingTranslate = new URL(URL_FRONT + sWord + URL_END);
            System.out.println(bingTranslate.toString());
            audioStream = AudioSystem.getAudioInputStream(bingTranslate);
        } catch (Exception e) {
            e.printStackTrace();
        }

        AudioFormat format = audioStream.getFormat();
        SourceDataLine line = null;
        DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);

        try {
            line = (SourceDataLine) AudioSystem.getLine(info);
            line.open(format);
        } catch (LineUnavailableException le) {
            System.out.println(le);
        } catch (Exception e) {
            e.printStackTrace();
        }

        line.start();

        int bytesRead = 0;
        byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];

        while (bytesRead != -1){
            try{
                bytesRead = audioStream.read(abData,0,abData.length);
            } catch (Exception e){
                e.printStackTrace();
            }
            if (bytesRead >=0){
                int bytesWritten = line.write(abData,0,bytesRead);
            }
        }

        line.drain();
        line.close();

    }

    private boolean testBing() {
        try {
            URL test = new URL(TEST_CONN);
            BufferedReader testRead = new BufferedReader(new InputStreamReader(test.openStream()));

            String inLine = testRead.readLine();
            return inLine.substring(inLine.lastIndexOf("\">") + 2, inLine.lastIndexOf("<")).equals(TEST_VAL);

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

}

1 Ответ

1 голос
/ 14 июня 2011

Итак, я, наконец, понял это с помощью форума перевода Microsoft.Оказывается, поскольку я использую специальные символы, кодировка имеет значение.Просто странно, как это работает для каждого отдельного персонажа, кроме этого, и этот все еще смог произвести какой-то понятный (хотя и неправильный) вывод.

Следующая строка должна быть изменена с

URL bingTranslate = new URL(URL_FRONT + sWord + URL_END);

на

URL bingTranslate = new URL(URL_FRONT + URLEncoder.encode(sWord, "UTF-8") + URL_END);

Я только наткнулся на это, потому что мои URL-адреса получали неправильную ошибку URL-адреса с серверакогда я пытался воспроизвести звуки из файла JAR, пока он отлично работал в IDE.

...