Skip to content

Repository files navigation

BelVoice - фрэймварк апрацоўкі беларускага маўлення

Гэты фрэймварк дае доступ да перадавых на сённяшні дзень (SOTA) тэхналогій апрацоўкі голасу для беларускай мовы. Наша галоўная мэта — не проста механічнае пераўтварэнне тэксту ў гук, а забеспячэнне правільнага і натуральнага беларускага вымаўлення з улікам усіх фанетычных законаў (асіміляцыя, аканне, яканне, змякчэнне і г.д.).

Фрэймварк утрымлівае модулі для сінтэзу (TTS) і распазнавання (ASR) маўлення. Ён пабудаваны па модульным прынцыпе, прапаноўваючы розныя варыянты рэалізацыі кожнага этапу. Гэтыя варыянты адрозніваюцца па:

  • Тыпу кампанентаў (выключна лакальныя або з выкарыстаннем знешніх API).
  • Патрабаваннях да вылічальных рэсурсаў (CPU / GPU) і фінансавых выдатках.
  • Выніковай якасці апрацоўкі (хуткія чарнавыя варыянты супраць SOTA рашэнняў).

Модулі можна гнутка камбінаваць у залежнасці ад вашых патрэбаў. Яны напісаная на Python, ці маюць Python-абгортку. Архітэктура дазваляе злучаць модулі простымі выклікамі функцый, а таксама правяраць і падпраўляць прамежкавы вынік на кожным кроку апрацоўкі.

Паслядоўнасць сінтэзу маўлення (TTS Pipeline)

Каб атрымаць якасную агучку, тэкст мусіць прайсці некалькі стадый падрыхтоўкі перад самім сінтэзам:

  1. Нармалізацыя — разгортванне скаротаў, абрэвіятур, ператварэнне лічбаў і сімвалаў у словы ў правільным склоне.
  2. Пазначэнне націскаў — расстаноўка націскаў ва ўсіх словах тэксту, і вырашэнне спрэчных выпадкаў, калі месца націску залежыць ад кантэксту і сэнсу (напрыклад, му́ка ці мука́). Рэкамендуецца паслядоўная камбінацыя некалькіх метадаў: StressLLM -> StressStat -> StressNoHomographs -> StressML -> StressUsual.
  3. Фанемізацыя (G2P) — пераўтварэнне літар у гукі (фанемы). Гэта найважнейшы этап для беларускай мовы, бо ён улічвае правілы чытання і фанетычныя працэсы (аглушэнне/азванчэнне, мяккасць і інш.).
  4. Сінтэз маўлення — генерацыя аўдыёфайла па падрыхтаваным тэксце або фанемах.
  5. Канвертацыя і пост-апрацоўка — сцісканне сінтэзаванага аўдыё ў зручны фармат (opus, mp3 і г.д.) для перадачы карыстальніку.

Выклік кожнага модуля не з'яўляецца абавязковым. Напрыклад, пры агучванні абмежаванага набору сказаў (асабліва з уласнымі імёнамі ці спецыфічнымі тэрмінамі) бывае прасцей зрабіць нармалізацыю і расставіць націскі ўручную.

Паслядоўнасць распазнавання маўлення (ASR Pipeline)

Звычайна працэс абмяжоўваецца выклікам аднаго ASR-модуля, але для атрымання ідэальнага тэксту пайплайн можа быць пашыраны:

  1. Разбіўка на часткі — вылучэнне маўлення з аўдыё і падзел яго на асобныя фрагменты (з пазнакамі часу і асобных спікераў).
  2. Аналіз спікераў — вызначэнне асоб спікераў у аўдыё (пол, узрост, пошук вядомых спікераў).
  3. Аб'яднанне частак — дазваляе рабіць распазнаванне праз мадэлі (Gemini), якія псуюць timestamp на вялікіх файлах, і значна памяншае колькасць запытаў.
  4. Распазнаванне маўлення (Speech-to-Text) — пераўтварэнне аўдыё ў сыры тэкст.
  5. Зваротная нармалізацыя (ITN) — канвертаванне слоў-лічбаў назад у лічбавы фармат, разбіўка тэксту на сказы і абзацы, расстаноўка знакаў прыпынку.
  6. Выпраўленне правапісу — прывядзенне тэксту да актуальнага правапісу (2008).

