introlab / odas_web

A desktop visualization GUI for the ODAS library
MIT License
145 stars 55 forks source link

How to feed audio to odas_web #31

Closed valkjsaaa closed 5 years ago

valkjsaaa commented 5 years ago

I have built odas_web from master and odascore from https://github.com/introlab/odas/tree/phoenix .

However, just specify the core and the config path in the UI and hit start didn't do anything. I suspect that it's because odas core haven't received any audio input. I wonder where should I specify audio input to the odas core?

Thanks!

GodCed commented 5 years ago

Hi @valkjsaaa,

First you must use the master branch version of ODAS with ODAS Studio (odas_web). Phoenix changed the ODAS socket management from client to server, so it can't connect with ODAS Studio anymore.

You can then follow the ODAS Studio ODAS configuration instructions to set the proper interfaces in ODAS.

Nonikka commented 5 years ago

hi, you need to hit odas_web->lunch, terminal would show like this:

server listening to {"address":"::","family":"IPv6","port":10000}
server listening to {"address":"::","family":"IPv6","port":9000}
server listening to {"address":"::","family":"IPv6","port":9001}
received launch command
/home/nonikka/Downloads/code/odas_xiongyihui/odas_builded/bin/odaslive
/home/nonikka/Downloads/code/odas_xiongyihui/odas_builded/config/odaslive/respeaker_usb_4_mic_array_gui.cfg

then run your core ues like this: ./odaslive -c ../config/odaslive/respeaker_usb_4_mic_arrayui.cfg of courese, your config file should modify by your self. then you will see in last terminal:

new client connection from ::ffff:127.0.0.1:38232
new client connection from ::ffff:127.0.0.1:45564
new client connection from ::ffff:127.0.0.1:43554

if interest, this is my config file.(I use old version, so it is .cfg,not json)

# Configuration file for ReSpeaker USB 4 Mic Array (ReSpeaker USB Mic Array v2.0)

version = "2.1";

# Raw

raw: 
{

    fS = 16000;
    hopSize = 128;
    nBits = 16;
    nChannels = 6; 

    # Input with raw signal from microphones
    interface: {
        type = "soundcard";
        card = 1;
        device = 0;
    }

}

# Mapping

mapping:
{

    map: (2, 3, 4, 5);

}

# General

general:
{

    epsilon = 1E-20;

    size: 
    {
        hopSize = 128;
        frameSize = 256;
    };

    samplerate:
    {
        mu = 16000;
        sigma2 = 0.01;
    };

    speedofsound:
    {
        mu = 343.0;
        sigma2 = 25.0;
    };

    mics = (

        # Microphone 2
        { 
            mu = ( -0.032, +0.000, +0.000 ); 
            sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 );
            direction = ( +0.000, +0.000, +1.000 );
            angle = ( 80.0, 100.0 );
        },

        # Microphone 3
        { 
            mu = ( +0.000, -0.032, +0.000 ); 
            sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 );
            direction = ( +0.000, +0.000, +1.000 );
            angle = ( 80.0, 100.0 );
        },

        # Microphone 4
        { 
            mu = ( +0.032, +0.000, +0.000 ); 
            sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 );
            direction = ( +0.000, +0.000, +1.000 );
            angle = ( 80.0, 100.0 );
        },

        # Microphone 5
        { 
            mu = ( +0.000, +0.032, +0.000 ); 
            sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 );
            direction = ( +0.000, +0.000, +1.000 );
            angle = ( 80.0, 100.0 );        
        }

    );

    # Spatial filter to include only a range of direction if required
    # (may be useful to remove false detections from the floor)
    spatialfilters = (

        {
            direction = ( +0.000, +0.000, +1.000 );
            angle = (80.0, 100.0);

        }    

    );

    nThetas = 181;
    gainMin = 0.25;

};

# Stationnary noise estimation

sne:
{

    b = 3;
    alphaS = 0.1;
    L = 150;
    delta = 3.0;
    alphaD = 0.1;

}

# Sound Source Localization

ssl:
{

    nPots = 4;
    nMatches = 10;
    probMin = 0.5;
    nRefinedLevels = 1;
    interpRate = 4;

    # Number of scans: level is the resolution of the sphere
    # and delta is the size of the maximum sliding window
    # (delta = -1 means the size is automatically computed)
    scans = (
        { level = 2; delta = -1; },
        { level = 4; delta = -1; }
    );

   potential: {
  format = "json";
  interface: {
    type = "socket";
    ip = "127.0.0.1";
    port = 9001;
  };
};

};

