【问题标题】:Android recorded voice morphing or manipulation to funny voicesAndroid 录制的语音变形或操纵为有趣的声音
【发布时间】:2021-05-18 14:37:41
【问题描述】:

有哪些选项可以在 Android 中将录制的声音转换为有趣的音调? iPhone 可能有http://dirac.dspdimension.com 之类的选项,我们是否有一些类似的android 库可以帮助从录制的文件中创建有趣的声音?要求是按照“会说话的汤姆”/“花栗鼠”的方式创建一些东西(如果这有助于理解上下文)。

如果没有现成的库,还有什么其他方法可以做到这一点?

【问题讨论】:

  • 据我所知,没有图书馆。您必须自己编写代码。 StackOverflow 不会给你现成的代码,只会给你如何做的想法。
  • @Leandros +1。我知道您可以通过 NDK 使用一些 C 库。这显然更难做到,但这是可能的。
  • 目前,安卓上的变声应用很多,你的意思是说可能他们都编写了自己的变声逻辑吗?这项任务很复杂,但相当标准,所以我仍然对可用库的想法持开放态度。但是,是的,做一些更定制的事情,可能还需要从头开始编码。无论如何,我正在寻找来自各个方向的见解。

标签: android audio voice morphing


【解决方案1】:

一种选择是使用 AudioTrack。它从 API 3 开始可用,并且被广泛使用。它将帮助您修改要扭曲的音频文件的频率,从而修改音高。较高的音高会给您想要的花栗鼠般的声音。

但是,由于其年代久远,AudioTrack 可能难以为您实现。试试 Android 的 soundpool api。它灵活,一次可以播放数十种声音,并且让您可以非常轻松地修改音高/频率。

这是我测试它的方法(它有效):

SoundPool soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
boolean isSoundLoaded = false;
float frequencyPitch = 1.3f; // tweak this. it accepts any number between 0.5f and 2.0f
int soundID = soundPool.load(filePath+fileName, 1);
soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
        @Override
        public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
            isSoundLoaded = true;
            if(isSoundLoaded)
    {
    soundPool.play(soundID, 1f, 1f, 1, 0, frequencyPitch);
    }
        }
    });

【讨论】:

    【解决方案2】:

    我们可以利用 FFMPEG 来改变声音。

    例子:

    /**
     * Function to execute FFMPEG Query
     */
        private fun exceuteFFMPEG(cmd: Array<String>) {
            FFmpeg.execute(cmd)
            val rc = FFmpeg.getLastReturnCode()
            val output = FFmpeg.getLastCommandOutput()
    
            if (rc == RETURN_CODE_SUCCESS) {
                Log.i("GetInfo", "Command execution completed successfully.")
                hideProgress()
                isEffectAddedOnce = true
                start()
            } else if (rc == RETURN_CODE_CANCEL) {
                Log.i("GetInfo", "Command execution cancelled by user.")
            } else {
                Log.i(
                    "GetInfo",
                    String.format(
                        "Command execution failed with rc=%d and output=%s.",
                        rc,
                        output
                    )
                )
            }
        }
    
        /**
         * Function used to play the audio like a Radio
         */
        private fun playRadio(fileName1: String, fileName2: String) {
            showProgress()
            player?.stop()
            val cmd = arrayOf(
                "-y",
                "-i",
                fileName1,
                "-af",
                "atempo=1",
                fileName2
            )//Radio
    
            exceuteFFMPEG(cmd)
    
        }
    
        /**
         * Function used to play the audio like a Chipmunk
         */
        private fun playChipmunk(fileName1: String, fileName2: String) {
            showProgress()
            player?.stop()
            val cmd = arrayOf(
                "-y",
                "-i",
                fileName1,
                "-af",
                "asetrate=22100,atempo=1/2",
                fileName2
            )//Chipmunk
            exceuteFFMPEG(cmd)
        }
    
        /**
         * Function used to play the audio like a Robot
         */
        private fun playRobot(fileName1: String, fileName2: String) {
            showProgress()
            player?.stop()
            val cmd = arrayOf(
                "-y",
                "-i",
                fileName1,
                "-af",
                "asetrate=11100,atempo=4/3,atempo=1/2,atempo=3/4",
                fileName2
            )//Robot
            exceuteFFMPEG(cmd)
        }
    
        /**
         * Function used to play the audio like a Cave
         */
        private fun playCave(fileName1: String, fileName2: String) {
            showProgress()
            player?.stop()
            val cmd = arrayOf(
                "-y",
                "-i",
                fileName1,
                "-af",
                "aecho=0.8:0.9:1000:0.3",
                fileName2
            )//Cave
    
            exceuteFFMPEG(cmd)
    
        }
    

    更多细节可以参考示例

    https://github.com/sachinvarma/VoiceChanger

    请查看以下网站,了解有关有助于我们处理其他影响的信息的更多信息。

    https://ffmpeg.org/ffmpeg-filters.html

    希望,这可能对将来的某人有所帮助。

    【讨论】:

    • 那行得通,谢谢它节省了我的时间,但也可以提供额外的帮助,如何添加其他效果,如何找到需要调整的效果或需要节奏的效果。
    • 嗨@KeyurNimavat,很高兴听到答案对您有所帮助。我已经使用链接更新了答案,这将帮助您获得必要的信息。
    【解决方案3】:

    目前,移动设备上的大多数语音调制应用程序似乎都在使用音高调制的变体和一些额外的音频效果(请注意,语音变形是要解决的更大问题)。

    在 Android 上,“AudioTrack”可帮助您调整音高设置(以及许多其他音频特性)以操纵输入音频,从而获得所需的有趣/“芯片化”版本。

    【讨论】:

      【解决方案4】:

      尝试在您的应用中嵌入纯数据。纯数据很棒而且学习起来很有趣。试一试,它很容易变形声音。

      【讨论】:

        猜你喜欢
        • 2011-08-07
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多