私は非常に基本的な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;
}
}
}