# Sound Source Tracking

sst:
{  

    # Mode is either "kalman" or "particle"

    mode = "kalman";

    # Add is either "static" or "dynamic"

    add = "dynamic";    

    # Parameters used by both the Kalman and particle filter

    active = (
        { weight = 1.0; mu = 0.4; sigma2 = 0.0025 }
    );

    inactive = (
        { weight = 1.0; mu = 0.25; sigma2 = 0.0025 }
    );

    sigmaR2_prob = 0.0025;
    sigmaR2_active = 0.0225;
    sigmaR2_target = 0.0025;
    Pfalse = 0.1;
    Pnew = 0.1;
    Ptrack = 0.8;

    theta_new = 0.9;
    N_prob = 5;
    theta_prob = 0.8;
    N_inactive = ( 250, 250, 250, 250 );
    theta_inactive = 0.9;

    # Parameters used by the Kalman filter only

    kalman: {

        sigmaQ = 0.001;

    };

    # Parameters used by the particle filter only

    particle: {

        nParticles = 1000;
        st_alpha = 2.0;
        st_beta = 0.04;
        st_ratio = 0.5;
        ve_alpha = 0.05;
        ve_beta = 0.2;
        ve_ratio = 0.3;
        ac_alpha = 0.5;
        ac_beta = 0.2;
        ac_ratio = 0.2;
        Nmin = 0.7;

    };

    target: ();

    # Output to export tracked sources
    tracked: {
  format = "json";
  interface: {
    type = "socket";
    ip = "127.0.0.1";
    port = 9000;
  };
};

}

sss:
{

    # Mode is either "dds", "dgss" or "dmvdr"

    mode_sep = "dds";
    mode_pf = "ms";

    gain_sep = 1.0;
    gain_pf = 10.0;

    dds: {

    };

    dgss: {

        mu = 0.01;
        lambda = 0.5;

    };

    dmvdr: {

    };

    ms: {

        alphaPmin = 0.07;
        eta = 0.5;
        alphaZ = 0.8;        
        thetaWin = 0.3;
        alphaWin = 0.3;
        maxAbsenceProb = 0.9;
        Gmin = 0.01;
        winSizeLocal = 3;
        winSizeGlobal = 23;
        winSizeFrame = 256;

    };

    ss: {

        Gmin = 0.01;
        Gmid = 0.9;
        Gslope = 10.0;

    };

    separated: {
  fS = 16000;
  hopSize = 512;
  nBits = 16;        

  interface: {
    type = "socket";
    ip = "127.0.0.1";
    port = 10000;
     #type = "file";
     #path = "separated.raw";
  }        
};

postfiltered: {
  fS = 16000;
  hopSize = 512;
  nBits = 16;        

  interface: {
    #type = "socket";
    #ip = "127.0.0.1";
    #port = 10010;
    type = "file";
    path = "separated.raw";
  }        
};

};

classify:
{

    frameSize = 4096;
    winSize = 3;
    tauMin = 88;
    tauMax = 551;
    deltaTauMax = 20;
    alpha = 0.3;
    gamma = 0.05;
    phiMin = 0.5;
    r0 = 0.2;    

    category: {

        format = "undefined";

        interface: {
            type = "blackhole";
        }

    }

}
GodCed commented 5 years ago

@Nonikka, the ODAS Studio launch button run the
$ ./odaslive -c ../config/odaslive/respeaker_usb_4_mic_arrayui.cfg
command trough Node.js os module.

You should not have to run ODAS core in another terminal. If the ODAS Studio launch button behave as expected, you will have two instance of ODAS core running fighting for the soundcard and sockets.

Nonikka commented 5 years ago

@Nonikka, the ODAS Studio launch button run the $ ./odaslive -c ../config/odaslive/respeaker_usb_4_mic_arrayui.cfg command trough Node.js os module.

You should not have to run ODAS core in another terminal. If the ODAS Studio launch button behave as expected, you will have two instance of ODAS core running fighting for the soundcard and sockets.

Thanks for reply, I follow your step and it works.That's weird, may be my config file didn't set correctly before.