Android录制的声音变形或操纵为有趣的声音

Android录制的声音变形或操纵为有趣的声音,android,audio,voice,morphing,Android,Audio,Voice,Morphing,在Android中,有哪些选项可以将录制的声音变形为有趣的音调?iPhone可能有这样的选项:我们是否有类似的android库,可以帮助从录制的文件中创建有趣的声音?要求是在“会说话的汤姆”/“花栗鼠”(如果这有助于理解上下文的话)这句话中创造一些东西 如果没有现成的库,还有什么其他方法可以做到这一点呢?移动设备上的大多数语音调制应用程序目前似乎都在使用不同的音调调制和一些额外的音频效果(请注意,语音变形是一个更大的问题需要解决) 在Android上,“AudioTrack”可帮助您调整音高设置

在Android中,有哪些选项可以将录制的声音变形为有趣的音调?iPhone可能有这样的选项:我们是否有类似的android库,可以帮助从录制的文件中创建有趣的声音?要求是在“会说话的汤姆”/“花栗鼠”(如果这有助于理解上下文的话)这句话中创造一些东西


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

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


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

一个选项是使用AudioTrack。它是从API 3开始提供的,并且使用非常广泛。它将帮助您修改要失真的音频文件的频率,从而修改音高。更高的音高会让你听到你想要的花栗鼠般的声音

然而,由于年龄太大,AudioTrack可能很难为您实现。试试Android的声音池api。它灵活,一次可以播放数十种声音,并且可以让您非常轻松地修改音高/频率

下面是我如何测试它(它的工作原理):


尝试在应用程序中嵌入纯数据。纯数据非常棒,学习起来也很有趣。试一试,它很容易改变声音。

我们可以利用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)

    }
/**
*函数来执行FFMPEG查询
*/
私密乐趣EXCEUTEFMPEG(cmd:Array){
FFmpeg.execute(cmd)
val rc=FFmpeg.getLastReturnCode()
val output=FFmpeg.getLastCommandOutput()
if(rc==返回\u代码\u成功){
Log.i(“GetInfo”,“命令执行成功完成”)
hideProgress()
IsEffectAddedDonce=true
开始()
}else if(rc==返回\u代码\u取消){
Log.i(“GetInfo”,“命令执行被用户取消”)
}否则{
日志(
“获取信息”,
字符串格式(
“命令执行失败,rc=%d,输出=%s。”,
rc,
输出
)
)
}
}
/**
*用于像收音机一样播放音频的功能
*/
私人娱乐电台(fileName1:String,fileName2:String){
showProgress()
玩家?.stop()
val cmd=arrayOf(
“-y”,
“-我”,
文件名1,
“-af”,
“atempo=1”,
文件名2
)//无线电
exceuteffmeg(cmd)
}
/**
*用于像花栗鼠一样播放音频的功能
*/
私人娱乐花栗鼠(fileName1:String,fileName2:String){
showProgress()
玩家?.stop()
val cmd=arrayOf(
“-y”,
“-我”,
文件名1,
“-af”,
“asetrate=22100,atempo=1/2”,
文件名2
)//花栗鼠
exceuteffmeg(cmd)
}
/**
*用于像机器人一样播放音频的功能
*/
私人趣味游戏机器人(fileName1:String,fileName2:String){
showProgress()
玩家?.stop()
val cmd=arrayOf(
“-y”,
“-我”,
文件名1,
“-af”,
“asetrate=11100,atempo=4/3,atempo=1/2,atempo=3/4”,
文件名2
)//机器人
exceuteffmeg(cmd)
}
/**
*用于像洞穴一样播放音频的函数
*/
private fun playCave(文件名1:String,文件名2:String){
showProgress()
玩家?.stop()
val cmd=arrayOf(
“-y”,
“-我”,
文件名1,
“-af”,
“aecho=0.8:0.9:1000:0.3”,
文件名2
)//洞穴
exceuteffmeg(cmd)
}
有关更多详细信息,请参阅

请在下面的网站上查看更多信息,这些信息将帮助我们处理其他影响


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

据我所知,这方面没有图书馆。你必须自己编写代码。StackOverflow不会给你现成的代码,只会给你一些想法。@Leandros+1。我知道有些C库可以通过NDK使用。这显然很难做到,但这是可能的。到目前为止,android上有大量的语音变形应用程序可用,你的意思是说可能所有这些应用程序都编写了自己的语音变形逻辑?这项任务很复杂,但相当标准,所以我仍然对可用库的想法持开放态度。但是,是的,做一些更定制的事情,可能还需要从头开始编码。在任何情况下,我都在寻找来自各个方向的见解。这很管用,感谢它节省了我的时间,但也可以帮助额外的,如何添加其他效果,如何找到哪些效果需要进行分析,或者哪些效果需要进行分析。嗨@KeyurNimavat,很高兴听到这个答案帮助了你。我已经用链接更新了答案,这将帮助您获得必要的信息。
/**
 * 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)

    }