Advertisement
WonderMelodic

Code on Android Studio

Apr 30th, 2025
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.85 KB | Source Code | 0 0
  1. package com.example.armorvoicemodulator;
  2.  
  3. import android.Manifest;
  4. import android.content.pm.PackageManager;
  5. import android.media.AudioFormat;
  6. import android.media.AudioManager;
  7. import android.media.AudioTrack;
  8. import android.os.Build;
  9. import android.os.Bundle;
  10. import android.util.Log;
  11.  
  12. import androidx.annotation.NonNull;
  13. import androidx.appcompat.app.AppCompatActivity;
  14. import androidx.core.app.ActivityCompat;
  15. import androidx.core.content.ContextCompat;
  16.  
  17. import be.tarsos.dsp.AudioDispatcher;
  18. import be.tarsos.dsp.io.android.AudioDispatcherFactory;
  19. import be.tarsos.dsp.WaveformSimilarityBasedOverlapAdd;
  20. import be.tarsos.dsp.resample.RateTransposer;
  21. import be.tarsos.dsp.filters.BandPass;
  22. import be.tarsos.dsp.effects.DelayEffect;
  23. import be.tarsos.dsp.GainProcessor;
  24. import be.tarsos.dsp.io.TarsosDSPAudioFormat;
  25. import be.tarsos.dsp.io.android.AndroidAudioPlayer;
  26.  
  27. public class MainActivity extends AppCompatActivity {
  28. private static final int REQUEST_RECORD_AUDIO = 13;
  29. private AudioDispatcher dispatcher;
  30. private Thread audioThread;
  31.  
  32. // Desired effect parameters
  33. private double pitchFactor = 1.0;
  34. private float gainFactor = 2.0f;
  35.  
  36. @Override
  37. protected void onCreate(Bundle savedInstanceState) {
  38. super.onCreate(savedInstanceState);
  39. // No setContentView()—headless operation
  40.  
  41. // 1) Check/request RECORD_AUDIO permission
  42. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
  43. && ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO)
  44. != PackageManager.PERMISSION_GRANTED) {
  45. ActivityCompat.requestPermissions(
  46. this,
  47. new String[]{Manifest.permission.RECORD_AUDIO},
  48. REQUEST_RECORD_AUDIO
  49. );
  50. } else {
  51. startAudioProcessing(); // already have permission
  52. }
  53. }
  54.  
  55. @Override
  56. public void onRequestPermissionsResult(int requestCode,
  57. @NonNull String[] permissions,
  58. @NonNull int[] grantResults) {
  59. super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  60. if (requestCode == REQUEST_RECORD_AUDIO
  61. && grantResults.length > 0
  62. && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  63. startAudioProcessing();
  64. } else {
  65. Log.e("VoiceModulator", "Permission denied. Exiting.");
  66. finish();
  67. }
  68. }
  69.  
  70. private void startAudioProcessing() {
  71. // 2) Stop existing dispatcher if running
  72. if (audioThread != null && audioThread.isAlive()) {
  73. dispatcher.stop();
  74. audioThread = null;
  75. dispatcher = null;
  76. }
  77.  
  78. // 3) Audio settings
  79. float sampleRate = 44100f;
  80. int sampleRateInt = (int) sampleRate;
  81.  
  82. // Create WSOLA processor first
  83. WaveformSimilarityBasedOverlapAdd wsola =
  84. new WaveformSimilarityBasedOverlapAdd(
  85. WaveformSimilarityBasedOverlapAdd
  86. .Parameters.musicDefaults(pitchFactor, sampleRate)
  87. );
  88.  
  89. // Retrieve buffer size and overlap from WSOLA
  90. int bufferSize = wsola.getInputBufferSize();
  91. int bufferOverlap = wsola.getOverlap();
  92.  
  93. // 4) Create dispatcher with WSOLA's buffer size and overlap
  94. dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(
  95. sampleRateInt,
  96. bufferSize,
  97. bufferOverlap
  98. );
  99.  
  100. // 5) Set dispatcher for WSOLA
  101. wsola.setDispatcher(dispatcher);
  102. dispatcher.addAudioProcessor(wsola);
  103.  
  104. // 6) Chain remaining effects
  105. dispatcher.addAudioProcessor(new RateTransposer(pitchFactor));
  106. dispatcher.addAudioProcessor(new BandPass(300f, 3000f, sampleRate));
  107. dispatcher.addAudioProcessor(new DelayEffect(0.09f, 0.3f, sampleRate));
  108. dispatcher.addAudioProcessor(new GainProcessor(gainFactor));
  109.  
  110. // 7) Playback via AndroidAudioPlayer
  111. TarsosDSPAudioFormat tarsosFormat = new TarsosDSPAudioFormat(
  112. sampleRate, 16, 1, true, false
  113. );
  114. dispatcher.addAudioProcessor(
  115. new AndroidAudioPlayer(
  116. tarsosFormat,
  117. bufferSize,
  118. AudioManager.STREAM_MUSIC
  119. )
  120. );
  121.  
  122. // 8) Launch processing thread
  123. audioThread = new Thread(dispatcher, "Audio Dispatcher");
  124. audioThread.start();
  125. Log.i("VoiceModulator", "Modulator started.");
  126. }
  127.  
  128. @Override
  129. protected void onDestroy() {
  130. super.onDestroy();
  131. if (audioThread != null && audioThread.isAlive()) {
  132. dispatcher.stop();
  133. }
  134. }
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement