Asterisk: appunti sparsi

elenca tutti

Pout purrie di appunti riguardo Asterisk in "pabx", il voip server casalingo.

Eutelia, VAD e ztdummy

Problema: Eutelia usa il VAD (Voice Activity Detection) per risparmiare banda, ovvero laddove si accorga che chi ti chiama è in silenzio allora interrompe il flusso rtp da Eutelia e verso Asterisk. Quando questo avviene Asterisk se ne accorge (in consolle appare il messaggio "Comfort noise support incomplete in Asterisk (RFC 3389). Please turn off on client if possible.") ma inizia a malfunzionare. Difatti il timing del flusso rtp da Asterisk verso Eutelia usa come "clock" il flusso rtp inverso, e se quindi quest'ultimo si interrompe allora automaticamente si blocca anche il primo. Effetto pratico: se Asterisk sta suonando una musica in attesa o anche più semplicemente sta inviando gli squilli, questi non arrivano o arrivano distorti perché il flusso è intermittente e attivo solo quando l'interlocutore fa abbastanza rumore da non attivare il VAD.

Con Asterisk almeno v1.4 il problema è risolubile.

vi /etc/asterisk/asterisk.conf
[options]
internal_timing=yes
silence_suppression=no
Nota bene: nel file asterisk.conf di default il delimitatore [options] ha un ";" davanti, quindi fare attenzione a rimuoverlo.

Questo forza Asterisk ad usare una fonte interna per il timing, anziché il flusso rtp ricevuto. La cosa purtroppo non si ferma qui. Le fonti interne per il timing di default su Linux non esistono. Nel caso che la macchina sul quale gira Asterisk sia reale ed abbia schede telefoniche, i driver zaptel ne forniscono una. Per fortuna esiste anche una periferica virtuale (ztdummy) che in assenza di hardware simula una fonte di timing forse non precisissima ma sufficiente. Per farlo usa il processore ed in base a quanto questo ha a disposizione può essere più o meno precisa (Linux26, RTP o HRTimer). Quale delle tre modalità viene usata è deciso in maniera fissa in fase di compilazione degli zaptel, e sui processori moderni è HRTimer, che in teoria sarebbe la più precisa (HRTimer è migliore di RTP che a sua volta è migliore di Linux26). Ho trovato in giro che si può migliorare ulteriormente modificando i sorgenti della versione RTP e forzandone la creazione al posto della HRTimer. Per il momento comunque non ho approfondito. La Linux26 usa i "kern.hz" del kernel, che devono essere alzati ad almeno 1000, il che non è il massimo in un ambiente virtuale, in cui quel valore è bene sia il più basso possibile.

I driver zaptel si compilano e installano come segue:

wget http://downloads.digium.com/pub/zaptel/releases/zaptel-1.4.12.1.tar.gz
tar -xvzf zaptel-1.4.12.1.tar.gz
cd zaptel-1.4.12.1

./configure
make
make install
make config

Per evitare di caricarsi nel kernel un sacco di roba inutile, visto che non si usa l'hardware, è bene fare come segue:

rm /etc/udev/rules.d/zaptel.rules
rm /etc/udev/rules.d/xpp.rules
rm /etc/init.d/zaptel
/etc/asterisk/modules
noload => codec_dahdi.so

E poi si lancia la sola ztdummy:

vi /etc/rc.local
modprobe ztdummy 2>/dev/null

Si verifica che la ztdummy sia stata effettivamente caricata con il seguente comando:

lsmod | less

Si verifica il tipo di timer usando con il seguente comando:

root@pabx:~# cat /proc/zaptel/1
Span 1: ZTDUMMY/1 "ZTDUMMY/1 (source: HRtimer) 1" (MASTER)
Nota bene: Asterisk è consapevole degli zaptel e quindi di ztdummy solo se viene compilato DOPO l'installazione degli zaptel. E quindi poi va comunque rifatto quanto segue.
wget http://downloads.digium.com/pub/asterisk/releases/asterisk-1.4.22.tar.gz
tar -xvzf asterisk-1.4.22.tar.gz
cd asterisk-1.4.22

