Jak nahrát hlášky do asterisku

Jsou dva způsoby, jak si je pořídit . Buď je nahraji pomocí telefonu, přičemž použiji aplikace record (v extensions.conf),

[studio2]
; nahraji hlášku pod zadanou číslicí
exten => _X!,1,Wait(1)
exten => _X!,n,Record(NAHREJ2/${EXTEN}:alaw)
exten => _X!,n,Wait(1)
exten => _X!,n,Playback(NAHREJ2/${EXTEN})
exten => _X!,n,Hangup
; pokud to začíná hvězdičkou, tak to přehraji
exten => _*.,1,Wait(1)
exten => _*.,n,Playback(NAHREJ2/${EXTEN:1})
exten => _*.,n,Hangup

nebo je nahraji pomocí své kvalitní zvukové karty a mikrofonu (nejlépe USB sluchátka nebo kvalitní mikrofon na kameře) a převedu do tvaru, kterému rozumí asterisk. Výhoda tohoto řešení je, že mohu záznam např. rozsekat a např. vizuálně vidím, jestli není překřičen. Odstřihnout mohu též zbytečně dlouhá prázdná místa a pod. Použít lze např. audacity, který má verzi pro Linux i Windows. Velmi důležitý je kvalitní mikrofon. Jak si vyladit zvuk a mikrofon pod linuxem. Nahrávání wav souborů mohu tedy provést i pod Windows, a teprve poté je přemístit na počítač s Linuxem, kde provozuji Asterisk. Tam si též nainstaluji balíček sox a mohu pokračovat podle našeho návodu.

Pokud si soubor nahrajeme v audacity, může být dobré použít potlačení šumu Effects → Noise removal , dále zesílení zvuku na optimální (maximální) úroveň, ale tak aby zvuk nebyl překřičen Effects → Normalize. Pokud chci zesílit i za cenu překřičení nějakého okamžiku (clipped), mohu to docílit pomocí Effect → Amplify.

Pokud nahráváte více různých ale krátkých hlášek, které chcete potom uložit do více souborů (např. číslovky), můžete je nahrát v za sebou a potom rozdělit pomocí Analyze → Sound Finder a potom uložit File → Export Multiple https://fluent-forever.com/forums/topic/a-quicker-way-to-split-words-in-audacity/#.VaLbg0YpBGo

Vyrábíme slin - neboli 16-bitový raw

Tento kodek asterisk používá interně, při převádění mezi kodeky. Potencionálně tak dosáhneme nejmenšího snížení kvality zvuku při převodu do různých kodeků. slin, jak jej nazývá asterisk, patří do kategorie raw. Což znamená, že v souboru není žádná informace o tom, v jakém formátu jsou data uložena. Asterisk jej rozpozná pomocí koncovky .slin nebo .raw obecně to ale příkazům, které s nimi pracují, musíme výslovně napsat. Z toho plyne i výhoda jednoduchého spojování “cat hlaska1.raw hlaska2.raw>delsi_Hlaska.raw”

sox -V "p.wav" -r 8000 -c 1 "p.raw"
sox -V "p.wav" -t raw -r 8000  -b 16 -s -c 1 "p.raw"
# tyhle dva řádky výše se funkčně vůbec neliší, na prvním řádku byly chybějící volby doplněny defaultními. 
# Typ raw byl určen na prvním řádku pomocí koncovky souboru
# Příkaz play - přehrání - už nám ale chybějící údaje neodpustí, takže existuje jen varianta  
play  -r 8k -e signed-integer  -b 16 -c 1  p.raw
# jediný, co nám ale dovolí, je chybějící parametr -t raw, poznal to podle koncovky souboru.
cp p.raw p.slin
# pokud by měl soubor jinou koncovku, musíme -t raw dodat též
play -t raw  -r 8k -e signed-integer  -b 16 -c 1  p.slin
 
 
# v mém případě vrátilo varování 
#sox WARN rate: rate clipped 103 samples; decrease volume?
#sox WARN dither: dither clipped 95 samples; decrease volume?
# proto jsem přidal ještě volbu na snížení hlasitosti
sox -V "p.wav"  -r 8k -e signed-integer  -b 16 -c 1 "p.raw" remix 1v0.9

po úspěšném provedení vypíše mimo jiné následující