Фарматы аўдыё

Аптымальныя параметры аўдыяфайлаў для распазнавання: wav фармат без кампрэсіі, 16000 Hz, 16-bit, mono. Хоць некаторыя модулі падтрымліваюць іншыя фарматы, яны могуць працаваць з імі некарэктна.

Рэсурсы для апрацоўкі

Паколькі большасць модуляў абапіраецца на нейрасеткі, важна ўлічваць патрабаванні да «жалеза». Выкарыстанне знешніх правайдэраў (хмарных API) уплывае на прыватнасць звестак, патрабуе стабільнага інтэрнэту і стабільнай працы знешніх правайдэраў. Для кожнага модуля ў спісе ніжэй пазначана, як ён працуе (лакальна/знешне) і якія вылічальныя магутнасці яму патрэбныя.

Некаторыя модулі выкарыстоўваюць TORCH_DEVICE для пераносу апрацоўкі на CUDA альбо MPS.


Спіс модуляў

Нармалізацыя - belvoice.synth.normalization.NormalizationSimple

  • Апісанне: Замяняе лічбы (ад 0 да 9) на адпаведныя словы (без уліку скланенняў), а лацінскія літары — на іх назвы з англійскага алфавіта. Варта выкарыстоўваць выключна для хуткіх тэстаў.
  • Рэсурсы: Працуе вельмі хутка на CPU.
  • Залежнасці: няма.

Нармалізацыя - belvoice.synth.normalization.NormalizationLLM

  • Апісанне: Разумная нармалізацыя праз вялікія моўныя мадэлі (LLM). Якасць узгаднення склонаў і разгортвання складаных абрэвіятур наўпрост залежыць ад абранай LLM. Падтрымлівае карыстальніцкія промпты для ўліку спецыфікі вашага тэксту (напрыклад, гласарыя тэрмінаў).
  • Рэсурсы: Патрабуе доступу да знешняга правайдэра (для мадэляў кшталту Gemini ці GPT) альбо ўласнай магутнай відэакарты (GPU) для лакальнага запуску мадэляў накшталт Llama ці Gemma.
  • Параметры: model_name - з старонкі https://models.litellm.ai/. API ключ дадаецца ў залежнасці ад мадэлі. Напрыклад, для Gemini трэба пазначыць GEMINI_API_KEY у пераменных асяроддзя. Падрабязнасці - на https://docs.litellm.ai/docs/providers/gemini
  • Залежнасці: conda create --name asr python=3.12; conda activate asr; pip install litellm==1.83.13

Пазначэнне націскаў - belvoice.synth.stress.StressStat

  • Апісанне: Пазначае націскі на падставе Граматычнай базы беларускай мовы і вырашае праблему амографаў статыстычным метадам — абапіраючыся на слоўнік найбольш частотных варыянтаў націску. Нягледзячы на прастату падыходу, тэсты паказваюць правільнасць у больш чым 80% выпадкаў.
  • Рэсурсы: Працуе на CPU вельмі хутка.
  • Залежнасці: няма.

Пазначэнне націскаў - belvoice.synth.stress.StressML

  • Апісанне: Пазначае націск нейрасеткай (char-Transformer з pointer-softmax па галосных), навучанай на Граматычнай базе беларускай мовы. Прызначана перадусім для слоў, якіх няма ў слоўніку (гл. StressNoHomographs/ StressStat) - выкарыстоўваецца як «запасны варыянт» для OOV-слоў.
  • Рэсурсы: Працуе на CPU вельмі хутка (невялікая мадэль).
  • Заўвагі: Падрабязнасці пра ідэю, дадзеныя і навучанне - гл. tools/stress_ml/README.md.
  • Залежнасці: torch, safetensors.

Пазначэнне націскаў - belvoice.synth.stress.StressLLM

  • Апісанне: Пазначае націскі на падставе Граматычнай базы беларускай мовы. Для амографаў выклікаецца LLM для аналізу граматычных характарыстык слова(на падставе Граматычнай базы) і ягонага значэння (на падставе Тлумачальнага слоўніка) у канкрэтным сказе і па гэтым абіраецца варыянт націску. Такі падыход дае найлепшую якасць.
  • Рэсурсы: Знешні правайдэр (Gemini/GPT) або GPU (Gemma/Llama).
  • Залежнасці: pip install litellm==1.92.0

