尝试从URL播放声音Java
问题描述:
我在播放某个URL的声音时遇到了麻烦。尝试从URL播放声音Java
这里是我当前的代码,
public static void aplay(String url) throws
MalformedURLException, UnsupportedAudioFileException,
IOException, LineUnavailableException {
Clip c = AudioSystem.getClip();
AudioInputStream a = AudioSystem.getAudioInputStream(new URL(url));
Clip c = AudioSystem.getClip();
c.open(a);
c.start();
}
而且,我在我的“主”的方法这种方法。我把https://translate.google.com/translate_tts?ie=utf-8&tl=en&q=Hi%20There作为'url',它不起作用,它会以403响应(服务器返回的HTTP响应代码:403)。我只是想知道我是否可以解决这个问题。
感谢, 丹
答
的网址是谷歌一个声音文件转换。为了防止滥用Google服务,服务器会执行一些启发式检查,试图通过该检查来判断它是访问该URL的人或自动服务。这就是为什么它回答403,实际上这意味着“禁止”。
声明:考虑为什么他们禁止并检查他们的使用条款。
在Chrome浏览器中直接打开网址。使用像wget或类URL这样的工具检索URL不会 - 至少不是开箱即用的。
您需要更改HTTP请求的User-Agent
属性才能伪造不同的用户代理。您可以通过连接“手动”并更改“User-Agent”请求属性来完成此操作。
以下WGet.java
上市演示了如何做到这一点:
import java.io.*;
import java.net.*;
public class WGet {
public static void main(final String... args) throws IOException {
for (final String arg : args) {
wget(arg);
}
}
public static void wget(final String arg) throws IOException {
wget(new URL(arg));
}
public static void wget(final URL url) throws IOException {
final URLConnection con = url.openConnection();
con.setRequestProperty("User-Agent", "My Client");
try (final InputStream in = con.getInputStream()) {
copy(in, System.out);
}
}
public static void copy(final InputStream in, final OutputStream out) throws IOException {
final byte[] buf = new byte[4096];
for (int bytesRead; (bytesRead = in.read(buf)) != -1;)
out.write(buf, 0, bytesRead);
out.flush();
}
}
AudioSystem
也可以用InputStream
使用。因此,下面aplay()
方法应该工作:
public static void aplay(String url) throws UnsupportedAudioFileException, IOException, LineUnavailableException {
Clip c = AudioSystem.getClip();
AudioInputStream a = AudioSystem.getAudioInputStream(openStream(url));
Clip c = AudioSystem.getClip();
c.open(a);
c.start();
}
public static InputStream openStream(String url) throws IOException {
final URL url = new URL(url);
final URLConnection con = url.openConnection();
con.setRequestProperty("User-Agent", "My Client");
return con.getInputStream();
}
免责声明:我向您展示的技术方案。如果您将此代码添加到您的程序并使用它从Google获取声音文件,那么您实际上可能违反了Google翻译的使用条款。在产品中使用此代码从Google翻译中获取声音文件之前,请先获得相关法律建议。
403表示禁止。一般来说,除非你有一定的访问级别,否则这个问题不会轻易修复。 – rfornal 2014-12-06 04:27:27
@rfornal有什么替代谷歌语音链接? – Dann15 2014-12-06 04:30:47
还有几个选择......我已经使用了一些创建培训视频,但不像编程那样在这里进行。 – rfornal 2014-12-06 04:39:02