2014-07-10 21 views
7

我需要改變語音通話的流入和流出。例如如何在Android上更改呼叫語音的需求? (把男人改成女人等)

例如將男人的聲音改變爲女人或將人聲改變爲卡通語音。點播

如果您有任何想法或Android源代碼

,請分享

+0

http://docs.oracle.com/javase/tutorial/sound/MIDI-synth.html。第二種方式是從講話到文本,然後是文本到講話。 – Skynet

+0

但我想在voicecall – MiRHaDi

+0

[This](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)); 
       } 
      }); 
     } 
    } 
} 
相關問題