Output File    : 'p.raw'
Channels       : 1
Sample Rate    : 8000
Precision      : 16-bit
Duration       : 00:00:09.37 = 74972 samples ~ 702.862 CDDA sectors
Sample Encoding: 16-bit Signed Integer PCM
Endian Type    : little
Reverse Nibbles: no
Reverse Bits   : no
Comment        : 'Processed by SoX

Tyto údaje se nám budou hodit, pokud bychom soubor chtěli otevřít např. v audacity např. pro ořezání. Ano jistě, lepší je ořezávat ještě s plnou kvalitou, ale někdy můžeme chtít ořezávat i hlášky, které namluvil někdo jiný a my již soubor s plnou kvalitou nemáme.

Otevřeme to v menu Soubor→Import→raw-data, vybereme soubor a v následujícím okně budeme dotázáni na tyto údaje.

Je libo kodek alaw?

že chceme kodek alav, řekneme parametrem -A. Parametr -b je již k ničemu, protože kodek alaw má přesnost přibližně 13 bitů a je tedy bezpředmětné to zadávat.

sox -V "p.wav" -t raw  -r 8k -e signed-integer  -b 16 -c 1  "p.alaw"

Příkaz vypíše:

sox: SoX v14.3.2
sox INFO formats: detected file format type `wav'

Input File     : 'p.wav'
Channels       : 1
Sample Rate    : 44100
Precision      : 16-bit
Duration       : 00:00:09.37 = 413283 samples = 702.862 CDDA sectors
File Size      : 827k
Bit Rate       : 706k
Sample Encoding: 16-bit Signed Integer PCM
Endian Type    : little
Reverse Nibbles: no
Reverse Bits   : no

sox INFO sox: Overwriting `p.alaw'

Output File    : 'p.alaw' (raw)
Channels       : 1
Sample Rate    : 8000
Precision      : 13-bit
Duration       : 00:00:09.37 = 74972 samples ~ 702.862 CDDA sectors
Sample Encoding: 8-bit A-law
Reverse Nibbles: no
Reverse Bits   : no
Comment        : 'Processed by SoX'

sox INFO sox: effects chain: input      44100Hz 1 channels
sox INFO sox: effects chain: rate       8000Hz 1 channels
sox INFO sox: effects chain: dither     8000Hz 1 channels
sox INFO sox: effects chain: output     8000Hz 1 channels
sox WARN rate: rate clipped 103 samples; decrease volume?
sox WARN dither: dither clipped 86 samples; decrease volume?

Zase nám nadává, že máme zvuk překřičen. Vyhovíme a ztlumíme kanál 1.

sox -V "p.wav" -t raw  -r 8k -e signed-integer  -b 16 -c 1 "p.alaw" remix 1v0.9

Je libo gsm?

Všimněte si, že kromě parametru -g musíme oddělat -t raw

sox -V "p.wav" -r 8000 -g -c 1 "p.gsm" # remix 1v0.9 # možná že vy ztlumovat nemusíte
# pro stejný výsledek by dokonce stačilo jen
sox -V "p.wav"  "p.gsm"  # podle koncovky, pozná, že se jedná o gsm, které v jiném než dané -r 8000 variantě neumí.
utput File    : 'p.gsm'
Channels       : 1
Sample Rate    : 8000
Precision      : 16-bit
Duration       : 00:00:09.37 = 74972 samples ~ 702.862 CDDA sectors
Sample Encoding: GSM
Comment        : 'Processed by SoX'

gsm zdá se má 16 bitů, tyto údaje se nám budou hodit, pokud bychom chtěli soubor otevřít např. v audacity. Pro přehrání nám stačí jen

play p.gsm

rozpoznáno je totiž podle koncovky

Proč tolik kodeků?

Co se týče kvality, tak ideální je ten první slin. Soubory umístíme do adresáře /var/lib/asterisk/sounds/, kde jsou k dispozici různým příkazům na přehrávání, např. Background(p). Příponu nedáváme a Asterisk si sám vybere kodek ve formátu tak, aby nemusel transkódovat. Pokud kodek, který potřebujeme, není k dispozici, tak transkóduje. Pokud chceme šetřit procesor, můžeme převést i na další používané kodeky pomocí příkazu v CLI file convert Tento příkaz lze zadat po spuštění asterisk, nebo pomocí parametru -x i přímo z příkazové řádky bashe.

Manuálové stránky jsou základ

