使用Java从URL获取声音

时间:2012-12-09 16:01:56

标签: java url audio mp3 javasound

我正在学习英语,我想开发一个软件来帮助我发音。

如果您在此处输入,则会有一个名为HowJSay的网站:http://www.howjsay.com/index.php?word=car 你马上就会听到汽车这个词的发音。我想在JAVA中开发一个可以播放这个声音的软件而无需进入网站=]

我尝试了这个,但是不起作用= /

public static void main(String[] args) throws Exception {
    URL url = new URL("http://www.howjsay.com/index.php?word=car");
    url.openConnection();
    AudioStream as = new AudioStream(url.openStream());
    AudioPlayer.player.start(as);
    AudioPlayer.player.stop(as);
}

任何想法?请。

4 个答案:

答案 0 :(得分:3)

你去吧

import javax.sound.sampled.*;
import java.io.IOException;
import java.net.URL;

public class HowJSay
{
public static void main(String[] args) {
    AudioInputStream din = null;
    try {
        AudioInputStream in = AudioSystem.getAudioInputStream(new URL("http://www.howjsay.com/mp3/"+ args[0] +".mp3"));
        AudioFormat baseFormat = in.getFormat();
        AudioFormat decodedFormat = new AudioFormat(
                AudioFormat.Encoding.PCM_SIGNED,
                baseFormat.getSampleRate(), 16, baseFormat.getChannels(),
                baseFormat.getChannels() * 2, baseFormat.getSampleRate(),
                false);
        din = AudioSystem.getAudioInputStream(decodedFormat, in);
        DataLine.Info info = new DataLine.Info(SourceDataLine.class, decodedFormat);
        SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);
        if(line != null) {
            line.open(decodedFormat);
            byte[] data = new byte[4096];
            // Start
            line.start();

            int nBytesRead;
            while ((nBytesRead = din.read(data, 0, data.length)) != -1) {
                line.write(data, 0, nBytesRead);
            }
            // Stop
            line.drain();
            line.stop();
            line.close();
            din.close();
        }

    }
    catch(Exception e) {
        e.printStackTrace();
    }
    finally {
        if(din != null) {
            try { din.close(); } catch(IOException e) { }
        }
    }
}

}

答案 1 :(得分:1)

如果您对网站不太关心,那么您尝试使用Google Translate API

try{
        String word="car";
        word=java.net.URLEncoder.encode(word, "UTF-8");
        URL url = new URL("http://translate.google.com/translate_tts?ie=UTF-8&tl=ja&q="+word);
        HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
        urlConn.addRequestProperty("User-Agent", "Mozilla/4.76");
        InputStream audioSrc = urlConn.getInputStream();
        DataInputStream read = new DataInputStream(audioSrc);
        AudioStream as = new AudioStream(read);
        AudioPlayer.player.start(as);
        AudioPlayer.player.stop(as);
}

在这里的帮助下: Java: download Text to Speech from Google Translate

如果每个word网站都保证拥有包含链接howjsay.com/mp3/word.mp3的mp3文件,那么您只需将网址更改为

URL url = new URL("howjsay.com/mp3/" + word + ".mp3");

答案 2 :(得分:1)

Java Sound可以轻松播放短片,但支持开箱即用的有限数量的格式。默认情况下,它支持的格式由AudioSystem.getAudioFileTypes()&该列表不包括MP3。

缺乏对MP3支持的解决方案是在应用程序的运行时类路径中添加解码器。由于Java Sound在服务提供者接口上工作,因此只需要在类路径上有用即可。可以在mp3plugin.jar中找到MP3解码器。

关于播放MP3的代码,信息的简短来源。只要剪辑很短,页面就足够了。即

import java.net.URL;
import javax.swing.*;
import javax.sound.sampled.*;

public class LoopSound {

    public static void main(String[] args) throws Exception {
        URL url = new URL(
            "http://pscode.org/media/leftright.wav");
        Clip clip = AudioSystem.getClip();
        // getAudioInputStream() also accepts a File or InputStream
        AudioInputStream ais = AudioSystem.
            getAudioInputStream( url );
        clip.open(ais);
        clip.loop(Clip.LOOP_CONTINUOUSLY);
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                // A GUI element to prevent the Clip's daemon Thread
                // from terminating at the end of the main()
                JOptionPane.showMessageDialog(null, "Close to exit!");
            }
        });
    }
}

答案 3 :(得分:0)

如果您对Marek提供的代码有疑问,请确保您符合以下条件:

  1. 使用支持的音频格式,例如16位.wav
  2. 确保您使用的网址实际上是自动播放音频。
  3. 仅仅引用音频文件的下载页面是不够的。它必须是流式传输音频。 YouTube网址无法使用,因为它们是视频。 Audacity是将音频文件转换为兼容的16位.wav文件的好方法,如果您有自己的域/网站,则可以从那里提供指向该文件的直接链接。