0

我正在使用一个非常基本的 java 声音类从 Bing Translate 流式传输音频以用于汉字的发音。它对我测试过的所有 20 个单词都非常有效,除了一个。

当我尝试获得单词“你”的发音时(意思是你),我得到了错误的声音。奇怪的是,当我获取在代码中形成的 URL 并手动将其放入浏览器(我正在使用 Bing Translate HTTP API)时,我得到了正确的声音。所以在我看来,错误必须在我的代码中的某个地方。我唯一能想到的地方就是缓冲区。

真正奇怪的是,我没有得到沉默或胡言乱语。相反,返回的声音是用中文说“一半”(字面意思是“二分之一”)的方式。正如我之前所说,当我将 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;
        }
    }

}
4

1 回答 1

1

所以我终于在微软翻译论坛的帮助下解决了这个问题。事实证明,由于我使用的是特殊字符,因此编码确实很重要。奇怪的是,除了这个之外,它对每个字符都有效,而这个仍然能够产生一些可理解的(尽管是错误的)输出。

以下行需要从

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

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

我只是偶然发现了这一点,因为当我尝试从我的 jar 文件中播放声音时,我的 URL 从服务器收到了错误的 URL 错误,而它在 IDE 中完美运行。

于 2011-06-14T04:27:56.120 回答