我有一个在本地主机上运行的流服务器。当我尝试从我的Android应用程序流式传输音频时。大多数时候,我都会听到静噪声(收音机里那种声音)。有时完整的音频是静态噪声,有时是其中的一部分,有时音频播放得很好,所以我不确定问题出在哪里。
这是我的Android应用程序中的流式传输代码:
new Thread(
new Runnable() {
@Override
public void run() {
try {
URI uri = URI.create("http://192.168.1.6:5000/api/tts");
HttpURLConnection urlConnection = (HttpURLConnection) uri.toURL().openConnection();
urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("Content-Type", "application/json");
urlConnection.setRequestProperty("x-access-token", credentials.getAccessToken());
urlConnection.setRequestProperty("Accept", "*");
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.connect();
OutputStreamWriter osw = new OutputStreamWriter(urlConnection.getOutputStream());
String body = "{\"text\": \"" + text + "\", \"ttsLang\": \"" + language + "\"}";
Log.d("TTS_HTTP", body);
osw.write(body);
osw.flush();
osw.close();
Log.d("TTS_OUT", credentials.getAccessToken());
Log.d("TTS_OUT", urlConnection.getResponseCode() + " " + urlConnection.getResponseMessage());
// define the buffer size for audio track
int SAMPLE_RATE = 16000;
int bufferSize = AudioTrack.getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT);
if (bufferSize == AudioTrack.ERROR || bufferSize == AudioTrack.ERROR_BAD_VALUE) {
bufferSize = SAMPLE_RATE * 2;
}
bufferSize *= 2;
AudioTrack audioTrack = new AudioTrack(
AudioManager.STREAM_MUSIC,
SAMPLE_RATE,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT,
bufferSize*2,
AudioTrack.MODE_STREAM);
byte[] buffer = new byte[bufferSize];
InputStream is = urlConnection.getInputStream();
int count;
audioTrack.play();
while ((count = is.read(buffer, 0, bufferSize)) > -1) {
Log.d("TTS_COUNT", count + "");
audioTrack.write(buffer, 0, count);
}
is.close();
audioTrack.stop();
audioTrack.release();
} catch (IOException e) {
e.printStackTrace();
}
}
}
).start();
请帮助我修复代码以解决问题。如前所述,我无法正确听到声音。
此外,服务器响应很好,因为我可以使用Python代码将其保存到文件中。保存的文件正在正常播放。
>>> import requests
>>> import wave
>>> with wave.open("output.wav", "wb") as f:
... f.setframerate(16000) # 16khz
... f.setnchannels(1) # mono channel
... f.setsampwidth(2) # 16-bit audio
... res = requests.post("http://192.168.1.6:5000/api/tts", headers={"x-access-token": token}, json={"text": "Hello, would you like to have some tea", "ttsLang": "en-us"}, stream=True)
... for i in res.iter_content(chunk_size=16*1024):
... f.writeframes(i)
...
更新:将输入流写入文件,然后从文件播放到音轨就可以了...
答案 0 :(得分:6)
最后,我解决了这个问题。事实证明,AudioTrack
不喜欢写入不一致的数据量,并因此而引起静态噪声。这是之前写入AudioTrack
的字节计数序列,导致出现问题1248
,3439
,5152
,5152
,{{1 }},...,3834
(不一致)。因此,我研究了823
的{{1}}方法并使用了它,从而解决了静态噪声问题。字节计数序列现在看起来像readFully
,DataInputStream
,5152
,...,5152
(一致)。但是现在的问题是读取由于5152
而被跳过的剩余字节。所以我必须实现自己的方法来解决此问题。
5152
现在我的最终代码如下:
EOFException
现在,我的音频播放良好,没有任何静噪。希望这可以帮助其他与我有同样问题的人。