録音して再生する

Javaを使って音声を取得して、再び再生するプログラムを作ります。

具体的には

  1. 録音する時間を設定する[秒]
  2. 録音するデータを再生する

という感じです。

package test;

import javax.sound.sampled.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
public class Hello extends JFrame
{
    private JLabel lb;
    private JTextField tf;
     
    public static void main(String[] args)
    {
        Hello hl=new Hello();
    }
    public Hello()
    {
        super("録音再生ソフト");
         
        lb=new JLabel("録音時間を入力してください[秒]");
        tf=new JTextField();
         
        add(lb,BorderLayout.NORTH);
        add(tf,BorderLayout.SOUTH);
         
        tf.addActionListener(new SampleActionListener());
         
        setSize(400,100);
        setVisible(true);
    }
    class SampleActionListener implements ActionListener
    {
    	
        //テキストフィールドでEnterを押されたさいの処理
        //1秒、入力された周波数の音を流す
        public void actionPerformed(ActionEvent e)
        {
            //テキストの値が正常か調べる
            JTextField tmp=(JTextField)e.getSource();
            int a;
            try{
                a=Integer.parseInt(tmp.getText());
            }catch(Exception er){
                System.out.println("error:"+er);
                return;
            }
            try{
            	//録音する*************************************************************
            	System.out.println("");
    			//44100Hz,8bit,モノラル,値は正負型,リトルエンディアン
    			AudioFormat linear=new AudioFormat(44100,8,1,true,false);
    			DataLine.Info info=new DataLine.Info(TargetDataLine.class,linear);
    			TargetDataLine target=(TargetDataLine)AudioSystem.getLine(info);
    			target.open(linear);
    			target.start();
    			AudioInputStream stream=new AudioInputStream(target);
    			
    			//データの取得
    			byte[] data=new byte[44100*8/8*1*a];
    			stream.read(data,0,data.length);
    			
    			//終了
    			target.stop();
    			target.close();
                 
    			//再生する*************************************************************
    			System.out.println("再生開始");
                AudioFormat frmt=new AudioFormat(44100,8,1,true,false);
                    //1秒あたりのサンプル数は44100個、
                    //音のビット数は8bit=256、
                    //チャネル数は1、
                    //値は正負型、
                    //bigEndianはfalse=リトルエンディアン
                DataLine.Info info2=new DataLine.Info(Clip.class,frmt);
                Clip clip=(Clip)AudioSystem.getLine(info2);
                clip.open(frmt,data,0,data.length);
                //再生を開始する
                clip.start();
                //再生が終わるまでループする
                while(clip.isRunning()){
                    Thread.sleep(100);
                }
                
                System.out.println("終了");
            }catch(Exception er){
                System.out.println("error:"+er);
            }
        }
    }
}

基本的には再生も録音も手順は同じです。まず

AudioFormat linear=new AudioFormat(44100,8,1,true,false);

で、録音の仕方を設定します。44100Hzで、8bit、モノラルで出力は正負型です。

あとは

TargetDataLine target=(TargetDataLine)AudioSystem.getLine(info);
target.open(linear);
target.start();
AudioInputStream stream=new AudioInputStream(target);

として

byte[] data=new byte[44100*8/8*1*a];
stream.read(data,0,data.length);

でデータを取得します。これにより、dataにデータを取得できます。この値を解析することで、音声の性質を調べたり、音声を変調できたりします。

そして、終わるときは

target.stop();
target.close();

としておわります。あとは、前回紹介した方法で再生して終わりです。

 

著者:安井 真人(やすい まさと)