Audio & microfono
Come l'SDK gestisce microfono e audio full-duplex, mute, vincoli del device input e diagnosi dei problemi audio.
L'SDK si occupa interamente della parte audio: cattura il microfono, riproduce l'audio della controparte e gestisce la conversione di formato e lo streaming sul canale della chiamata. L'audio è full-duplex (operatore e controparte si sentono contemporaneamente). Tu non gestisci stream o codec: ti basta dare i permessi e, se vuoi, scegliere il device di input.
La pagina deve essere servita su HTTPS (o localhost) perché il browser
conceda l'accesso al microfono. La prima chiamata può inoltre richiedere un
gesto dell'utente (es. un click) per sbloccare l'audio sotto le policy di
autoplay del browser.
Mute / unmute
Durante una chiamata attiva puoi silenziare e riattivare il microfono
dell'operatore con mute(on):
call.mute(true); // silenzia il microfono
call.mute(false); // riattiva
console.log(call.muted); // stato corrente: true | falsemute agisce sul microfono verso la controparte; l'audio in arrivo continua a
essere riprodotto. La proprietà call.muted riflette lo stato corrente.
Vincoli del device input
I vincoli del microfono sono MediaTrackConstraints (gli stessi che passeresti a
getUserMedia({ audio })). Per impostazione predefinita l'SDK abilita
cancellazione dell'eco, soppressione del rumore e guadagno automatico.
In configurazione (audioConstraints)
Puoi impostare i vincoli iniziali alla creazione dell'istanza:
const op = new AudinOperator({
coreUrl: "https://core.audin.ai",
getToken,
audioConstraints: {
echoCancellation: true,
noiseSuppression: true,
autoGainControl: true,
},
});A runtime (setAudioConstraints)
Per cambiare device input (o qualsiasi altro vincolo) mentre l'SDK è in uso,
usa setAudioConstraints(constraints):
op.setAudioConstraints({
deviceId: { exact: selectedDeviceId },
echoCancellation: true,
});I nuovi vincoli vengono letti quando si apre il canale audio della prossima
chiamata. Il cambio ha quindi effetto dal prossimo dial() o dalla
prossima chiamata in entrata accettata: una chiamata già in corso mantiene
il device con cui il suo bridge è stato aperto (il microfono non viene
riaperto a metà chiamata).
Selezionare il device nel browser
Per offrire all'operatore la scelta del microfono, enumera i device audio di
input con le API standard del browser e passa il deviceId scelto a
setAudioConstraints:
// Richiede prima il permesso microfono, poi elenca gli input audio.
const devices = await navigator.mediaDevices.enumerateDevices();
const microfoni = devices.filter((d) => d.kind === "audioinput");
// L'operatore sceglie nella tua UI → applica il device.
op.setAudioConstraints({ deviceId: { exact: microfoni[0].deviceId } });Le etichette dei device (label) sono visibili solo dopo che è stato
concesso il permesso microfono. Tipicamente si richiede una volta il permesso
(anche con una breve chiamata a getUserMedia), poi si ri-enumera per
popolare il menu di scelta.
Diagnosi: "non si sente l'operatore"
Se la controparte non sente l'operatore (o viceversa), procedi così:
Verifica i permessi del microfono. Controlla che il browser e il sistema
operativo abbiano concesso l'accesso al microfono per il sito. Un permesso negato
si manifesta tipicamente con un evento error di codice MIC_PERMISSION_DENIED.
Controlla che sia selezionato il device giusto. Se ci sono più microfoni
(integrato, cuffie USB, webcam…), assicurati che setAudioConstraints punti al
device effettivamente in uso. Ricorda che il cambio device ha effetto dalla
prossima chiamata.
Prova un indicatore di livello (VU meter). Nella tua UI puoi mostrare il livello del microfono in tempo reale per confermare che l'input arrivi: è un modo rapido per distinguere "microfono muto" da "audio non instradato".
Verifica lo stato di mute. Controlla call.muted: una chiamata può essere
semplicemente silenziata.
Conferma il contesto sicuro e il gesto utente. La pagina deve essere su
HTTPS (o localhost) e la prima chiamata può richiedere un click per
sbloccare l'audio. Vedi anche la pagina
Troubleshooting.
DTMF
L'oggetto OperatorCall espone sendDtmf(digit) per i toni DTMF (0-9, *,
#):
call.sendDtmf("5");sendDtmf non è ancora supportato end-to-end. La cifra viene validata ed
emessa come messaggio di controllo sul canale della chiamata, ma i toni non
vengono ancora inoltrati alla rete telefonica: per la controparte è oggi un
no-op. Il metodo (e il suo messaggio sul protocollo) sono mantenuti così che
abilitarlo lato server in futuro non richieda alcuna modifica all'SDK — ma
non affidarti alla navigazione IVR via DTMF per ora.