尝试从URL Java播放声音

时间:2014-12-06 04:24:02

标签: java url audio

我在播放来自某个网​​址的声音时遇到了麻烦。

这是我目前的代码,

    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)。我只是想知道我是否可以解决这个问题。

谢谢,   丹

1 个答案:

答案 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翻译中获取声音文件。