readme/README_rus.md
CPU/GPU ΠΊΠΎΠ½Π²Π΅ΡΡΠ΅Ρ ΠΈΠ· ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ Π² Π°ΡΠ΄ΠΈΠΎΠΊΠ½ΠΈΠ³Ρ Ρ Π³Π»Π°Π²Π°ΠΌΠΈ ΠΈ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠΌΠΈ
Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄ΠΎΠ²ΡΡ Π΄Π²ΠΈΠΆΠΊΠΎΠ² TTS ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΎΠ³ΠΎ.
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΊΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π³ΠΎΠ»ΠΎΡΠ° ΠΈ 1158 ΡΠ·ΡΠΊΠΎΠ²!
ΠΠ°ΠΆΠ½ΠΎ ΠΡΠΎΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΡΠΌΠΈ ΠΊΠ½ΠΈΠ³Π°ΠΌΠΈ Π±Π΅Π· DRM, ΠΏΡΠΈΠΎΠ±ΡΠ΅ΡΡΠ½Π½ΡΠΌΠΈ Π·Π°ΠΊΠΎΠ½Π½ΡΠΌ ΠΏΡΡΡΠΌ.
ΠΠ²ΡΠΎΡΡ Π½Π΅ Π½Π΅ΡΡΡ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΠΈ Π·Π° Π»ΡΠ±ΠΎΠ΅ Π½Π΅ΠΏΡΠ°Π²ΠΎΠΌΠ΅ΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π·Π° Π²ΡΡΠ΅ΠΊΠ°ΡΡΠΈΠ΅ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΏΡΠ°Π²ΠΎΠ²ΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡ.
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΡΠΎΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ ΠΈ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ ΡΠΎ Π²ΡΠ΅ΠΌΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΡΠΌΠΈ Π·Π°ΠΊΠΎΠ½Π°ΠΌΠΈ.
</a><a href="https://hub.docker.com/r/athomasson2/ebook2audiobook">
</a>ΠΠ΅ΠΌΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π³ΠΎΠ»ΠΎΡΠ° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ
https://github.com/user-attachments/assets/750035dc-e355-46f1-9286-05c1d9e88cea
<details> <summary>ΠΠΎΠ»ΡΡΠ΅ Π΄Π΅ΠΌΠΎ</summary>ΠΠΎΠ»ΠΎΡ ASMR
https://github.com/user-attachments/assets/68eee9a1-6f71-4903-aacd-47397e47e422
ΠΠΎΠ»ΠΎΡ Π΄ΠΎΠΆΠ΄Π»ΠΈΠ²ΠΎΠ³ΠΎ Π΄Π½Ρ
https://github.com/user-attachments/assets/d25034d9-c77f-43a9-8f14-0d167172b080
ΠΠΎΠ»ΠΎΡ Π‘ΠΊΠ°ΡΠ»Π΅ΡΡ
https://github.com/user-attachments/assets/b12009ee-ec0d-45ce-a1ef-b3a52b9f8693
ΠΠΎΠ»ΠΎΡ ΠΡΠ²ΠΈΠ΄Π° ΠΡΡΠ΅Π½Π±ΠΎΡΠΎ
https://github.com/user-attachments/assets/81c4baad-117e-4db5-ac86-efc2b7fea921
ΠΡΠΈΠΌΠ΅Ρ
</details>ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΡΠΎΡΠΌΠ°ΡΡ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΡΡ ΠΊΠ½ΠΈΠ³
π§ ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ Π΄Π²ΠΈΠΆΠΊΠΈ TTS: XTTSv2, Bark, Fairseq, VITS, Tacotron2, Tortoise, GlowTTS, YourTTS
π ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΡΠΎΡΠΌΠ°ΡΠΎΠ² ΡΠ°ΠΉΠ»ΠΎΠ²: .epub, .mobi, .azw3, .fb2, .lrf, .rb, .snb, .tcr, .pdf, .txt, .rtf, .doc, .docx, .html, .odt, .azw, .tiff, .tif, .png, .jpg, .jpeg, .bmp, .zip
π» Π’Π΅ΠΊΡΡΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π΄Π»Ρ ΠΏΡΡΠΌΠΎΠ³ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΡΠΎΡΠΊΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠ° Π² Π°ΡΠ΄ΠΈΠΎ
π Π‘ΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ OCR Π΄Π»Ρ ΡΠ°ΠΉΠ»ΠΎΠ² Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΌΠΈ ΡΡΡΠ°Π½ΠΈΡΠ°ΠΌΠΈ Π² Π²ΠΈΠ΄Π΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ
π ΠΡΡΠΎΠΊΠΎΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠ° Π² ΡΠ΅ΡΡ, ΠΎΡ ΠΏΠΎΡΡΠΈ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π΄ΠΎ ΠΏΠΎΡΡΠΈ Π½Π°ΡΡΠΎΡΡΠ΅Π³ΠΎ Π³ΠΎΠ»ΠΎΡΠ°
π£οΈ ΠΠ΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΊΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π³ΠΎΠ»ΠΎΡΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π²Π°ΡΠ΅Π³ΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ Π³ΠΎΠ»ΠΎΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°
π ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ 1158 ΡΠ·ΡΠΊΠΎΠ² (supported languages list)
π» ΠΡΡΠΆΠ΅Π»ΡΠ±Π΅Π½ ΠΊ ΡΠ»Π°Π±ΡΠΌ ΡΠ΅ΡΡΡΡΠ°ΠΌ β ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π° 2 ΠΠ ΠΠΠ£ / 1 ΠΠ VRAM (ΠΌΠΈΠ½ΠΈΠΌΡΠΌ)
π΅ Π€ΠΎΡΠΌΠ°ΡΡ Π²ΡΠ²ΠΎΠ΄Π° Π°ΡΠ΄ΠΈΠΎΠΊΠ½ΠΈΠ³ΠΈ: mono or stereo aac, flac, mp3, m4b, m4a, mp4, mov, ogg, wav, webm
π§ ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠ΅Π³ΠΎΠ² SML β ΡΠΎΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π½Π°Π΄ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡΠΌΠΈ, ΠΏΠ°ΡΠ·Π°ΠΌΠΈ, ΡΠΌΠ΅Π½ΠΎΠΉ Π³ΠΎΠ»ΠΎΡΠ° ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠΌ Π΄ΡΡΠ³ΠΈΠΌ (see below)
π§© ΠΠ΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Π°Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠ°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π²Π°ΡΠ΅ΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΠΎΠ±ΡΡΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ (XTTSv2, VITS, FAIRSEQ, PIPER, others on request)
ποΈ ΠΠΎΠΎΠ±ΡΡΠ΅Π½Π½ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΎΠ±ΡΡΠ΅Π½Π½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ E2A
<i>(Π‘Π²ΡΠΆΠΈΡΠ΅ΡΡ Ρ Π½Π°ΠΌΠΈ, Π΅ΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π΄ΠΎΠΎΠ±ΡΡΠ΅Π½Π½ΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΈΠ»ΠΈ Π΅ΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ ΡΠ²ΠΎΠΈΠΌΠΈ Π² ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅ ΠΏΡΠ΅Π΄ΡΡΡΠ°Π½ΠΎΠ²ΠΎΠΊ)</i>
*<i> Π‘ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π΄Π²ΠΈΠΆΠΊΠΈ TTS ΠΎΡΠ΅Π½Ρ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ Π½Π° CPU, ΠΏΠΎΡΡΠΎΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ TTS Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ ΠΊΠ°ΡΠ΅ΡΡΠ²Π°, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ YourTTS, Tacotron2 ΠΈ Ρ. Π΄.</i>
| ΠΡΠ°Π±ΡΠΊΠΈΠΉ (ar) | ΠΠΈΡΠ°ΠΉΡΠΊΠΈΠΉ (zh) | ΠΠ½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ (en) | ΠΡΠΏΠ°Π½ΡΠΊΠΈΠΉ (ΡΠ΅) |
|---|---|---|---|
| Π€ΡΠ°Π½ΡΡΠ·ΡΠΊΠΈΠΉ (fr) | ΠΠ΅ΠΌΠ΅ΡΠΊΠΈΠΉ (de) | ΠΡΠ°Π»ΡΡΠ½ΡΠΊΠΈΠΉ (it) | ΠΠΎΡΡΡΠ³Π°Π»ΡΡΠΊΠΈΠΉ (pt) |
| ΠΠΎΠ»ΡΡΠΊΠΈΠΉ (pl) | Π’ΡΡΠ΅ΡΠΊΠΈΠΉ (tr) | Π ΡΡΡΠΊΠΈΠΉ (ru) | ΠΠΎΠ»Π»Π°Π½Π΄ΡΠΊΠΈΠΉ (nl) |
| Π§Π΅ΡΡΠΊΠΈΠΉ (cs) | Π―ΠΏΠΎΠ½ΡΠΊΠΈΠΉ (ja) | Π₯ΠΈΠ½Π΄ΠΈ (hi) | ΠΠ΅Π½Π³Π°Π»ΡΡΠΊΠΈΠΉ (bn) |
| ΠΠ΅Π½Π³Π΅ΡΡΠΊΠΈΠΉ (hu) | ΠΠΎΡΠ΅ΠΉΡΠΊΠΈΠΉ (ko) | ΠΡΠ΅ΡΠ½Π°ΠΌΡΠΊΠΈΠΉ (vi) | Π¨Π²Π΅Π΄ΡΠΊΠΈΠΉ (sv) |
| ΠΠ΅ΡΡΠΈΠ΄ΡΠΊΠΈΠΉ (fa) | ΠΠΎΡΡΠ±Π° (yo) | Π‘ΡΠ°Ρ ΠΈΠ»ΠΈ (sw) | ΠΠ½Π΄ΠΎΠ½Π΅Π·ΠΈΠΉΡΠΊΠΈΠΉ (id) |
| Π‘Π»ΠΎΠ²Π°ΡΠΊΠΈΠΉ (sk) | Π₯ΠΎΡΠ²Π°ΡΡΠΊΠΈΠΉ (hr) | Π’Π°ΠΌΠΈΠ»ΡΡΠΊΠΈΠΉ (ta) | ΠΠ°ΡΡΠΊΠΈΠΉ (da) |
.epub, .pdf, .mobi, .txt, .html, .rtf, .chm, .lit,
.pdb, .fb2, .odt, .cbr, .cbz, .prc, .lrf, .pml,
.snb, .cbc, .rb, .tcr.epub ΠΈΠ»ΠΈ .mobi Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π³Π»Π°Π².m4b, .m4a, .mp4, .webm, .mov, .mp3, .flac, .wav, .ogg, .aac[break] β ΡΠΈΡΠΈΠ½Π° (ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ 0.3β0.6 sec.)[pause] β ΡΠΈΡΠΈΠ½Π° (ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ 1.0β1.6 sec.)[pause:N] β ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΠΏΠ°ΡΠ·Π° (N sec.)[voice:/path/to/voice/file]...[/voice] β ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π³ΠΎΠ»ΠΎΡΠ° Ρ Π³ΠΎΠ»ΠΎΡΠ° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΠ»ΠΈ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ ΠΈΠ· GUI/CLIΠΡΠΎΠ²Π΅ΡΡΡΠ΅ Π½Π°Ρ Π΄ΡΡΠ³ΠΎΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΠΉ Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ SML Π² Π²Π°ΡΡ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΡΡ ΠΊΠ½ΠΈΠ³Ρ -> E2A-SML
ΠΠ°ΠΆΠ½ΠΎ **ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ°ΡΡ ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ΅ Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΎΠΉ ΠΈΠ»ΠΈ ΠΎΡΠΈΠ±ΠΊΠ΅, Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠΈΡΠΈΡΠ΅ Π²ΠΎ Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ ΠΎΡΠΊΡΡΡΡΡ ΠΈ Π·Π°ΠΊΡΡΡΡΡ Π·Π°Π΄Π°Ρ
ΡΡΠΎΠ±Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ Π²Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π΅ΡΡ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ.**
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ **Π€ΠΎΡΠΌΠ°Ρ EPUB Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠ΅ΠΉ, ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Π³Π»Π°Π²Π°, Π°Π±Π·Π°Ρ, ΠΏΡΠ΅Π΄ΠΈΡΠ»ΠΎΠ²ΠΈΠ΅ ΠΈ Ρ. Π΄.
ΠΠΎΡΡΠΎΠΌΡ ΡΠ½Π°ΡΠ°Π»Π° Π²Π°ΠΌ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π²ΡΡΡΠ½ΡΡ ΡΠ΄Π°Π»ΠΈΡΡ Π²Π΅ΡΡ ΡΠ΅ΠΊΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ Π½Π΅ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²ΡΠ²Π°ΡΡ Π² Π°ΡΠ΄ΠΈΠΎ.**
Clone repo
git clone https://github.com/DrewThomasson/ebook2audiobook.git
cd ebook2audiobook
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ / ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ebook2audiobook:
Linux/MacOS
./ebook2audiobook.command
<i>Note for MacOS users: homebrew is installed to install missing programs.</i>
ΠΠ°ΡΠ½ΡΠ΅Ρ Π΄Π»Ρ Mac
ΠΠ²Π°ΠΆΠ΄Ρ ΡΡΠ»ΠΊΠ½ΠΈΡΠ΅ Mac Ebook2Audiobook Launcher.command
Windows
ebook2audiobook.cmd
or
Double click ebook2audiobook.cmd
<i>ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ Π΄Π»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Windows: ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ scoop Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ Π±Π΅Π· ΠΏΡΠ°Π² Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ°.</i>
ΠΡΠΊΡΠΎΠΉΡΠ΅ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅: ΠΠ°ΠΆΠΌΠΈΡΠ΅ Π½Π° URL, ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π΅, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²ΡΠ²Π°ΡΡ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΡΠ΅ ΠΊΠ½ΠΈΠ³ΠΈ. http://localhost:7860/
ΠΠ»Ρ ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎΠΉ ΡΡΡΠ»ΠΊΠΈ:
./ebook2audiobook.command --share (Linux/MacOS)
ebook2audiobook.cmd --share (Windows)
python app.py --share (Π²ΡΠ΅ ΠΠ‘)
ΠΠ°ΠΆΠ½ΠΎ **ΠΡΠ»ΠΈ ΡΠΊΡΠΈΠΏΡ ΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ ΠΈ Π·Π°ΠΏΡΡΠ΅Π½ ΡΠ½ΠΎΠ²Π°, Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ Π²Π°Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Gradio GUI
ΡΡΠΎΠ±Ρ Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡΠ° ΡΠΌΠΎΠ³Π»Π° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ ΠΊ Π½ΠΎΠ²ΠΎΠΌΡ ΡΠΎΠΊΠ΅ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ.**
Linux/MacOS:
./ebook2audiobook.command --headless --ebook <path_to_ebook_file> --voice <path_to_voice_file> --language <language_code>
Windows
ebook2audiobook.cmd --headless --ebook <path_to_ebook_file> --voice <path_to_voice_file> --language <language_code>
[--ebook]: ΠΡΡΡ ΠΊ ΡΠ°ΠΉΠ»Ρ Π²Π°ΡΠ΅ΠΉ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ
[--voice]: ΠΡΡΡ ΠΊ ΡΠ°ΠΉΠ»Ρ Π΄Π»Ρ ΠΊΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π³ΠΎΠ»ΠΎΡΠ° (Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ)
[--language]: ΠΠΎΠ΄ ΡΠ·ΡΠΊΠ° Π² ISO-639-3 (Ρ. Π΅.: ita Π΄Π»Ρ ΠΈΡΠ°Π»ΡΡΠ½ΡΠΊΠΎΠ³ΠΎ, eng Π΄Π»Ρ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠ³ΠΎ, deu Π΄Π»Ρ Π½Π΅ΠΌΠ΅ΡΠΊΠΎΠ³ΠΎ...).
Π―Π·ΡΠΊ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ β eng, ΠΈ --language ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌ Π΄Π»Ρ ΡΠ·ΡΠΊΠ° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π² ./lib/lang.py.
Π’Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ Π΄Π²ΡΡ Π±ΡΠΊΠ²Π΅Π½Π½ΡΠ΅ ΠΊΠΎΠ΄Ρ ISO-639-1.
(must be a .zip file containing the mandatory model files. Example for XTTSv2: config.json, model.pth, vocab.json and ref.wav)
Linux/MacOS
./ebook2audiobook.command --headless --ebook <ebook_file_path> --language <language> --custom_model <custom_model_path>
Windows
ebook2audiobook.cmd --headless --ebook <ebook_file_path> --language <language> --custom_model <custom_model_path>
<i>Note: the ref.wav of your custom model is always the voice selected for the conversion</i>
<custom_model_path>: ΠΡΡΡ ΠΊ ΡΠ°ΠΉΠ»Ρ model_name.zip,
ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ (Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π΄Π²ΠΈΠΆΠΊΠ° tts) Π²ΡΠ΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ
(ΡΠΌ. ./lib/models.py).
./ebook2audiobook.command --help
ebook2audiobook.cmd --help
python app.py --help <a id="help-command-output"></a>
usage: app.py [-h] [--session SESSION] [--share] [--headless] [--ebook EBOOK] [--ebooks_dir EBOOKS_DIR]
[--language LANGUAGE] [--voice VOICE] [--voice_map VOICE_MAP] [--device {CPU,CUDA,MPS,ROCM,XPU,JETSON}]
[--tts_engine {XTTS,BARK,VITS,FAIRSEQ,TACOTRON,YOURTTS,xtts,bark,vits,fairseq,tacotron,yourtts}]
[--custom_model CUSTOM_MODEL] [--fine_tuned FINE_TUNED] [--output_format OUTPUT_FORMAT]
[--output_channel OUTPUT_CHANNEL] [--temperature TEMPERATURE] [--length_penalty LENGTH_PENALTY]
[--num_beams NUM_BEAMS] [--repetition_penalty REPETITION_PENALTY] [--top_k TOP_K] [--top_p TOP_P]
[--speed SPEED] [--enable_text_splitting] [--text_temp TEXT_TEMP] [--waveform_temp WAVEFORM_TEMP]
[--output_dir OUTPUT_DIR] [--version]
Convert eBooks to Audiobooks using a Text-to-Speech model. You can either launch the Gradio interface or run the script in headless mode for direct conversion.
options:
-h, --help show this help message and exit
--session SESSION Session to resume the conversion in case of interruption, crash,
or reuse of custom models and custom cloning voices.
**** The following option is for gradio/gui mode only:
--share (Optional) Enable a public shareable Gradio link.
**** The following options are for --headless mode only:
--headless Run the script in headless mode
--ebook EBOOK Path to the ebook file for conversion. Cannot be used when --ebooks_dir is present.
--ebooks_dir EBOOKS_DIR
Relative or absolute path of the directory containing the files to convert.
Cannot be used when --ebook is present.
--text TEXT Raw text for conversion. Cannot be used when --ebook or --ebooks_dir is present.
--language LANGUAGE Language of the e-book. Default language is set
in ./lib/lang.py sed as default if not present. All compatible language codes are in ./lib/lang.py
optional parameters:
--translate ISO3 (Optional) Translate ebook to a target language (ISO 639-3 code, e.g. eng, fra, deu) before TTS synthesis.
Uses argostranslate. The target language becomes the effective TTS language for the run.
A copy of the source ebook is made with the _<iso3> suffix so translated and non-translated
outputs stay isolated (independent process folder, audio chunks, and final file).
--voice VOICE (Optional) Path to the voice cloning file for TTS engine.
Uses the default voice if not present.
--voice_map VOICE_MAP
(Optional, --ebooks_dir only) Path to a JSON file mapping ebook path -> voice path.
Each entry overrides --voice for that specific ebook. Missing/null entries fall back to --voice.
Keys may be absolute paths or basenames. Example:
{"book1.epub": "/voices/eng/adult/female/alice.wav", "/abs/path/book2.epub": null}
--device {CPU,CUDA,MPS,ROCM,XPU,JETSON}
(Optional) Processor unit type for the conversion.
Default is set in ./lib/conf.py if not present. Fall back to CPU if CUDA or MPS is not available.
--tts_engine {XTTS,BARK,VITS,FAIRSEQ,TACOTRON,YOURTTS,xtts,bark,vits,fairseq,tacotron,yourtts}
(Optional) Preferred TTS engine (available are: ['XTTS', 'BARK', 'VITS', 'FAIRSEQ', 'TACOTRON', 'YOURTTS', 'xtts', 'bark', 'vits', 'fairseq', 'tacotron', 'yourtts'].
Default depends on the selected language. The tts engine should be compatible with the chosen language
--custom_model CUSTOM_MODEL
(Optional) Path to the custom model zip file cntaining mandatory model files.
Please refer to ./lib/models.py
--fine_tuned FINE_TUNED
(Optional) Fine tuned model path. Default is builtin model.
--output_format OUTPUT_FORMAT
(Optional) Output audio format. Default is m4b set in ./lib/conf.py
--output_channel OUTPUT_CHANNEL
(Optional) Output audio channel. Default is mono set in ./lib/conf.py
--temperature TEMPERATURE
(xtts only, optional) Temperature for the model.
Default to config.json model. Higher temperatures lead to more creative outputs.
--length_penalty LENGTH_PENALTY
(xtts only, optional) A length penalty applied to the autoregressive decoder.
Default to config.json model. Not applied to custom models.
--num_beams NUM_BEAMS
(xtts only, optional) Controls how many alternative sequences the model explores. Must be equal or greater than length penalty.
Default to config.json model.
--repetition_penalty REPETITION_PENALTY
(xtts only, optional) A penalty that prevents the autoregressive decoder from repeating itself.
Default to config.json model.
--top_k TOP_K (xtts only, optional) Top-k sampling.
Lower values mean more likely outputs and increased audio generation speed.
Default to config.json model.
--top_p TOP_P (xtts only, optional) Top-p sampling.
Lower values mean more likely outputs and increased audio generation speed. Default to config.json model.
--speed SPEED (xtts only, optional) Speed factor for the speech generation.
Default to config.json model.
--enable_text_splitting
(xtts only, optional) Enable TTS text splitting. This option is known to not be very efficient.
Default to config.json model.
--text_temp TEXT_TEMP
(bark only, optional) Text Temperature for the model.
Default to config.json model.
--waveform_temp WAVEFORM_TEMP
(bark only, optional) Waveform Temperature for the model.
Default to config.json model.
--output_dir OUTPUT_DIR
(Optional) Path to the output directory. Default is set in ./lib/conf.py
--version Show the version of the script and exit
Example usage:
Windows:
Gradio/GUI:
ebook2audiobook.cmd
Headless mode:
ebook2audiobook.cmd --headless --ebook '/path/to/file' --language eng
Linux/Mac:
Gradio/GUI:
./ebook2audiobook.command
Headless mode:
./ebook2audiobook.command --headless --ebook '/path/to/file' --language eng
SML tags available:
[break] β silence (random range **0.3β0.6 sec.**)
[pause] β silence (random range **1.0β1.6 sec.**)
[pause:N] β fixed pause (**N sec.**)
[voice:/path/to/voice/file]...[/voice] β switch voice from default or selected voice from GUI/CLI
ΠΠ ΠΠΠΠ§ΠΠΠΠ: Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ gradio/gui, ΡΡΠΎΠ±Ρ ΠΎΡΠΌΠ΅Π½ΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠ΅Π΅ΡΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΏΡΠΎΡΡΠΎ Π½Π°ΠΆΠΌΠΈΡΠ΅ [X] ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ. Π‘ΠΠΠΠ’: Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½Π° ΡΡΡΡ Π±ΠΎΠ»ΡΡΠ°Ρ ΠΏΠ°ΡΠ·Π°, Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ '[pause:3]' Π΄Π»Ρ 3 ΡΠ΅ΠΊ. ΠΈ Ρ. Π΄.
git clone https://github.com/DrewThomasson/ebook2audiobook.git
cd ebook2audiobook
Windows:
Docker:
ebook2audiobook.cmd --script_mode build_docker
Docker Compose:
ebook2audiobook.cmd --script_mode build_docker --docker_mode compose
Podman Compose:
ebook2audiobook.cmd --script_mode build_docker --docker_mode podman
Linux/Mac
Docker:
./ebook2audiobook.command --script_mode build_docker
Docker Compose
./ebook2audiobook.command --script_mode build_docker --docker_mode compose
Podman Compose:
./ebook2audiobook.command --script_mode build_docker --docker_mode podman
Docker run image:
Gradio/GUI:
CPU:
docker run -v "./ebooks:/app/ebooks" -v "./audiobooks:/app/audiobooks" -v "./models:/app/models" -v "./voices:/app/voices" -v "./tmp:/app/tmp" --rm -it -p 7860:7860 athomasson2/ebook2audiobook:cpu
CUDA:
docker run -v "./ebooks:/app/ebooks" -v "./audiobooks:/app/audiobooks" -v "./models:/app/models" -v "./voices:/app/voices" -v "./tmp:/app/tmp" --gpus all --rm -it -p 7860:7860 athomasson2/ebook2audiobook:cu[118/122/124/126 etc..]
ROCM:
docker run -v "./ebooks:/app/ebooks" -v "./audiobooks:/app/audiobooks" -v "./models:/app/models" -v "./voices:/app/voices" -v "./tmp:/app/tmp" --device=/dev/kfd --device=/dev/dri --rm -it -p 7860:7860 athomasson2/ebook2audiobook:rocm[6.0/6.1/6.4 etc..]
XPU:
docker run -v "./ebooks:/app/ebooks" -v "./audiobooks:/app/audiobooks" -v "./models:/app/models" -v "./voices:/app/voices" -v "./tmp:/app/tmp" --device=/dev/dri --rm -it -p 7860:7860 athomasson2/ebook2audiobook:xpu
JETSON:
docker run -v "./ebooks:/app/ebooks" -v "./audiobooks:/app/audiobooks" -v "./models:/app/models" -v "./voices:/app/voices" -v "./tmp:/app/tmp" --runtime nvidia --rm -it -p 7860:7860 athomasson2/ebook2audiobook:jetson[51/60/61 etc...]
Headless mode:
CPU:
docker run -v "./ebooks:/app/ebooks" -v "./audiobooks:/app/audiobooks" -v "./models:/app/models" -v "./voices:/app/voices" -v "./tmp:/app/tmp" -v "/my/real/ebooks/folder/absolute/path:/app/another_ebook_folder" --rm -it -p 7860:7860 ebook2audiobook:cpu --headless --ebook "/app/another_ebook_folder/myfile.pdf" [--voice /app/my/voicepath/voice.mp3 etc..]
CUDA:
docker run -v "./ebooks:/app/ebooks" -v "./audiobooks:/app/audiobooks" -v "./models:/app/models" -v "./voices:/app/voices" -v "./tmp:/app/tmp" -v "/my/real/ebooks/folder/absolute/path:/app/another_ebook_folder" --gpus all --rm -it -p 7860:7860 ebook2audiobook:cu[118/122/124/126 etc..] --headless --ebook "/app/another_ebook_folder/myfile.pdf" [--voice /app/my/voicepath/voice.mp3 etc..]
ROCM:
docker run -v "./ebooks:/app/ebooks" -v "./audiobooks:/app/audiobooks" -v "./models:/app/models" -v "./voices:/app/voices" -v "./tmp:/app/tmp" -v "/my/real/ebooks/folder/absolute/path:/app/another_ebook_folder" --device=/dev/kfd --device=/dev/dri --rm -it -p 7860:7860 ebook2audiobook:rocm[6.0/6.1/6.4 etc.] --headless --ebook "/app/another_ebook_folder/myfile.pdf" [--voice /app/my/voicepath/voice.mp3 etc..]
XPU:
docker run -v "./ebooks:/app/ebooks" -v "./audiobooks:/app/audiobooks" -v "./models:/app/models" -v "./voices:/app/voices" -v "./tmp:/app/tmp" -v "/my/real/ebooks/folder/absolute/path:/app/another_ebook_folder" --device=/dev/dri --rm -it -p 7860:7860 ebook2audiobook:xpu --headless --ebook "/app/another_ebook_folder/myfile.pdf" [--voice /app/my/voicepath/voice.mp3 etc..]
JETSON:
docker run -v "./ebooks:/app/ebooks" -v "./audiobooks:/app/audiobooks" -v "./models:/app/models" -v "./voices:/app/voices" -v "./tmp:/app/tmp" -v "/my/real/ebooks/folder/absolute/path:/app/another_ebook_folder" --runtime nvidia --rm -it -p 7860:7860 ebook2audiobook:jetson[51/60/61 etc.] --headless --ebook "/app/another_ebook_folder/myfile.pdf" [--voice /app/my/voicepath/voice.mp3 etc..]
Docker Compose (i.e. cuda 12.8:
Run Gradio GUI:
DEVICE_TAG=cu128 docker compose --profile gpu up --no-log-prefix
Run Headless mode:
DEVICE_TAG=cu128 docker compose --profile gpu run --rm ebook2audiobook --headless --ebook "/app/ebooks/myfile.pdf" --voice /app/voices/eng/adult/female/some_voice.wav etc..
Podman Compose (i.e. cuda 12.8:
Run Gradio GUI:
DEVICE_TAG=cu128 podman-compose -f podman-compose.yml --profile gpu up
Run Headless mode:
DEVICE_TAG=cu128 podman-compose -f podman-compose.yml --profile gpu run --rm ebook2audiobook-gpu --headless --ebook "/app/ebooks/myfile.pdf" --voice /app/voices/eng/adult/female/some_voice.wav etc..
ΠΠ»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ XTTSv2 ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»Π΅Π½ ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠ½ΡΠΉ Π°ΡΠ΄ΠΈΠΎΠΊΠ»ΠΈΠΏ Π³ΠΎΠ»ΠΎΡΠ°:
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ libs/conf.py, ΡΡΠΎΠ±Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΈΠ»ΠΈ ΡΠ΄Π°Π»ΡΡΡ Π½ΡΠΆΠ½ΡΠ΅ Π²Π°ΠΌ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ. ΠΡΠ»ΠΈ Π²Ρ ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΡΠ΅ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, ΠΏΡΠΎΡΡΠΎ ΡΠ΄Π΅Π»Π°ΠΉΡΠ΅ ΠΊΠΎΠΏΠΈΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ conf.py, ΡΡΠΎΠ±Ρ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ebook2audiobook Π²Ρ ΠΌΠΎΠ³Π»ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ΅Π·Π΅ΡΠ²Π½ΡΡ ΠΊΠΎΠΏΠΈΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΠ½Π½ΠΎΠ³ΠΎ conf.py ΠΈ Π²Π΅ΡΠ½ΡΡΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π». ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΡ ΠΆΠ΅ ΠΏΡΠΎΡΠ΅ΡΡ Π΄Π»Ρ models.py. ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ²ΠΎΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π΄ΠΎΠΎΠ±ΡΡΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΡΡ ebook2audiobook, ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΡΠ²ΡΠΆΠΈΡΠ΅ΡΡ Ρ Π½Π°ΠΌΠΈ, ΠΈ ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΅Ρ Π² ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΠ΅Π΄ΡΡΡΠ°Π½ΠΎΠ²ΠΎΠΊ.
Releases can be found -> here
git checkout tags/VERSION_NUM # Locally/Compose -> Example: git checkout tags/v25.7.7
--help Π² ΠΊΠΎΠ½Π΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ docker run Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ.ΠΡΠΈΠΌΠ΅Ρ:
import json
from typing import Optional
def get_user(user_id:int, users:list[dict])->Optional[dict]:
for user in users:
if user['id'] == user_id:
return user
return None
def summarize(user:dict)->str:
return f"User {user['name']} is {'active' if user['is_active'] else 'inactive'}."
def to_json(user:dict)->str:
return json.dumps({"id": user['id'], "name": user['name'], "email": user['email']})
users:list = [
dict(id=1, name="alice", email="[email protected]", role="admin", is_active=True),
dict(id=2, name="bob", email="[email protected]", role="editor", is_active=False),
dict(id=3, name="carol", email="[email protected]", role="viewer", is_active=True),
]
config = {
"max_users": 100,
"default_role": "viewer",
"allow_signup": True,
}
roles = ['admin', 'editor', 'viewer']
found = get_user(1, users)
if found:
print(summarize(found))
print(found['email'])
print(to_json(found))
if config['default_role'] in roles:
print(config['default_role'])
ΠΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ Π»ΡΠ±ΠΎΠ΅ ΠΎΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π°ΡΠ΅ΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
@DrewThomasson, Π΅ΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΠΎΠΌΠΎΡΡ Π»ΡΠ±ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ! π
<!-- ## ΠΡΠΆΠ½ΠΎ Π»ΠΈ Π²Π°ΠΌ Π°ΡΠ΅Π½Π΄ΠΎΠ²Π°ΡΡ GPU Π΄Π»Ρ ΡΡΠΈΠ»Π΅Π½ΠΈΡ Π½Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΡΠ²ΠΈΡΠ°? - ΠΠΏΡΠΎΡ ΠΎΡΠΊΡΡΡ Π·Π΄Π΅ΡΡ https://github.com/DrewThomasson/ebook2audiobook/discussions/889 -->