Ale jsou tak velké, že byste to podstatné mohli přehlédnout. Proto raději cituji to podstatné. Tohle a spoustu dalšího textu uvidíte pokud zadáte man sox

 -s/-u/-f/-A/-U/-o/-i/-a/-g
              Deprecated  aliases  for  specifying the encoding types signed-integer, unsigned-integer, floating-point, mu-law, a-
              law, oki-adpcm, ima-adpcm, ms-adpcm, gsm-full-rate respectively (see -e above).

Jak převést do formátu vhodného pro Asterisk

Chceme-li převést jiný formát než wav, můžeme k tomu použít příkaz mplayer viz následující skript.

soubor x2raw

#!/bin/bash
# Script to convert any mplayer supported audio file to RAW suitable for Asterisk IVRs.
file_name_without_extension="${1%.*}"
echo $file_name_without_extension
mplayer -ao pcm "$1" -ao pcm:file="$file_name_without_extension.wav"
sox -V "$file_name_without_extension.wav" --norm -t raw -r 8000 -e signed-integer -b 16 -c 1 "$file_name_without_extension.raw"
rm "$file_name_without_extension.wav"

Marametr –norm provede normování hlasitosti, aby nahrávka nebyla příliš potichu, což je častá chyba.

Délka souboru ve vteřinách

soxi -D out.wav

Pokud mám již wav file, tak stačí

soubor wav2raw

#!/bin/bash
sox -V "$1.wav" -r 8k -e signed-integer  -b 16 -c 1  "$1.raw"

wav2raw_all

#!/bin/bash
# využívá wav2raw a provede převod všech souborů v adresáři (prerekvizita: apt-get instlall parallel)
find  *.wav | parallel wav2raw {.}

Jedná se o skript x2raw, který je součást stejnojmenného balíčku distribuce archlinux. Ostatní si tento skript mohou vytvořit pomocí copy and paste a umístit ho např do /usr/bin/x2raw (jako root).

kontrola playraw

playraw
#!/bin/bash
play -t raw  -r 8k -e signed-integer  -b 16 -c 1  $1

playalaw

playalaw
#!/bin/bash
play -t raw  -r 8k -c 1 -e a-law $1
# jde take u-law a gsm

Jak přehrát pomocí audacity soubor alaw

Pokud máme už vygenerovány hlášky v alaw, můžeme chtít zkontrolovat, zda-li jsou stále srozumitelné. Nebo je možné, že máme nějaké starší hlášky, s kterými chceme dále pracovat v audacity. (např. byly nahrány pomocí record, nebo monitor) Soubory, s kterými pracuje asterisk, nemají žádnou informaci o tom, jak jsou v nich data uložena. Asterisk to rozlišuje pomocí koncovky, ale jiným programům to musíme exmplicitně zadat. Podobně by se otvíral soubor ve formátu gsm.

ALAW=PCMA=g711a

V audacity můžeme otevřít soubor alaw pomocí Soubor→import → raw data a zde vybereme Kodování A-Law “bez indianness” a rychlost vzorkování 8000 Hz.

sln, slin nebo také raw

V audacity můžeme otevřít soubor alaw pomocí Soubor→import → raw data a zde vybereme Kodování “Signed 16-bit PCM”A-Law “, little-endian a rychlost vzorkování 8000 Hz.

Konverze alaw to wav (alaw2raw)

#!/usr/bin/ruby
# encoding: utf-8
Dir.glob(".") {|f| puts f}
#`sox -t raw -b -A -r 8000 old/$1.alaw -t wav -u -b new/$1.wav\n`;
# sox -t raw  -e a-law -r 8000 old/$1.alaw -t wav new/$1.wav

ffmpeg

Pro konverzi do slin je možné použít i příkaz ffmpeg.

ffmpeg -i Operatori\ zaneprazdneni.m4a  -af "loudnorm=I=-16:TP=-1.5:LRA=11:print_format=summary"  -ar 8000 -ac 1 -acodec pcm_s16le -f s16le -y Output.sln

Část s -af “loudnorm=I=-16:TP=-1.5:LRA=11:print_format=summary” je pro normování hlasitosti zvuku. Když je totiž nahrávka příliš potichu, bude při snížené kvalitě špatně srozumitelná. Aby se normování hlasitosti projevilo, je třebaskript spustit dvakrát.

Parametry pro normování hlasitosti byly použity odsud. https://bytesandbones.wordpress.com/2017/03/16/audio-nomalization-with-ffmpeg-using-loudnorm-ebur128-filter/

Zpátky lze převést jednoduše

ffmpeg   -i Input.sln -y  Output.flac
 
vytvareni_ivr.txt · Last modified: 2023/11/24 20:00 by root