我在播放来自某个网址的声音时遇到了麻烦。
这是我目前的代码,
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();
}
另外,我的'main'方法中有这个方法。我将https://translate.google.com/translate_tts?ie=utf-8&tl=en&q=Hi%20There作为'url'并且它不起作用,它将响应403(服务器返回的HTTP响应代码:403)。我只是想知道我是否可以解决这个问题。
谢谢, 丹
答案 0 :(得分:0)
网址是Google翻译的声音文件。为了防止滥用Google服务,服务器会执行一些启发式检查,并尝试判断它是访问URL的人员还是自动服务。这就是为什么它回复403,这实际上意味着"禁止"。
免责声明:请考虑为何禁止并检查其使用条款。
直接在Chrome浏览器中打开网址。使用像wget或类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翻译中获取声音文件。