make clean
./configure
make install

Codec g723, g729, speex, ilbc e g722

  • I codec g723.1 e g729 si trovano compilati nel seguente sito

    http://asterisk.hosting.lv/
  • Il codec speex va installato come segue:

    apt-get install speex
    apt-get install libspeex-dev
    Nota bene: Asterisk è consapevole del codec speex solo se viene compilato DOPO l'installazione del codec.
  • Il codec ilbc si compila ed installa a partire dai sorgenti di Asterisk:

    cd /usr/src/asterisk-1.4.22
    contrib/scripts/get_ilbc_source.sh 
    menuselect/menuselect
    
    make clean
    ./configure
    make install
  • Il codec g722 è gestito solo parzialmente da Asterisk (viene veicolato ma NON transcodificato) quindi non c'é niente da installare.

Files vocali in italiano

Se ne trovano al seguente indirizzo ma sinceramente non sono il massimo.

http://mirror.tomato.it/ftp/pub/asterisk/suoni_ita/

Esiste un'alternativa. Loquendo fa degli ottimi sintetizzatori vocali (si può farsene un'idea su http://www.loquendo.com/it/demos/demo_tts.htm). Usando una di quelle voci con qualcosa tipo "TextALoud" è possibile farsi dei messaggi .wav da poi far utilizzare da Asterisk.

Vanno comunque convertiti di formato, ad esempio con il metodo che segue:

apt-get install sox
apt-get install libsox-fmt-all

sox geb_benvenuto_1.wav -r 8000 -c 1 -s -w geb_benvenuto_2.wav resample -ql
sox geb_benvenuto_1.wav -r 8000 geb_benvenuto_1.gsm resample -ql

Qualità dei vari codec

Banda utilizzata
  G.711u G.711a G.726 32kbps G.729a G.723.1 iLBC GSM AMR 12.2kbps Speex
Kbps 80 80 48 18 18 27 27  

Valori indicati da NGI Squillo
  G.711u G.711a G.726 32kbps G.729a G.723.1 iLBC GSM AMR 12.2kbps Speex
MOS
Range
4.3-4.7 4.3-4.7 3.9-4.2   2.8-3.5 3.7-4.1 3.7-3.9  

Ideal Conditions: No Network Load with Artificial Voice
 G.711uG.711aG.726 32kbpsG.729aG.723.1iLBCGSM AMR 12.2kbpsSpeex
MOS AVG
(PSQM)
4.454.444.34.044.084.14.143.84

Ideal Conditions: No Network Load with Both Gender Voice
 G.711uG.711aG.726 32kbpsG.729aG.723.1iLBCGSM AMR 12.2kbpsSpeex
MOS AVG
(PSQM)
4.34.294.213.763.743.813.963.78

Normal Conditions: 1% Packet Loss with Both Gender Voice
 G.711uG.711aG.726 32kbpsG.729aG.723.1iLBCGSM AMR 12.2kbpsSpeex
MOS AVG
(PSQM)
4.244.254.143.743.753.823.943.79

Duress: 5% Packet Loss with Both Gender Voice
 G.711uG.711aG.726 32kbpsG.729aG.723.1iLBCGSM AMR 12.2kbpsSpeex
MOS AVG
(PSQM)
4.134.113.793.513.573.743.793.59

Qualche numero utile

  • Squillo: 4000 da il credito residuo
  • Squillo: 4010 da l'ora esatta
  • Squillo: 4020 va in Echo Test
  • Squillo: 4050 da la segreteria, raggiungibile anche al 02-3919.5040
  • Eutelia: 445566 da il credito residuo

Il comune di Prato è raggiungibile in VoIP!

La URI è sip:Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo..

Tenere sincronizzato l'orologio!

Dopo qualche settimana mi sono reso conto che è opportuno tenere l'orologio sincronizzato con:

apt-get install ntp ntpdate
vi /etc/ntp.conf
server ntp.ubuntu.com
server pool.ntp.org

Abbiamo 15 visitatori e nessun utente online