====== Uploadování nahraných souborů ======
Kromě zasílání nahraných hovorů je možné ukládat nahrané hovory náš server včetně základních informací o hovoru.
====== Nastavení ======
Ve webovém rozhraní u nastavení linky vložíte do políčka `Email pro zasílání nahraných hovorů [?]:` URL kam se bude soubor uploadovat.
Součástí URL je povinné přihlašovací jméno a heslo i nastavení. Vyvarujte se ve jménu a heslu znaků jako "! @ a / :" a podobně, použití těchto znaků nemusí být řádně ošetřeno.
Nastavit lze email a formát v jakém se mají soubory předávat, nastavení je odděleno znakem "!"
(https|ftps|sftp)://user:pass@host[:port][/path][!email][![wav|mp3|opus|ogg]]
Příklady:
https://user:password@upload.mojefirma.cz/api/recieve.php
https://user:password@upload.mojefirma.cz/api/recieve.php!admin@mojefirma.cz!wav
https://user:password@upload.mojefirma.cz/api/recieve.php!opus
ftps://user:password@upload.mojefirma:5121
ftps://user:password@upload.mojefirma:5121!admin@mojefirma.cz!mp3
ftps://user:password@upload.mojefirma:5121!mp3
Lze zadat více URL nebo email pro zaslání + URL, či více emailů. Jako oddělovač se použije čárka.
Uploadovací skript se u nás spouští každých 30s. Pokud se uploadování nezdaří, je poslán email a další hodinu je toto **uri** vynecháváno. Po hodině se pokus zopakuje.
Neodeslané nahrávky čekají u nás ve frontě a jsou tak dodatečně poslány po opravení problému na straně příjemce.
====== Parametry - další informace o hovoru ======
Pokud používáte ftp,ftps a sftp, lze další informace vyčíst se jména souboru. se posila pouze jmeno souboru
**Změna z 9. 10. 2026:** název souboru už neobsahuje jméno linky, jen její číslo.
Nový tvar: ''datum_čas-délka-číslo_linky-volající-volaný.přípona''\\
Příklad: ''2026.10.09_15-10-12-77-666666-222222222-799799799.mp3''
Pole ''line_name'' v HTTP(S) POST se nemění (např. ''666666 (testovaci)'').
2021.05.31_15-10-12-77-666666_testovaci-222222222-799799799.mp3 #datum_cas_delkaHovoru(zvednutá část)_linka_jmeno-linky_src-dst.mp3
U https jsou pro snadnější zařazení souboru předávány jednotlivé informace ve zvláštních parametrech.
record=2021.05.31_15-10-12-77-666666_testovaci-222222222-799799799.mp3 #datum_cas_delka_hovoru(zvednutá část)_linka_jmeno-linky_src_dst.mp3
callid=84263f404302957e0e31fd87e54 #jedinecne id hovoru
duration=77 #delka hovoru v s
line_name=666666 (testovaci) #cislo linky (jmeno linky nastavene u linky )
time=2021-05-31 15:10:12 #datum a cas
from=222222222 #cislo volajiciho
to=799799799 #cislo volaneho
====== Php script ======
Příklad skriptu pro příjem nahraných souborů na webovém serveru. Pokud používáte ftp nebo sftp žádný skript nepotřebujete, ale ne každý poskytovatel podporuje vytvoření více ftp nebo sftp účtů s omezenými právy pro čtení.
https://github.com/jakubboucek/odorik-api-client-php/blob/master/examples/upload-recordings.php
header("Content-Type:application/json");
// NASTAVENI
//$valid_ips = array('185.14.232.1','185.183.8.128','2a00:1ed0:1:1800:7:39:5200:1'); // Povolene IP
$max_file_size = 20 * 1024 * 1024; // Max. velikost souboru 20 MB
$valid_extensions = array('mp3','MP3','ogg','OGG','wav','WAV','opus','OPUS'); // Povolene typy souboru
$inputname = 'record'; // Nazev vstupu se souborem
$dir = 'uploads/'; // Složka pro nahravani souboru
$user = 'Testuser'; // uzivatelske jmeno
$pass = 'TestPass1'; // heslo
// kontrola IP
/*if(!in_array($_SERVER['REMOTE_ADDR'],$valid_ips)){
response(401,'IP not allowed');
}*/
// jednoduche zabezpeceni
if(($_SERVER['PHP_AUTH_USER'].$_SERVER['PHP_AUTH_PW'] != $user.$pass)){
response(401,'Unauthorized');
}
// pokud neni v POSTu pozadovany soubor
if(!$_FILES[$inputname]){
response(400,'Chybny pozadavek, pole pro nahravku se musi jmenovat record.');
}
// precteme informace o souboru
$file_size = $_FILES[$inputname]['size'];
$file_ext = pathinfo($_FILES[$inputname]['name'], PATHINFO_EXTENSION);
$file_name = $_FILES[$inputname]['name'];
// jednoducha kontrola souboru
if(empty($file_name)){
response(400, 'Chybi nazev souboru.');
}
if($file_size > $max_file_size) {
response(400, 'Velikost souboru presahuje '.round($max_file_size / 1024 / 1024,1).' MB.');
}
if(!in_array($file_ext,$valid_extensions)){
response(400, 'Nepodporovany format, nahravat lze jen '.implode(', ', $valid_extensions).'.');
}
if(strlen($file_name) > 200) {
response(400, 'Prilis dlouhy nazev souboru.');
}
// hovory tridime do slozek po rocich, mesicich a dnech
if($_POST['time']){
// pokud mame cas hovoru, zaradime podle nej
$year = date('Y',strtotime($_POST['time']));
$month = date('m',strtotime($_POST['time']));
$day = date('d',strtotime($_POST['time']));
}else{
// pokud nemame cas hovoru, zaradime podle aktualniho data nahrani
$year = date('Y');
$month = date('m');
$day = date('d');
}
$dir = $dir.$year.'/'.$month.'/'.$day;
// pokud slozka neexistuje, tak ji zalozime
if (!file_exists($dir)) {
mkdir($dir, 0777, true);
}
// presuneme soubor do pozadovane slozky
$upload = move_uploaded_file($_FILES[$inputname]['tmp_name'],$dir.'/'.$file_name);
// Prozatim neosetrujeme specialni znaky ani duplicity - prepise se puvodni soubor.
// pokud vse probehlo v poradku, pokracujeme
if($upload){
// pouze pro vyvoj, zapiseme si POST pole do souboru
file_put_contents('post.txt', json_encode($_POST));
// S dalsimi daty z POSTu si pak muzeme spustit vlastni udalost
/* LIBOVOLNA UDALOST */
// Vypiseme odpoved, vse ok
response(200, 'V poradku nahrano.',$_POST);
// jinak vypiseme chybu
}else{
response(500, 'Internal error.');
}
// jednoducha funkce na vypisovani odpovedi
function response($code,$description,$data=0){
$response['code'] = $code;
$response['description'] = $description;
if($data){
$response['post_data'] = $data;
}
http_response_code($code);
echo json_encode($response);
exit;
}
?>
===== Pokud chcete uploadovat hovory objednané přes zpětné volání je zde následující omezení =====
Pokud využíváte možnosti nechat si zasílat nahrávané hovory na vlastní server [[:call_records_upload]], a spojujete callbackem dvě čísla, které obě nejsou u Odorik.cz, je hovor prohnat přes SIP jméno, aby
se nahrávka proběhla a poslala se na váš serveru. Omezení se netýká zasílání na email. Tedy zřídíte si sip jméno, pomocí API natavíte kam se má směrovat až poté objednáte zpětné volání kdy jedno z čísle bude to sip jméno.
[[:api:calls#callback]]
====== Stereo nahrávky - nahrávky pro zpracování umělou inteligencí ======
Otázka: Umíte nahrávku uložit ve stereu tak, aby každá strana hovoru byla v samostatném kanálu (volající vlevo, volaný vpravo)? Případně poslat dvě samostatné nahrávky, pro každou stranu jednu
Odpověď: Nahrávky umíme ukládáme ve stereu, každá strana hovoru je v samostatném kanálu: volající vlevo, volaný vpravo. Zapnete to v Uživatelských nastaveních → nastavení účtu → "stereo nahrávání: ano".
Otázka: Pokud ano, jde to nastavit u doručování e-mailem, nebo jen při uploadu na vlastní server (https/sftp)?
Odpověď: Stereo funguje i při doručování e-mailem, jen ne ve formátu WAV. Pro e-mail doporučujeme formát "Opus (kvalitní)", který zvolíte tamtéž v položce "formát nahrávaných hovorů". Kvůli limitu velikosti e-mailu se ale nahrávky delší než cca 20 minut komprimují silněji (cca 8–10 kbit/s). Pokud potřebujete plnou kvalitu i u dlouhých hovorů, použijte upload na vlastní server (https/sftp), kde je k dispozici i WAV.
Otázka: Jaké je vzorkování a bitrate nahrávek při volbě formátu wav a v případě případně opus?
Odpověď: PCM 16 bit, 8000 Hz, 2 kanály (stereo), 256 kbit/s. Opus: stereo, vzorkování 48 kHz (zdrojem nahrávky je telefonní zvuk 8 kHz), proměnný bitrate (VBR). Ve variantě s vyšší kvalitou je průměrně cca 40 kbit/s u nahrávek do cca 20 minut; delší nahrávky se kvůli velikosti souboru kódují na cca 8–10 kbit/s. Úsporná varianta má cca 10 kbit/s. Nemá ale smysl se zaměřovat se na vyšší kvalitu 48 kHZ, když telefonní hovory mají standardně jen 8 KHZ.