0

私は非常に基本的なJavaサウンドクラスを使用して、漢字の発音のためにBingTranslateからオーディオをストリーミングしています。1つを除いて、私がテストした20の単語すべてに対して素晴らしい働きをしました。

你(あなたを意味する)という単語の発音を取得しようとすると、間違った音が聞こえます。奇妙なことに、コードで形成されたURLを取得し、それを手動でブラウザーに配置すると(Bing Translate HTTP APIを使用しています)、正しいサウンドが得られます。したがって、エラーはコードのどこかにある必要があるように思われます。私が考えることができる唯一の場所はバッファです。

本当に奇妙なことは、私が沈黙やぎこちないことをしていないということです。代わりに、戻ってくる音は中国語で「半分」(文字通り「2分の1」と言う)を言う方法です。前にも言ったように、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);

IDEで完全に機能しているときにjarファイルからサウンドを再生しようとすると、サーバーからURLに不正なURLエラーが発生したため、これに遭遇しただけです。

于 2011-06-14T04:27:56.120 に答える