2016年4月4日月曜日

AndroidでMediaRecorder、MediaPlayerを使う

目次へ



声を録音したら、すぐにその声で返事をしてくれるアプリを作りたかったので、 まずは、録音と再生のしかたを、忘れないようにまとめておきます。
今後、これを変更して、「こんにちは」というと、ちょっと違う声で「こんにちは」と 同じ言葉をしゃべってくれるアプリをつくりたいのですが、まだ、いろいろわからないことだらけです。


■■■■音声の録音と再生■■■■

録音はMediaRecorder、再生はMediaPlayerを使います。
下のような画面が表示され、開始ボタンで録音開始、終了ボタンで録音終了、再生ボタンで今録音したものが再生されます。




import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.View;
import android.widget.TextView;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    private boolean isRecording = false;
    private TextView text;
    private MediaRecorder recorder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

 //textは説明を表示しているTextViewです
        text = (TextView) findViewById(R.id.text1);
    }
    //-------- 開始ボタンを押したときの処理
    public void onStart(View view) {
        if (isRecording) return;

        //-------- 保存先 「内部ストレージ\test.3gp」ができる
        String path = Environment.getExternalStorageDirectory() + "/test.3gp";

        //-------- Recorder作成
        recorder = new MediaRecorder();
        //-------- オーディオソースをマイクとする
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        //-------- ファイルのフォーマットを3GPPとする
        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        //-------- エンコーダをデフォルトとする
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
        //-------- 出力先ファイル名指定
        recorder.setOutputFile(path);

        //-------- レコーディング
        try {
        //-------- 録音開始するには prepare,startを呼び出す
            recorder.prepare();
            recorder.start();
            isRecording = true;
            text.setText("isRecording");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //-------- 終了ボタンを押したときの処理
    public void onStop(View view) {
        if (!isRecording) {
            text.setText("録音中ではありません");
            return;
        }
        //-------- 終了には stop,reset,releaseを呼び出す
        recorder.stop();
        recorder.reset();
        recorder.release();
        isRecording = false;
        text.setText("録音終了");
    }
    //-------- 再生ボタンを押したときの処理
    public void onPlay(View view) {
        VoicePlayer player = new VoicePlayer();
        player.play();
    }
}





import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Environment;
import android.widget.TextView;
import java.io.IOException;

public class VoicePlayer implements MediaPlayer.OnCompletionListener {
    private MediaPlayer player = new MediaPlayer();
    private String path;

    public VoicePlayer() {
        //-------- 再生が終わった時のリスナを設定
        player.setOnCompletionListener(this);
        //-------- 再生ボリューム 左、右を0.0f~1.0fで設定
        player.setVolume(1.0f, 1.0f);
        path = Environment.getExternalStorageDirectory() + "/test.3gp";
    }

    //-------- 再生
    public void play() {
        try {
            player.setDataSource(path);
            //-------- 再生するには、prepare、startを呼び出す
            player.prepare();
            player.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //-------- 再生が終わった時に呼び出される
    public void onCompletion(MediaPlayer mp) {
        //-------- 終了したら、stop、releaseを呼び出す
        player.stop();
        player.release();
    }
}




にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

1 件のコメント:

  1. はじめまして。EaseUS SotwareのTeiと申します。
    メールアドレスなどのご連絡先をいただけませんでしょうか。
    弊社の製品レビューのご執筆をお願いしたいんですが…
    恐縮ですが、メルアド:teiisyou@easeus.comまでご連絡いただけますでしょうか。

    お手数ですが、ご覧になったら、このコメントを削除していただけませんか。

    返信削除