java擷取麥實現語音交談

來源:互聯網
上載者:User

java中TargetDataLine 介面提供從目標資料行的緩衝區讀取所捕獲資料的方法,

SourceDataLine 介面提供將音頻資料寫入資料行的緩衝區中的方法。

如從音頻擷取裝置擷取其資料的資料行。

調用start方法開始執行操作。

調用stop方法停止。


package chat;</p><p>import javax.swing.JTextArea;<br />/**<br /> * @author Hello<br /> * 把那幾個sender、receiver又封裝了一下,供GUI調用<br /> */<br />public class Chat {</p><p>private MessageReceiver massageReceiver;<br />private MessageSender massageSender;<br />private SoundReceiver soundReceiver;<br />private SoundSender soundSender;</p><p>public Chat(JTextArea textArea){<br />massageSender = new MessageSender("231.0.0.1",10000,textArea);<br />massageReceiver = new MessageReceiver("231.0.0.1",10000,1024,textArea);<br />soundSender = new SoundSender("231.0.0.1",10001,1024);<br />soundReceiver = new SoundReceiver("231.0.0.1",10001,1024);<br />massageReceiver.start();<br />}</p><p>public void send(String message){<br />massageSender.send(message);<br />}</p><p>public void soundStart(){<br />soundReceiver.start();<br />soundSender.start();<br />}</p><p>public void soundStop(){<br />soundReceiver.stop();<br />soundSender.stop();<br />}<br />}<br />
package chat;</p><p>import javax.sound.sampled.*;<br />/**<br /> * @author Hello<br /> * 放音部分<br /> */<br />public class SoundSender extends UDPSender implements Runnable{</p><p>private TargetDataLine line;<br />private int bufferLength;<br />private Thread thread;<br />private boolean isStart;</p><p>public SoundSender(String groupAddress, int port, int bufferLength){<br />super(groupAddress,port);<br />AudioFormat format =new AudioFormat(8000,16,2,true,true);<br /> DataLine.Info info = new DataLine.Info(TargetDataLine.class,format);<br /> try {<br /> line = (TargetDataLine) AudioSystem.getLine(info);<br />line.open(format, line.getBufferSize());<br />} catch (LineUnavailableException e) {<br />e.printStackTrace();<br />}<br />this.bufferLength = bufferLength;<br />isStart = false;<br />}</p><p>public void run() {<br />byte[] buffer = new byte[bufferLength];<br />while(isStart&&!thread.isInterrupted()){<br />line.read(buffer, 0,buffer.length);//接受麥的資料寫入buffer<br />send(buffer);<br />}<br />}</p><p>public void start(){<br />if(thread == null || !thread.isAlive()){<br />thread = new Thread(this);<br />line.start();<br />thread.start();<br />isStart = true;<br />}<br />}</p><p>public void stop(){<br />thread.interrupt();<br />line.stop();<br />isStart = false;<br />}</p><p>}<br />
package chat;</p><p>import javax.sound.sampled.*;<br />/**<br /> *<br /> */<br />public class SoundReceiver extends UDPReceiver implements Runnable{</p><p>private SourceDataLine line;<br />private Thread thread;<br />private boolean isStart;</p><p>public SoundReceiver(String groupAddress,<br />int port,<br />int bufferSize){<br />super(groupAddress, port, bufferSize);<br />AudioFormat format =new AudioFormat(8000,16,2,true,true);<br />DataLine.Info info = new DataLine.Info(SourceDataLine.class,format);<br /> try {<br /> line = (SourceDataLine) AudioSystem.getLine(info);<br />line.open(format, 10240);<br /> } catch (LineUnavailableException e) {<br /> e.printStackTrace();<br /> }<br /> }</p><p>public void run() {<br />while(isStart&&!thread.isInterrupted()){<br />byte[] data = super.receive();<br />line.write(data, 0, data.length);//將data的資料轉化為音頻<br />}<br />}</p><p>public void start(){<br />if(thread == null || !thread.isAlive()){<br />thread = new Thread(this);<br />line.start();<br />isStart = true;<br />contect();<br />thread.start();<br />}<br />}</p><p>public void stop(){<br />thread.interrupt();<br />line.stop();<br />isStart = false;<br />close();<br />}<br />}<br />
package chat;</p><p>import java.io.IOException;<br />import java.net.*;</p><p>/**<br /> * @author chch87<br /> * 發送UDP報文的基類,擴充出MessageSender和SoundSender<br /> */</p><p>public class UDPSender {</p><p>protected MulticastSocket s;<br />protected InetAddress group;<br />protected int port;<br />protected DatagramPacket dgp;</p><p>public UDPSender(String groupAddress, int port){<br />this.port = port;<br />try {<br />s = new MulticastSocket();<br />group = InetAddress.getByName (groupAddress);//group一定要是個組播組!如231.0.0.1<br />} catch (IOException e) {<br />e.printStackTrace();<br />}<br />dgp = new DatagramPacket (new byte[0], 0, group, port);<br />}</p><p>public void close(){<br />if(s != null)<br />s.close ();<br />}</p><p>protected void send(byte[] buffer){<br />dgp.setData (buffer);<br />dgp.setLength (buffer.length);<br />try {<br />s.send (dgp);<br />} catch (IOException e) {<br />e.printStackTrace();<br />}<br />}<br />}<br />
package chat;</p><p>import java.io.IOException;<br />import java.net.*;</p><p>/**<br /> * @author chch87<br /> * 接受UDP報文的基類,擴充出MessageReceiver和SoundReceiver<br /> */<br />public class UDPReceiver{</p><p>protected MulticastSocket s;<br />protected InetAddress group;<br />protected byte[] buffer;<br />protected DatagramPacket dgp;<br />protected int port;<br />protected int bufferSize;<br />protected boolean isClose;</p><p>public UDPReceiver(String groupAddress, int port, int bufferSize){<br />try {<br />s = new MulticastSocket(port);<br />group = InetAddress.getByName(groupAddress);//group一定要是個組播組!如231.0.0.1<br />s.joinGroup (group);<br />//s.setLoopbackMode(true);//在區域網路測試時,可以將禁止回調開啟<br />} catch (IOException e) {<br />e.printStackTrace();<br />}<br />buffer = new byte[bufferSize];<br />dgp = new DatagramPacket (buffer, bufferSize);<br />isClose = false;<br />this.port = port;<br />this.bufferSize = bufferSize;<br />}</p><p>public void close(){<br />if(s != null && group != null){<br />try {<br />s.leaveGroup (group);<br />s.close ();<br />} catch (IOException e) {<br />e.printStackTrace();<br />}<br />isClose = true;<br />}<br />}</p><p>public void contect(){<br />if(isClose){<br />try {<br />s = new MulticastSocket(port);<br />s.joinGroup (group);<br />} catch (IOException e) {<br />e.printStackTrace();<br />}<br />buffer = new byte[bufferSize];<br />dgp = new DatagramPacket (buffer, bufferSize);<br />isClose = false;<br />}<br />}</p><p>protected byte[] receive(){<br />try {<br />s.receive (dgp);<br />} catch (IOException e) {<br />e.printStackTrace();<br />}<br />return buffer;<br />}</p><p>protected int getDgpLength(){<br />return dgp.getLength();<br />}</p><p>protected String getIP(){<br />return dgp.getAddress().toString();<br />}</p><p>}<br />

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.