Фанемізацыя - belvoice.synth.phonemization.PhonemizationBelG2P

  • Апісанне: Пераводзіць тэкст у транскрыпцыю (фанемы) праз BelG2P. Калі TTS-модуль падтрымлівае фанемны ўвод, выкарыстанне BelG2P крытычна паляпшае натуральнасць вымаўлення. Модуль улічвае складаныя выпадкі беларускай фанетыкі: асіміляцыю зычных па глухасці/звонкасці і мяккасці, прыстаўныя гукі, правільнае вымаўленне злучнікаў і прыназоўнікаў у патоку маўлення.
  • Рэсурсы: Працуе CPU дастаткова хутка.
  • Заўвагі: Спампоўвае 22MiB jar з github.com і патрабуе ўсталяванай java для працы. Можна задаць зменную асяроддзя PHONEMIZATION_BELG2P_JAR каб jar не спампоўваўся, а браўся з гэтага шляху.
  • Залежнасці: conda create --name asr python=3.12 conda-forge::jpype1=1.7.0 pooch=1.9.0

Сінтэз маўлення - belvoice.synth.tts.TTSCoquiTTS

  • Апісанне: Выкарыстоўвае мадэль CoquiTTS, натрэніраваную на беларускім голасе з Mozilla CommonVoce. Працуе з фанемамі ад BelG2P. Гэты модуль зроблены ў выглядзе docker image, бо Coqui-TTS больш не абнаўляецца.
  • Рэсурсы: Вельмі хутка генеруе аўдыё на GPU, але цалкам прыдатна для працы і на звычайным CPU.
  • Залежнасці: conda create --name asr python=3.11; conda activate asr; pip install TTS==0.22.0

Сінтэз маўлення - belvoice.synth.tts.TTSOmniVoice

  • Апісанне: SOTA-мадэль для максімальна натуральнага сінтэзу.
  • Рэсурсы: Патрабуе GPU.
  • Залежнасці: conda create --name asr python=3.12; conda activate asr; pip install omnivoice==0.2.1

Распазнаванне маўлення - belvoice.asr.stt.STTNvidia

  • Апісанне: Выкарыстоўвае мадэлі Nvidia NeMo. Найлепшая мадэль: nvidia/stt_be_fastconformer_hybrid_large_pc, але і яна мае праблемы з разбіўкай на сказы.
  • Рэсурсы: Працуе на CPU даволі хутка, можа выкарыстоўваць GPU. На i5-11600 10-хвіліннае аўдыё канвертуецца за ~65 секунд.
  • Залежнасці: conda create --name asr python=3.12; conda activate asr; pip install nemo_toolkit[asr]==2.7.3

Распазнаванне маўлення - belvoice.asr.stt.STTFacebook

  • Апісанне: Выкарыстоўвае мадэлі Omnilingual ASR. Найлепшыя: omniASR_LLM_Unlimited_*_v2. Яны не дадаюць пунктуацыю наогул, але дакладна паказваюць гукі. Можна выкарыстоўваць для алічбоўкі дыялектнага маўлення.
  • Рэсурсы: Працуе на GPU. omniASR_LLM_Unlimited_1B_v2 на Nvidia 5060Ti/16GiB апрацоўвае 5-хвіліннае аўдыё за 42 секунды.
  • Залежнасці: conda create --name asr python=3.12 pytorch==2.8.0 torchaudio==2.8.0 conda-forge::libsndfile==1.0.31; conda activate asr; pip install git+https://github.com/facebookresearch/omnilingual-asr.git@81f51e224ce9e74b02cc2a3eaf21b2d91d743455 fairseq2==0.6.0 --extra-index-url https://fair.pkg.atmeta.com/fairseq2/whl/pt2.8.0/cpu. Змяніце /cpu на нешта больш прыдатнае - дэталі на https://github.com/facebookresearch/fairseq2#variants.

