Я использую очень простой класс звука 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;
}
}
}