├── voice └── dicts │ └── Ukrainian │ ├── abr.txt │ ├── pronunciation.txt │ └── dictionary.txt ├── www ├── index.php └── Voice.php ├── Dockerfile └── README.md /voice/dicts/Ukrainian/abr.txt: -------------------------------------------------------------------------------- 1 | apk/i 2 | it/i 3 | nrcu/i 4 | nvda/i 5 | usb/i 6 | ussd/i 7 | wba/i 8 | атб/i 9 | атп/i 10 | вру/i 11 | гпу/i 12 | єбрр/i 13 | зсу/i 14 | кву/i 15 | кпу/i 16 | нбу/i 17 | нгу/i 18 | нрку/i 19 | нсту/i 20 | осбб/i 21 | пцу/i 22 | рнбо/i 23 | сбу/i 24 | угкц/i 25 | упл/i 26 | упц/i 27 | ухл/i 28 | ффу/i -------------------------------------------------------------------------------- /www/index.php: -------------------------------------------------------------------------------- 1 | createVoice()->streamVoice(); 11 | 12 | /* 13 | * Після кожного запиту видаляємо озвучений файл 14 | */ 15 | register_shutdown_function('unlink', $voice->getOutFileName()); -------------------------------------------------------------------------------- /voice/dicts/Ukrainian/pronunciation.txt: -------------------------------------------------------------------------------- 1 | 2 | about=ебаут 3 | all=ол 4 | application=еплікейшн 5 | applications=еплікейшнс 6 | ation=ейшн 7 | ations=ейшнс 8 | back=бек 9 | backspace=бекспейс 10 | backup=бекап 11 | caps=кепс 12 | close=клоуз 13 | e-mail=і-мейл 14 | edge=едж 15 | email=імейл 16 | facebook=фейсбук 17 | file=файл 18 | files=файлс 19 | feed=фід 20 | gmail=джімейл 21 | google=ґуґл 22 | lock=лок 23 | mail=мейл 24 | message=меседж 25 | меседж/1 26 | messenger=мессенджер 27 | мессенджер/1 28 | mobile=мобайл 29 | new=нью 30 | news=ньюс 31 | notification=нотіфікейшн 32 | notifications=нотіфікейшнс 33 | password=пессворд 34 | пессворлд=1 35 | play=плей 36 | player=плеєр 37 | read=рід 38 | reader=рідер 39 | see=сі 40 | skype=скайп 41 | space=спейс 42 | tweet=твіт 43 | ukraine=юкрейн 44 | ukrainian=юкрейніан 45 | viber=вайбер 46 | вайбер/1 -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:7.2-cli 2 | 3 | ENV RHVOICE_PATH /opt/RHVoice 4 | 5 | RUN apt-get update 6 | 7 | RUN apt-get install -y git 8 | RUN apt-get install -y pkg-config 9 | RUN apt-get install -y scons 10 | 11 | # бібліотека для виведення аудіо, вона дозволяє зберігари виведення в файл. 12 | RUN apt-get install -y libao-dev 13 | # утиліта, що дозволяє конвертувати wav в mp3 14 | RUN apt-get install -y lame 15 | 16 | RUN apt-get install -y python3 python-pip 17 | RUN pip install lxml 18 | 19 | # Викачуємо сирцевий код з репозиторію та збираємо його 20 | RUN git clone https://github.com/Olga-Yakovleva/RHVoice.git $RHVOICE_PATH 21 | WORKDIR $RHVOICE_PATH 22 | 23 | RUN scons install 24 | RUN ldconfig 25 | 26 | ADD ./www/ /var/www/html/ 27 | ADD ./voice/dicts /usr/local/etc/RHVoice/dicts/ 28 | 29 | WORKDIR /var/www/html 30 | 31 | EXPOSE 8080 32 | 33 | CMD ["php", "-S", "0.0.0.0:8080"] 34 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Встановлення та використання 2 | 3 | Запускаємо контейнер. 4 | 5 | `docker run --rm -itdp 8080:8080 --name tts nagard/tts` 6 | 7 | Тепер якщо ти перейдеш за цим посиланням, то почуєш озвучений текст. 8 | 9 | http://localhost:8080?text=крута+українська+озвучка 10 | 11 | Без задання профілю, голос буде від Анатоля (`anatol`), щоб озвучити текст голосом від Наталки (`natalia`), користуйся параметром `voice` 12 | 13 | http://localhost:8080?text=крута+українська+озвучка&voice=natalia 14 | 15 | Якщо озвучений файл для завантаження треба відповідно назвати, використовуй параметр `name` 16 | 17 | http://localhost:8080?text=крута+українська+озвучка&voice=anatol&name=ukr_audio 18 | 19 | Якщо озвучка занадто гучна чи тиха - параметром `scale` можна задати власну гучність. 20 | * 0 - заглушити звук 21 | * 1 - звичайна гучність 22 | * 2 й більше збільшена гучність 23 | 24 | Гучність, також, можна задати за допомогою десяткових дробів, наприклад: 25 | 26 | http://localhost:8080?text=крута+українська+озвучка&scale=2.1 27 | 28 | 29 | #### Через docker-compose 30 | 31 | ```yaml 32 | version: '2' 33 | services: 34 | tts: 35 | image: nagard/tts 36 | ports: 37 | - "8088:8080" 38 | ``` 39 | 40 | Проект базується на https://github.com/Olga-Yakovleva/RHVoice 41 | -------------------------------------------------------------------------------- /www/Voice.php: -------------------------------------------------------------------------------- 1 | delOldFiles(); 25 | 26 | $this->text = urldecode($text); 27 | $this->voice = $voice ?: 'anatol'; 28 | $this->name = $name ?: uniqid('audio_', true); 29 | $this->scale = is_numeric($scale) ? $scale : 1; 30 | $this->path = getcwd(); 31 | } 32 | 33 | /** 34 | * Озвучує отриманий текст. 35 | * Результат записує в .wav файл. 36 | * Конвертує наш .wav в mp3, для заощадження вільного простору. 37 | * Видаляє .wav 38 | */ 39 | public function createVoice():self 40 | { 41 | $inFile = $this->getInFile(); 42 | $outFile = $this->getOutFile(); 43 | 44 | exec("echo {$this->text} | RHVoice-test -p {$this->voice} -o {$inFile}; lame --scale {$this->scale} {$inFile} {$outFile}; rm {$inFile}"); 45 | 46 | return $this; 47 | } 48 | 49 | /** 50 | * Стрімить озвучку 51 | */ 52 | public function streamVoice():self 53 | { 54 | header("Content-type: {$this->getOutFileMime()}"); 55 | header("Content-Disposition: inline; filename={$this->getOutFileName()}"); 56 | header("Content-Length: {$this->getOutFileSize()}"); 57 | 58 | readfile($this->getOutFile()); 59 | return $this; 60 | } 61 | 62 | /** 63 | * Видаляє всі файли котрі є старіші за вказаний час. 64 | * Без задання час в одну хвилину. 65 | * 66 | * Якщо треба чистити теку від файлів котрим є 30сек - вказуй значення 0.5 67 | * 68 | * @param float $old 69 | */ 70 | public function delOldFiles($old=1.0):void 71 | { 72 | exec("find {$this->path} -mmin +{$old} -type f ! -name '*.php' -exec rm -fv {} \;"); 73 | } 74 | 75 | public function getInFile():string 76 | { 77 | return $this->createFullFilePath($this->getInFileName()); 78 | } 79 | 80 | public function getOutFile():string 81 | { 82 | return $this->createFullFilePath($this->getOutFileName()); 83 | } 84 | 85 | public function getInFileName():string 86 | { 87 | return $this->createFileName(self::EXT_WAV); 88 | } 89 | 90 | public function getOutFileName():string 91 | { 92 | return $this->createFileName(self::EXT_MP3); 93 | } 94 | 95 | public function getOutFileSize():int 96 | { 97 | return (int) filesize($this->getOutFile()); 98 | } 99 | 100 | public function getOutFileMime():string 101 | { 102 | return mime_content_type($this->getOutFileName()); 103 | } 104 | 105 | public function createFileName($ext):string 106 | { 107 | return $this->name . $ext; 108 | } 109 | 110 | public function createFullFilePath($fileName):string 111 | { 112 | return $this->path . DIRECTORY_SEPARATOR . $fileName; 113 | } 114 | } -------------------------------------------------------------------------------- /voice/dicts/Ukrainian/dictionary.txt: -------------------------------------------------------------------------------- 1 | ад+ам 2 | адам+овс* 3 | +адамсон* 4 | адр+ес{,а,ами,и,і,ою,у} 5 | *{додні,ежі,єї,зі,ої,у,я} війн+и 6 | *акарч+ук 7 | *акарчук+а 8 | *о сел+а 9 | ап+остроф 10 | багать+о{м,х} 11 | балачк+и 12 | батьківщ+ин* 13 | {без,біля,від,два,довкола,жителі,жителів,житель,жителям,жителями,жителях,життя,життям,з,зі,із,її,кінець,кінці,кінця,мешканець,мешканці,мешканців,мешканцям,мешканцями,мешканцях,навколо,посеред,початок,початком,початку,серед,три,центр,центрі,центром,чотири} сел+а 14 | бездро/4* 15 | бер+{е,и,у} 16 | берет+е 17 | бод+ай 18 | б+оляче 19 | борг+{ам,ами,ах,и,ів} 20 | б+оці 21 | бояч+ись 22 | бр+ау* 23 | бурштин+* 24 | ватаж+* 25 | вахт+ер* 26 | вв+ечері 27 | виборчк+* 28 | вв+імкнено 29 | вг+ору 30 | вдов+{а,і,ою} 31 | вед+{е,и,у} 32 | веро+* 33 | в+есело 34 | вертоль+от{,а,ам,ами,ах,и,і,ів,ом,у} 35 | ветув+* 36 | взагал+і 37 | вив+о{джу,дити,дить,диш,дь,дьте,дять,жу} 38 | вив+оз* 39 | в+идим* 40 | викид+а* 41 | викон+анн* 42 | використ+анн* 43 | виник+а* 44 | вин+о 45 | випр+обуванн* 46 | випр+остуюсь 47 | в+ирішаться 48 | в+исоко 49 | високопоса+* 50 | височ+і* 51 | вих+оди{мо,ть} 52 | вишив+а* 53 | він+ець 54 | відб+удеться 55 | віддал+ік 56 | відпр+ави* 57 | відпр+ав{лю,лять} 58 | відс+аху* 59 | в+ідча{єм,ї,й,ю} 60 | війн+{а,ою,у} 61 | вікіп+е* 62 | вільн+іш* 63 | Вінт+онів* 64 | вір+ян* 65 | вказівник+* 66 | вн+аслідок 67 | вниз+у 68 | вноч+і 69 | вол+ині 70 | восен+и 71 | вочев+идь 72 | вприт+ул 73 | вр+ази* 74 | втекл+а 75 | втікач+а* 76 | втікач+{еві,ем,і,ів} 77 | вчител+ів 78 | гарбуз+* 79 | гастротур+из* 80 | гер+о{єм,ї,ю} 81 | гер+оя* 82 | гірник+* 83 | гладк+{а,і,ій,у} 84 | гладк+{и,о}* 85 | глух+{а,у} 86 | г+обліна* 87 | г+облін{,и,і,ів,ом,у} 88 | голов+{ами,ах,і,ні} 89 | Головк+* 90 | голосов+і 91 | голуб+{ам,ами,ах,и,ів} 92 | гор+{а,і,ів} 93 | горобц+і 94 | гот+ові 95 | гроз+{а,і,о,ою,у} 96 | грош+има 97 | груд+ей 98 | губ+а{м,ми,х} 99 | гук+{а,н}* 100 | д+авнішн* 101 | давн+о 102 | данин+* 103 | дарм+а 104 | дет+ал{ей,ям,ями,ях} 105 | дзвін+ок 106 | дзвінк+* 107 | дзв+он{имо,ите,ить,иш,ять} 108 | дит+ин{и,у} 109 | дідус+{і,я} 110 | дійшл+а 111 | дір+{а,и,і} 112 | діст+ане 113 | додатк+ов* 114 | дошкільн+* 115 | друж+ин* 116 | дуб+{ам,ами,ах,ів} 117 | жартом+а 118 | жах+* 119 | жив+им 120 | зав+ів 121 | зав+од{ам,ами,ах,і,ів,ом,у} 122 | з+агадок 123 | з+агадк* 124 | зайц+{і,ів,ям,ях} 125 | залюбк+и 126 | зам+ало 127 | з+амість 128 | зан+есен* 129 | з+апросто 130 | з+араз 131 | з+атиш{ком,ку,ок} 132 | зд+алеку 133 | здор+ові 134 | зел+ене 135 | зерн+о 136 | зірк+ов* 137 | знайд+и 138 | знах+од* 139 | золот+им 140 | зр+ештою 141 | зросл+* 142 | зрост+е 143 | зр+учн{а,е,ий,им,ими,их,і,ого,ої,ою,у} 144 | +інколи 145 | +іноді 146 | інспектор+{ам,ами,ах,и,ів} 147 | йог+о 148 | к+алущин* 149 | к+арточ{ки,кою,ку,ці} 150 | карточк+а{м,ми,х} 151 | каф+е 152 | кіберат+* 153 | кіровог+* 154 | клад+е 155 | кл+опот{ам,ами,ах,ів} 156 | коз+{а,і,ою,у} 157 | {задні,нові,передні,старі} кол+еса 158 | кол+и 159 | кол+юч* 160 | ком+усь 161 | кон+{ем,я} 162 | к+ористь 163 | користув+а{вся,тись,тися,ч,чці} 164 | користув+а{н,л,чк}* 165 | користув+ацьк* 166 | користувач+{а,ам,ами,ах,еві,ем,і,ів,у} 167 | корист+у{є,й,ю}* 168 | к+оротко 169 | корупціо+* 170 | корчм+{а,и,і,ою,у} 171 | кос+{а,і,ою} 172 | кот+{а,ам,ами,ах,и,ів,ові,ом,у} 173 | кох+* 174 | краковц+* 175 | крас+ун{і,ям,ями,ях} 176 | крем+езн* 177 | кремл+ю 178 | крил+{і,о} 179 | {анексованому,в,окупованому,у,українському} крим+у 180 | криштал+{еві,ем,і,ю} 181 | кришт+аль 182 | куд+и 183 | кут+{а,і,у} 184 | кущ+{а,ам,ами,ах,і,у} 185 | лиш+е 186 | лів+оруч 187 | л+ід{а,ою} 188 | лікар+{і,ів} 189 | ліс+{ам,ами,ах,и} 190 | літак+{а,ам,ами,ах,и,ів,ові,ом,у} 191 | льв+івщ* 192 | л+ячно 193 | Ляшк+{а,ам,ами,и,ів,о,ові,ом,у} 194 | майстр+{ам,ами,ах,ів} 195 | макс+им{а,ів,у} 196 | макс+имо* 197 | М+алин{,а,і,ом} 198 | мал+ин{,и,і,ка,о,у,ці} 199 | мал+ина* 200 | мар+іч* 201 | м+аркер* 202 | маркер+ов* 203 | медіаюр+ис* 204 | мен+{е,і,ю} 205 | {без,в,від,для,до,з,за,із,на,наперед,про,у,через} {кого,когось,мене,себе,тебе,чого,чогось}/1 206 | мерц+* 207 | мерщ+ій 208 | метк+{а,ою,у} 209 | меч+{а,ам,ами,ах,ем,і,ів,у} 210 | мідяк+* 211 | мішк+а* 212 | міш+{ку,ок} 213 | м+овчки 214 | мог+утніш* 215 | молодц+і 216 | навкруг+и 217 | навк+оло 218 | навманн+я 219 | навпак+и 220 | навп+очіпки 221 | наданн+* 222 | надв+ір 223 | надм+іру 224 | найган+* 225 | нал+іпк* 226 | нап+евно 227 | напівл+ежачи 228 | наполов+ину 229 | наприкінц+і 230 | напр+у* 231 | нар+а{з,зі} 232 | наск+ок* 233 | нат+омість 234 | наход+и{вся,тися} 235 | наход+ил* 236 | н+ачебто 237 | начистот+у 238 | небагать+ох 239 | нев+идим{а,ий,им,ими,их,і,ість,істю,ого,ості,ої,ою} 240 | нев+иконанн* 241 | недопуст+им* 242 | незваж+аючи 243 | некв+апн* 244 | н+еквапом 245 | нем+а 246 | нем+ає 247 | ненад+овго 248 | ненар+оком 249 | неподал+ік 250 | неприйн+ят* 251 | непрост+і 252 | нік+оли 253 | ніяков+іючи 254 | н+іяково 255 | н+огу 256 | облад+ун* 257 | област+{ей,ям,ями,ях} 258 | облік+ові 259 | оддал+ік 260 | оповідач+{а,ем,і} 261 | +осінь 262 | ос+інню 263 | основн+{а,е,і,у} 264 | основн+{и,о}* 265 | +осторонь 266 | ох+айн* 267 | очерет+{ам,ах,и,ів} 268 | павл+{а,і,о,ові,ом,у} 269 | пас+{е,у} 270 | паспорт+{ам,ами,ах,и,ів} 271 | перев+ір{к,ц}* 272 | перезаван+* 273 | перезапуст+ити 274 | перекид+а* 275 | переросл+* 276 | петр+ов* 277 | печ+е 278 | пир{іжок,озі}/3 279 | пирог+* 280 | пл+авл* 281 | по-четв+ерте 282 | поблиз+у 283 | поверх+ові 284 | пов+і{в,з} 285 | под+і{ї,й,ю} 286 | под+ія* 287 | пог+ан{е,і} 288 | поет+ап* 289 | позашляховик+{а,ам,ами,ах,и,ів,ові,ом,у} 290 | поїм+о 291 | п+окидь* 292 | полк+овників 293 | пол+ого* 294 | полон+е* 295 | поль+от* 296 | помил+{ився,ок} 297 | п+оночі 298 | поперв+ах 299 | пор+{а,і,ою} 300 | п+орожньо 301 | п+ор{уч,яд} 302 | посив+і* 303 | поспілкув+* 304 | п+оспіль 305 | поход+ивши 306 | пошт+ів* 307 | праворадик+ал* 308 | прав+оруч 309 | прив'+язк* 310 | призн+ачи{в,ла,ли,ти} 311 | прийд+е* 312 | прийшл+а 313 | приль+* 314 | пров+ів 315 | провідн+{а,е,ий,им,ими,их,і,ій,у} 316 | провідн+о* 317 | проміжн+* 318 | прорахув+* 319 | прор+іза{всь,вся,тись,тися} 320 | прор+ізал* 321 | прослух+о* 322 | прош+ивк* 323 | птах+{ам,ами,ах,и} 324 | р+адісно 325 | раз+{и,ів} 326 | райс+у{д,ду} 327 | райсуд+{ам,ами,ах,іів,ом} 328 | р+аптом 329 | рев+{е,у} 330 | реч+ами 331 | р+івненщ* 332 | роб+оті 333 | роздрук+ів{к,ц,}* 334 | род+ів 335 | рок+ах 336 | рос+{ла,те} 337 | рудок+* 338 | садк+* 339 | сад+ок 340 | сам+{а,і,ої,ого} 341 | своб+од{а,и,і,ою,у} 342 | {в,великому,величезному,їхньому,її,його,маленькому,малесенькому,малому,моєму,на,нашому,невеликому,невеличкому,непомітному,такому,твоєму,тому,цьому,у,українському} сел+і 343 | сел+{ян,яни} 344 | сел+яна* 345 | сир+е 346 | скал+{а,і,ою,у} 347 | склад+{е,на,ного,ної,ному,ною} 348 | складн+{и,ий,им,ими,их,і} 349 | скл+аднощі* 350 | скр+ушно 351 | сліп+{а,і,им,у} 352 | см+ачно 353 | смет+ан{а,и,і,ою,у} 354 | сміт+{ник,ті,тю,тя,тям} 355 | смітник+* 356 | сніговик+* 357 | совк+* 358 | сов+ок 359 | спад+е 360 | спіш+{ать,ив,ила,или,ило,ити,ить,иш,у} 361 | спішим+{о,те} 362 | спонук+а{в,ла,ли,ло,ти,ю,ють} 363 | спонук+ає* 364 | спр+отив{,і,ом,у} 365 | *ст+ане 366 | стар+і{є,ю}* 367 | старт+ап* 368 | {дві,три,чотири} сторон+и 369 | сто+янк* 370 | стр+ашно 371 | стріл+{а,і,о,ою,у} 372 | супр+отив{,і,ом,у} 373 | суїцид+ал* 374 | сюд+и 375 | так+{а,е,и,ий,им,ими,их,і,о,ої,ою,сі,у} 376 | татарв+* 377 | тверд+{е,им} 378 | т+екстов{а,е,им,ими,их,ого,ої,ому,ою,у} 379 | тир+е 380 | тік+а{в,є,ла,ло,ти,ючи} 381 | тод+і 382 | травн+еві 383 | тр+амп{а,у} 384 | трус+{ам,ами,ах,ів,и} 385 | туд+и 386 | ув+імкнено 387 | ув+ечері 388 | удов+{а,і,ою} 389 | уж+е 390 | узагал+і 391 | униз+у 392 | уноч+і 393 | уприт+ул 394 | +усміш{ка,кам,ками,ках,ки,кою,ку,ок,ці} 395 | утекл+а 396 | утікач+{а,ам,ами,ах,ем,еві,ів} 397 | флешм+об{,ам,ами,ах,і,ів,ом,у} 398 | франк+івс* 399 | франк+івщ* 400 | франсу+а 401 | хал+е* 402 | характ+ерн* 403 | хатк+и 404 | хіб+а 405 | х+ортиц{ею,і,я} 406 | хот+ів 407 | ч+ерез 408 | червн+еві 409 | четв+ерт{е,і} 410 | числ+о 411 | числ+е* 412 | чоловік+{ам,ами,ах,и,ів} 413 | чом+у 414 | чотирь+ох 415 | шатл-б+ас* 416 | шкереб+ерть 417 | шмат+{ок 418 | шматк+* 419 | щос+или 420 | як+{а,е,і,о,ої,ою,у} 421 | як+и* 422 | --------------------------------------------------------------------------------