Распазнаванне маўлення - belvoice.asr.stt.STTGemini

  • Апісанне: Выкарыстоўвае мадэлі Gemini. На сённяшні дзень (ліпень 2026 года) мадэлі Gemini, забяспечваюць, бадай, самае дакладнае распазнаванне маўлення з разуменнем кантэксту і добрай пунктуацыяй. Але якасць вельмі залежыць ад мадэлі і промпту - мадэлі 3.5 і вышэй не глядзяць на temperature і часта робяць памылкі ў распазнаванні. Пакуль раім выкарыстоўваць gemini-3.1-flash-lite. Падтрымлівае файлы: wav, mp3, aiff, aac, ogg, opus, flac.
  • Рэсурсы: Патрабуецца знешні правайдэр.
  • Залежнасці: pip install google-genai==2.20.0, патрэбны GEMINI_API_KEY у пераменных асяроддзя.

Распазнаванне маўлення - belvoice.asr.stt.STTGeminiLive

  • Апісанне: Выкарыстоўвае мадэлі Gemini Live Translate. Gemini Live Translate падаюць вельмі добры транскрыпт, але толькі з хуткасцю самога гучання аўдыё, блокамі не больш за 10 хвілін, і тэкстам без разбіўкі на абзацы. З іншага боку, лімітаў на бясплатнае выкарыстанне няма. Атрыманы тэкст можна перафарматоўваць праз нейкую простую мадэль. Падтрымлівае файлы: wav, mp3, aiff, aac, ogg, opus, flac.
  • Рэсурсы: Патрабуецца знешні правайдэр.
  • Залежнасці: pip install google-genai==2.20.0, патрэбны GEMINI_API_KEY у пераменных асяроддзя.

Распазнаванне маўлення - belvoice.asr.stt.STTWhisper

  • Апісанне: Выкарыстоўвае мадэлі OpenAI Whisper. З мадэляў Whisper добрая якасць распазнавання атрымліваецца толькі ў whisper-large-v3. Падтрымлівае файлы: wav, mp3, aiff, aac, ogg, opus, flac.
  • Рэсурсы: Рэкамендуецца GPU.
  • Залежнасці: pip install faster_whisper==1.2.1 torch==2.13.0.

Разбіўка на часткі - belvoice.asr.split.SplitPyannote

  • Апісанне: Выкарыстоўвае мадэлі pyannote/speaker-diarization-community-1 ці pyannote/segmentation-3.0 для выдзялення маўлення з аўдыё і падзелу яго на асобныя фрагменты з пазнакамі часу. Можа вызначаць спікераў, альбо проста разбіваць на часткі.
  • Рэсурсы: Працуе на CPU, але для вялікіх аўдыёфайлаў рэкамендуецца GPU.
  • Залежнасці: conda create --name asr python=3.12; conda activate asr; pip install pyannote.audio==4.0.4

Разбіўка на часткі - belvoice.asr.split.SplitSilero

  • Апісанне: Выкарыстоўвае мадэль Silero VAD для выдзялення маўлення з аўдыё.
  • Рэсурсы: Працуе на CPU, але для вялікіх аўдыёфайлаў рэкамендуецца GPU.
  • Залежнасці: conda create --name asr python=3.12 numpy=2.4.4; conda activate asr; pip install silero-vad==6.2.1

Аб'яднанне частак - belvoice.asr.merge.MergeWindow

  • Апісанне: Аб'ядноўвае малыя фрагменты аўдыё ў адзін фрагмент - шукае фрагменты, якія агулам даюць працягласць не больш за патрэбную.
  • Рэсурсы: Працуе на CPU вельмі хутка.
  • Залежнасці: няма.

Аб'яднанне частак - belvoice.asr.merge.MergeGraph

  • Апісанне: Аб'ядноўвае малыя фрагменты аўдыё ў адзін фрагмент - шукае фрагменты як абыход графа.
  • Рэсурсы: Працуе на CPU вельмі хутка.
  • Залежнасці: pip install networkx==3.6.1

Зваротная нармалізацыя (разбіўка на абзацы) - belvoice.asr.itn.ITNParagraphs

  • Апісанне: Разбівае тэкст на лагічныя абзацы праз LLM (выкарыстоўваючы LiteLLM). Тэкст разбіваецца на сказы, нумаруецца тэгамі {{{id}}} і апрацоўваецца батчамі з вяртаннем JSON-спісу ідэнтыфікатараў пачатку абзацаў.
  • Рэсурсы: Патрабуецца знешні правайдэр праз LiteLLM (напрыклад, Gemini ці іншыя).
  • Залежнасці: pip install litellm

About

Modular framework for Belarusian speech synthesis (TTS) and recognition (ASR)

Resources

Stars

5 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages