我正在录制男声,当我单击播放按钮时,如何将男声转换为女声并以女声播放。我引用了一些我尝试过的sound pool链接,以通过更改浮动速率来更改声音,但我没有听到女性声音,也没有更改音轨的频率。

这是我的代码:

           soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
            soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
              @Override
              public void onLoadComplete(SoundPool soundPool, int sampleId,
                  int status) {
                loaded = true;
              }
            });
            soundID = soundPool.load(mFileName, 1);


            AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
              float actualVolume = (float) audioManager
                  .getStreamVolume(AudioManager.STREAM_MUSIC);
              float maxVolume = (float) audioManager
                  .getStreamMaxVolume(AudioManager.STREAM_MUSIC);
              float volume = actualVolume / maxVolume;
             /* if (loaded) {
                  iv.setImageDrawable(getResources().getDrawable(R.drawable.palyrec));
                  soundPool.play(soundID, volume, volume, 1, 0, 1.8f);
                  Log.e("Test", "Played sound");
              }*/
              int streamID = -1;
              do {

                  iv.setImageDrawable(getResources().getDrawable(R.drawable.palyrec));
                  streamID = soundPool.play(soundID, volume, volume, 1, 0, 1.7f);
                  Log.e("Test", "Played sound");


              } while(streamID==0);


更改频率代码:
       Integer [] freqset = {11025,16000,22050,44100};

   File file = new File(Environment.getExternalStorageDirectory(), "test.pcm");

    int shortSizeInBytes = Short.SIZE/Byte.SIZE;

    int bufferSizeInBytes = (int)(file.length()/shortSizeInBytes);
    short[] audioData = new short[bufferSizeInBytes];

    try {
        InputStream inputStream = new FileInputStream(file);
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
        DataInputStream dataInputStream = new DataInputStream(bufferedInputStream);

        int i = 0;
        while(dataInputStream.available() > 0){
            audioData[i] = dataInputStream.readShort();
            i++;
        }

        dataInputStream.close();

        int sampleFreq = (Integer)spFrequency.getSelectedItem();

        AudioTrack audioTrack = new AudioTrack(
                AudioManager.STREAM_MUSIC,
                sampleFreq,
                AudioFormat .CHANNEL_CONFIGURATION_MONO,
                AudioFormat.ENCODING_PCM_16BIT,
                bufferSizeInBytes,
                AudioTrack.MODE_STREAM);

       audioTrack.play();


audioTrack.write(audioData,0,bufferSizeInBytes);

如何在Android中转换为女性声音?

最佳答案

我相信对频率一词可能会有误解:采样率频率与感知的基音频率不同。

更改采样率频率将同时改变音调和时间,就像播放录音带的速度更快(对于那些足够记住的老者:-))。

向上改变音调频率不会使其听起来更快,但是您会很快注意到引入的数字伪像(花栗鼠声音)。

向下走时听起来可能会更好(如Luka的视频中所示)。

但是,在两种情况下,您都必须更改音高,并且会产生一些怪异的副作用。

最接近的将是通过专门用于协调或调整签名声带的软件获得的结果。这些软音会看着共振峰,并且不会改变它们来改变音高。

例如。:
https://documentation.apple.com/en/logicstudio/effects/index.html#chapter=10%26section=3%26tasks=true

最有名的软件之一:
http://www.celemony.com/en/melodyne/what-is-melodyne

我认为在这种情况下,您可能需要稍微改变一些声音共振峰(其中包含我们的大脑用来识别某人声音的某些特征)和整体音高,但要独立进行。

还要注意,共振峰已编号(F0,F1,F2,F3,...),并且F1和F2允许我们分辨出元音之间的差异。 http://home.cc.umanitoba.ca/~krussll/phonetics/acoustic/formants.html

正如Merlevede所言,我认为很难提出一种“万能的”算法。

Afaict,android上没有库正在执行此操作...

10-08 18:11