2014-07-10 9 views
7

मुझे वॉयस कॉल के इंस्ट्रीम और आउटस्ट्रीम को बदलने की ज़रूरत है।एंड्रॉइड में मांग पर कॉल वॉयस कैसे बदल सकता हूं? (पुरुष को महिला और आदि में बदलें)

उदाहरण के लिए पुरुष से महिला की आवाज बदलें या कार्टून आवाज में मानव आवाज बदलें। ऑन-डिमांड

अगर आप किसी भी विचार या एंड्रॉयड स्रोत कोड है, साझा करें यह

+0

http://docs.oracle.com/javase/tutorial/sound/MIDI-synth.html है। दूसरा तरीका भाषण से पाठ तक और फिर भाषण में पाठ होगा। – Skynet

+0

लेकिन मैं इसे वॉइसकॉल – MiRHaDi

+0

पर रीयलटाइम बदलना चाहता हूं [यह] (http://channel9.msdn.com/coding4fun/articles/Skype-Voice-Changer) ब्याज का हो सकता है। – Skynet

उत्तर

1

आप गूगल ग्लास परियोजना के उपयोग के संदर्भ के रूप में ही कर सकते हैं। यहाँ निकालने \ here

package com.google.android.glass.sample.waveform; 

import android.app.Activity; 
import android.media.AudioFormat; 
import android.media.AudioRecord; 
import android.media.MediaRecorder.AudioSource; 
import android.os.Bundle; 
import android.widget.TextView; 

/** 
* Receives audio input from the microphone and displays a visualization of that data as a waveform 
* on the screen. 
*/ 
public class WaveformActivity extends Activity { 

    // The sampling rate for the audio recorder. 
    private static final int SAMPLING_RATE = 44100; 

    private WaveformView mWaveformView; 
    private TextView mDecibelView; 

    private RecordingThread mRecordingThread; 
    private int mBufferSize; 
    private short[] mAudioBuffer; 
    private String mDecibelFormat; 

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

     mWaveformView = (WaveformView) findViewById(R.id.waveform_view); 
     mDecibelView = (TextView) findViewById(R.id.decibel_view); 

     // Compute the minimum required audio buffer size and allocate the buffer. 
     mBufferSize = AudioRecord.getMinBufferSize(SAMPLING_RATE, AudioFormat.CHANNEL_IN_MONO, 
       AudioFormat.ENCODING_PCM_16BIT); 
     mAudioBuffer = new short[mBufferSize/2]; 

     mDecibelFormat = getResources().getString(R.string.decibel_format); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     mRecordingThread = new RecordingThread(); 
     mRecordingThread.start(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 

     if (mRecordingThread != null) { 
      mRecordingThread.stopRunning(); 
      mRecordingThread = null; 
     } 
    } 

    /** 
    * A background thread that receives audio from the microphone and sends it to the waveform 
    * visualizing view. 
    */ 
    private class RecordingThread extends Thread { 

     private boolean mShouldContinue = true; 

     @Override 
     public void run() { 
      android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_AUDIO); 

      AudioRecord record = new AudioRecord(AudioSource.MIC, SAMPLING_RATE, 
        AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, mBufferSize); 
      record.startRecording(); 

      while (shouldContinue()) { 
       record.read(mAudioBuffer, 0, mBufferSize/2); 
       mWaveformView.updateAudioData(mAudioBuffer); 
       updateDecibelLevel(); 
      } 

      record.stop(); 
      record.release(); 
     } 

     /** 
     * Gets a value indicating whether the thread should continue running. 
     * 
     * @return true if the thread should continue running or false if it should stop 
     */ 
     private synchronized boolean shouldContinue() { 
      return mShouldContinue; 
     } 

     /** Notifies the thread that it should stop running at the next opportunity. */ 
     public synchronized void stopRunning() { 
      mShouldContinue = false; 
     } 

     /** 
     * Computes the decibel level of the current sound buffer and updates the appropriate text 
     * view. 
     */ 
     private void updateDecibelLevel() { 
      // Compute the root-mean-squared of the sound buffer and then apply the formula for 
      // computing the decibel level, 20 * log_10(rms). This is an uncalibrated calculation 
      // that assumes no noise in the samples; with 16-bit recording, it can range from 
      // -90 dB to 0 dB. 
      double sum = 0; 

      for (short rawSample : mAudioBuffer) { 
       double sample = rawSample/32768.0; 
       sum += sample * sample; 
      } 

      double rms = Math.sqrt(sum/mAudioBuffer.length); 
      final double db = 20 * Math.log10(rms); 

      // Update the text view on the main thread. 
      mDecibelView.post(new Runnable() { 
       @Override 
       public void run() { 
        mDecibelView.setText(String.format(mDecibelFormat, db)); 
       } 
      }); 
     } 
    } 
} 
संबंधित मुद्दे