質問編集履歴

3

riku0307

riku0307 score 1

2017/11/30 15:53  投稿

androidでリアルタイムで録音した音声にリバーブをかける
androidでaudiorecord、audiotrackを用いてリアルタイムで録音した音声にリバーブをかけたいと考えています。なので、EnvironmentalReverbクラスを用いようと考えているのですが、後述のプログラムでも効果が現れません。どなたか、詳しい方、アドバイスいただけると幸いです。
また、私自身、やることを断念しましたが、直接音声データにリバーブをかける方法がもしありましたらお願いします。  
```Java
package com.example.audioplayer;
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder.AudioSource;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.media.AudioTrack.Builder;
import android.media.audiofx.PresetReverb;
import android.media.audiofx.EnvironmentalReverb;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.SeekBar.OnSeekBarChangeListener;
import java.nio.ByteBuffer;
public class MainActivity extends Activity {
   AudioRecord audioRec = null;
       Button btn = null;
       boolean bIsRecording = false;
       int bufSize ;
       int samplingRate ;
       private AudioTrack audioTrack;
   private void recodingAndPlay() {
       if (bIsRecording) {
           bIsRecording = false;
       } else {
           // 録音開始
           Log.v("AudioRecord", "startRecording");
           audioRec.startRecording();
           bIsRecording = true;
           // 録音スレッド
           new Thread(new Runnable() {
               @Override
               public void run() {
                                      EnvironmentalReverb mReverb = new EnvironmentalReverb(0,0);
                   mReverb.setDecayHFRatio((short) 1000);
                   mReverb.setDecayTime(10000);
                   mReverb.setDensity((short) 1000);
                   mReverb.setDiffusion((short) 1000);
                   mReverb.setReverbLevel((short) -1000);
                   audioTrack.setAuxEffectSendLevel(1.0f);
                   mReverb.setEnabled(true);
                   audioTrack.attachAuxEffect(mReverb.getId());
                   Log.e("DEBUG","sessionId : " + audioTrack.getAudioSessionId());
                   while (bIsRecording) {
                       audioRec.read(buf,0,buf.length,AudioRecord.READ_NON_BLOCKING);
                                             audioTrack.write(buf, 0, buf.length, AudioTrack.WRITE_NON_BLOCKING);
                       offset += buf.length;
                       if(offset >= bufSize){
                           offset = 0;
                       }
                Log.d("AudioRecord", "read " + buf2.length +
                   " bytes");
       }
       // 録音停止
       Log.v("AudioRecord", "stop");
       audioRec.stop();
   }
}).start();
       }
   }
   public AudioRecord findAudioRecord() {
       int rate = 44100;
               short audioFormat = AudioFormat.ENCODING_PCM_FLOAT;
               short channelConfig = AudioFormat.CHANNEL_IN_MONO;
       try {
                   Log.d("TAG", "Attempting rate " + rate + "Hz, bits: "
                           + audioFormat + ", channel: " + channelConfig);
                   int bufferSize = AudioRecord.getMinBufferSize(rate,
                           channelConfig, audioFormat);
                   if (bufferSize != AudioRecord.ERROR_BAD_VALUE) {
                       // check if we can instantiate and have a success
                       AudioRecord recorder = new AudioRecord(
                               AudioSource.DEFAULT, rate, channelConfig,
                               audioFormat, bufferSize );
                       if (recorder.getState() == AudioRecord.STATE_INITIALIZED)
                       bufSize = bufferSize ;
                       samplingRate = rate;
                       Log.d("TAG2", "buffersize " + bufSize);
                       return recorder;
                   }
               } catch (Exception e) {
                   Log.e("TAG", rate + "Exception, keep trying.", e);
               }
               return null;
           }
           @Override
           protected void onCreate (Bundle savedInstanceState){
                       super.onCreate(savedInstanceState);
                           setContentView(R.layout.activity_main);
// AudioRecordの作成
                           audioRec = findAudioRecord();
               audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, samplingRate,
                       AudioFormat.CHANNEL_OUT_MONO,
                       AudioFormat.ENCODING_PCM_FLOAT, bufSize, AudioTrack.MODE_STREAM);
               audioTrack.play();
               findViewById(R.id.button).setOnClickListener(new OnClickListener() {
                   @Override
                   public void onClick(View v) {
                       recodingAndPlay();
                   }
               });
           }
       }
```
  • Java

    15065questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android Studio

    4107questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

2

riku0307

riku0307 score 1

2017/11/30 14:56  投稿

androidでaudiorecord、audiotrackを用いてリアルタイムで録音した音声にリバーブをかけたいと考えています。なので、EnvironmentalReverbクラスを用いようと考えているのですが、後述のプログラムでも効果が現れません。どなたか、詳しい方、アドバイスいただけると幸いです。
```Java
package com.example.audioplayer;
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder.AudioSource;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.media.AudioTrack.Builder;
import android.media.audiofx.PresetReverb;
import android.media.audiofx.EnvironmentalReverb;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.SeekBar.OnSeekBarChangeListener;
import java.nio.ByteBuffer;
public class MainActivity extends Activity {
AudioRecord audioRec = null;
Button btn = null;
boolean bIsRecording = false;
int bufSize ;
int samplingRate ;
private AudioTrack audioTrack;
private void recodingAndPlay() {
if (bIsRecording) {
bIsRecording = false;
} else {
// 録音開始
Log.v("AudioRecord", "startRecording");
audioRec.startRecording();
bIsRecording = true;
// 録音スレッド
new Thread(new Runnable() {
@Override
public void run() {
EnvironmentalReverb mReverb = new EnvironmentalReverb(0,0);
mReverb.setDecayHFRatio((short) 1000);
mReverb.setDecayTime(10000);
mReverb.setDensity((short) 1000);
mReverb.setDiffusion((short) 1000);
mReverb.setReverbLevel((short) -1000);
audioTrack.setAuxEffectSendLevel(1.0f);
mReverb.setEnabled(true);
audioTrack.attachAuxEffect(mReverb.getId());
Log.e("DEBUG","sessionId : " + audioTrack.getAudioSessionId());
while (bIsRecording) {
audioRec.read(buf,0,buf.length,AudioRecord.READ_NON_BLOCKING);
audioTrack.write(buf, 0, buf.length, AudioTrack.WRITE_NON_BLOCKING);
offset += buf.length;
if(offset >= bufSize){
offset = 0;
}
Log.d("AudioRecord", "read " + buf2.length +
" bytes");
}
// 録音停止
Log.v("AudioRecord", "stop");
audioRec.stop();
}
}).start();
}
}
public AudioRecord findAudioRecord() {
int rate = 44100;
short audioFormat = AudioFormat.ENCODING_PCM_FLOAT;
short channelConfig = AudioFormat.CHANNEL_IN_MONO;
try {
Log.d("TAG", "Attempting rate " + rate + "Hz, bits: "
+ audioFormat + ", channel: " + channelConfig);
int bufferSize = AudioRecord.getMinBufferSize(rate,
channelConfig, audioFormat);
if (bufferSize != AudioRecord.ERROR_BAD_VALUE) {
// check if we can instantiate and have a success
AudioRecord recorder = new AudioRecord(
AudioSource.DEFAULT, rate, channelConfig,
audioFormat, bufferSize );
if (recorder.getState() == AudioRecord.STATE_INITIALIZED)
bufSize = bufferSize ;
samplingRate = rate;
Log.d("TAG2", "buffersize " + bufSize);
return recorder;
}
} catch (Exception e) {
Log.e("TAG", rate + "Exception, keep trying.", e);
}
return null;
}
@Override
protected void onCreate (Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// AudioRecordの作成
audioRec = findAudioRecord();
audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, samplingRate,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_FLOAT, bufSize, AudioTrack.MODE_STREAM);
audioTrack.play();
findViewById(R.id.button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
recodingAndPlay();
}
});
}
}
```
  • Java

    15065questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android Studio

    4107questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

1 本文の修正

riku0307

riku0307 score 1

2017/11/29 14:11  投稿

androidのアプリで信号処理
私は今大学の研究の関係で、android studioでスピーカーのアプリ作成しています。現在の進捗状況は、audiorecord、audiotrackを用いてリアルタイムで録音した音声が再生されるところまで来ています。次は、この音声にリバーブをかけたいと考えています。なので、EnvironmentalReverbクラスを用いようと考えているのですが、後述のプログラムでも効果が現れません。どなたか、詳しい方、androidアプリ開発歴は、研究が始まってからのため、初歩的なところからアドバイスいただけると幸いです。
androidでaudiorecord、audiotrackを用いてリアルタイムで録音した音声にリバーブをかけたいと考えています。なので、EnvironmentalReverbクラスを用いようと考えているのですが、後述のプログラムでも効果が現れません。どなたか、詳しい方、アドバイスいただけると幸いです。
```Java
package com.example.audioplayer;
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder.AudioSource;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.media.AudioTrack.Builder;
import android.media.audiofx.PresetReverb;
import android.media.audiofx.EnvironmentalReverb;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.SeekBar.OnSeekBarChangeListener;
import java.nio.ByteBuffer;
public class MainActivity extends Activity {
   AudioRecord audioRec = null;
       Button btn = null;
       boolean bIsRecording = false;
       int bufSize ;
       int samplingRate ;
       private AudioTrack audioTrack;
   private void recodingAndPlay() {
       if (bIsRecording) {
           bIsRecording = false;
       } else {
           // 録音開始
           Log.v("AudioRecord", "startRecording");
           audioRec.startRecording();
           bIsRecording = true;
           // 録音スレッド
           new Thread(new Runnable() {
               @Override
               public void run() {
                                      EnvironmentalReverb mReverb = new EnvironmentalReverb(0,0);
                   mReverb.setDecayHFRatio((short) 1000);
                   mReverb.setDecayTime(10000);
                   mReverb.setDensity((short) 1000);
                   mReverb.setDiffusion((short) 1000);
                   mReverb.setReverbLevel((short) -1000);
                   audioTrack.setAuxEffectSendLevel(1.0f);
                   mReverb.setEnabled(true);
                   audioTrack.attachAuxEffect(mReverb.getId());
                   Log.e("DEBUG","sessionId : " + audioTrack.getAudioSessionId());
                   while (bIsRecording) {
                       audioRec.read(buf,0,buf.length,AudioRecord.READ_NON_BLOCKING);
                                             audioTrack.write(buf, 0, buf.length, AudioTrack.WRITE_NON_BLOCKING);
                       offset += buf.length;
                       if(offset >= bufSize){
                           offset = 0;
                       }
                Log.d("AudioRecord", "read " + buf2.length +
                   " bytes");
       }
       // 録音停止
       Log.v("AudioRecord", "stop");
       audioRec.stop();
   }
}).start();
       }
   }
   public AudioRecord findAudioRecord() {
       int rate = 44100;
               short audioFormat = AudioFormat.ENCODING_PCM_FLOAT;
               short channelConfig = AudioFormat.CHANNEL_IN_MONO;
       try {
                   Log.d("TAG", "Attempting rate " + rate + "Hz, bits: "
                           + audioFormat + ", channel: " + channelConfig);
                   int bufferSize = AudioRecord.getMinBufferSize(rate,
                           channelConfig, audioFormat);
                   if (bufferSize != AudioRecord.ERROR_BAD_VALUE) {
                       // check if we can instantiate and have a success
                       AudioRecord recorder = new AudioRecord(
                               AudioSource.DEFAULT, rate, channelConfig,
                               audioFormat, bufferSize );
                       if (recorder.getState() == AudioRecord.STATE_INITIALIZED)
                       bufSize = bufferSize ;
                       samplingRate = rate;
                       Log.d("TAG2", "buffersize " + bufSize);
                       return recorder;
                   }
               } catch (Exception e) {
                   Log.e("TAG", rate + "Exception, keep trying.", e);
               }
               return null;
           }
           @Override
           protected void onCreate (Bundle savedInstanceState){
                       super.onCreate(savedInstanceState);
                           setContentView(R.layout.activity_main);
// AudioRecordの作成
                           audioRec = findAudioRecord();
               audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, samplingRate,
                       AudioFormat.CHANNEL_OUT_MONO,
                       AudioFormat.ENCODING_PCM_FLOAT, bufSize, AudioTrack.MODE_STREAM);
               audioTrack.play();
               findViewById(R.id.button).setOnClickListener(new OnClickListener() {
                   @Override
                   public void onClick(View v) {
                       recodingAndPlay();
                   }
               });
           }
       }
```
  • Java

    15065questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android Studio

    4107questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る