【问题标题】:How to “autotune” a record sound with Javascript如何使用 Javascript “自动调整”录制的声音
【发布时间】:2013-06-05 07:42:51
【问题描述】:

感谢 Cordova,我设法像录音机一样录制和播放我的声音。现在我想在我的声音上添加“Autotune”或“Vocoder”效果,我该怎么做?

PS:我在移动设备上工作。

这是录制和播放我的声音的脚本:

<script type="text/javascript" charset="utf-8" src="cordova-1.7.0rc1.js"></script>
<script type="text/javascript" src="jquery-1.7.1.js"></script>

<script type="text/javascript">

    var deviceready = false;
    var mediaVar = null;
    var recordFileName = "recording.wav";
    var status = null;
    var isIOS = false;

    function onBodyLoad()
    {        
        document.addEventListener("deviceready", onDeviceReady, false);
        deviceready = true;
    }

    $(document).ready(function(){
        $("#stopBtn").hide();
        $("#playBtn").hide();

        //validation to check if device is ready is skipped

        $("#recordBtn").click(function(){
            record();                  
        });

        $("#playBtn").click(function(){
            play();
        });

        $("#stopBtn").click(function(){
            stop();
        });
    });

    function record()
    {
        createMedia(function(){
            status = "recording";
            mediaVar.startRecord();
            $("#recordBtn").hide();
            $("#stopBtn").show();
            $("#playBtn").hide();
        },onStatusChange);
    }

    function createMedia(onMediaCreated, mediaStatusCallback){
        if (mediaVar != null) {
            onMediaCreated();
            return;
        }

        if (typeof mediaStatusCallback == 'undefined') 
            mediaStatusCallback = null;

        if (isIOS) {
            //first create the file
            window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem){
                fileSystem.root.getFile(recordFileName, {
                    create: true,
                    exclusive: false
                }, function(fileEntry){
                    log("File " + recordFileName + " created at " + fileEntry.fullPath);
                    mediaVar = new Media(fileEntry.fullPath, function(){
                        log("Media created successfully");
                    }, onError, mediaStatusCallback); //of new Media
                    onMediaCreated();
                }, onError); //of getFile
            }, onError); //of requestFileSystem
        } else //it's Android
        {
            mediaVar = new Media(recordFileName, function(){
                log("Media created successfully");
            }, onError, mediaStatusCallback); 
            onMediaCreated();
        }
    }

    function stop()
    {
        if (mediaVar == null)
            return;

        if (status == 'recording')
        {
            mediaVar.stopRecord();
            log("Recording stopped");
        }
        else if (status == 'playing')
        {
            mediaVar.stop();            
            log("Play stopped");
        } 
        else
        {
            log("Nothing stopped");
        }
        $("#recordBtn").show();
        $("#stopBtn").hide();
        $("#playBtn").show();
        status = 'stopped';
    }

    function play()
    {
        createMedia(function(){
            status = "playing";
            mediaVar.play();    
            $("#recordBtn").hide();
            $("#stopBtn").show();
            $("#playBtn").hide();
        });
    }

    function onStatusChange()
    {
        if (arguments[0] == 4) //play stopped
        {
            $("#recordBtn").show();
            $("#stopBtn").hide();
            $("#playBtn").show();
        } 
    }

    function onSuccess()
    {
        //do nothing
    }

    function onError(err)
    {
        if (typeof err.message != 'undefined')
            err = err.message;
        alert("Error : " + err);
    }

    function log(message)
    {
        if (isIOS)
            console.log(message);
        else
            console.info(message);
    }

    function onDeviceReady()
    {

    }

</script>

【问题讨论】:

    标签: javascript audio cordova record


    【解决方案1】:

    音高检测和操纵(Autotune 是实现它的 Anteres Audio Technology 产品的品牌名称)是一个计算密集型的硬数字信号处理问题 (DSP)。

    DPS Dimension 提供了一个很好的关于音高操作的教程,但它远不是一个完整的解决方案。

    如果没有强大的 DSP 学术背景,您不太可能在这方面取得很大进展。现有的实现是专有的,通常用 C++ 实现。在这个问题领域也有很多专利。 一种选择可能是使用许可组件在服务器端实现音频处理。

    在 Javascript 中实现声码器可能会更幸运 - 复杂性较低,并且有很多公共领域的算法可供尝试。

    【讨论】:

    • 好的,非常感谢!我会尝试实现一个声码器。
    • 或者是否有网络服务可以对 .mp3 应用效果?
    • 我不知道有任何提供这种特殊效果的方法,但这个想法之前肯定有人提出过,而且实施起来并不难。
    • Zplane/sonic api 将单音高校正作为 Web 服务:sonicapi.com/docs/api/process-elastiqueTune
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2016-02-24
    • 1970-01-01
    相关资源
    最近更新 更多