turkce-duygu
English: Picks a speaking style for each Turkish sentence for expressive TTS: neutral, cheerful, excited, warning, curious, apologetic, sad, angry or whisper, with an intensity (0–1). Combines rule-based speech-act detection (question, request, warning, apology) with a fine-tuned BERTurk emotion model (ONNX, CPU only; downloaded from Hugging Face on first use).
Türkçe metinden seslendirme stili seçer: her cümle için nötr, neşeli, heyecan, uyarı, merak, özür, üzgün, kızgın ya da fısıltı tonunu ve bir yoğunluk değerini (0–1) verir. GPU ve internet gerekmez.
from turkce_duygu import metin_cozumle
for r in metin_cozumle("Günaydın! Bugün hava harika. Şemsiyeni unutma, öğleden sonra yağmur yağabilir. "
"Bana bir iyilik yapabilir misin?"):
print(r.stil, r.yogunluk, r.eylem, r.cumle)
python -m turkce_duygu "Eyvah, anahtarı evde unuttum. Kapıyı açabilir misiniz?"
Neden
Duygulu TTS modelleri (StyleTTS2, duygu etiketli VITS vb.) hangi cümlenin hangi tonla okunacağını bilmek ister. Türkçe için bunu metinden çıkaran açık bir araç yoktu. Genel duygu sınıflandırıcıları iki şeyi kaçırır:
- Biçim: "Bana yardım edebilir misiniz?" soru işaretlidir ama merak değil ricadır. "Dikkat, zemin ıslak." duygusuz görünür ama uyarıdır.
- Duygu: "Bugün hava harika." biçimce düz bir bildirimdir ama neşeyle okunmalıdır.
Bu paket ikisini birleştirir: biçimi dilbilgisi kurallarıyla, duyguyu modelle çıkarır.
Nasıl çalışır
1. Konuşma eylemi (kurallar, eylem.py). Kurallar kaynaklıdır. Her kural, kitaptaki numaralı
örneklerle sınanır (tests/eylem_literatur.tsv).
| Eylem | Biçim | Örnek | Kaynak |
|---|---|---|---|
| soru | soru eki mI, ne-sözcüğü + ?, acaba | Kitabı Ahmet'e mi verdin? | G&K §19.1–19.2, §19.5.2 |
| rica / teklif | 2. kişi geniş zaman sorusu, -(y)Abilir mI | Bana biraz yardım edebilir misiniz? · Çay içer misiniz? | G&K §21.4.4.5 |
| danışma | 1. kişi istek + mI, -sAm/-sAk + acaba | Sana yardım edeyim mi? · Kime danışsam acaba? | G&K §21.4.4.3–4 |
| emir | emir kipi, -(y)In(Iz), -sIn, -sAnA, -mAlI | Bu parayı babana ver. · Lütfen kemerlerinizi bağlayınız. | G&K §21.4.4.2, §21.4.2.2 |
| yasak | olumsuz emir, -mAmAlI | Kabloya dokunmayın. | G&K §21.4.4.2, §21.4.2.2 |
| uyarı | "dikkat" ünlemi; sakın/aman + buyruk; buyruk + tehlike ya da olası kötü sonuç | Dikkat! Zemin ıslak. · Çöpe atma, yangın çıkabilir. | TDK; G&K §21.4.2.1 |
| özür | açık özür sözü; pişmanlık, sorumluluk üstlenme, telafi | Kusura bakmayın, toplantı uzadı. | Hatipoğlu 2003; Olshtain & Cohen 1983 |
| dilek | keşke, 1. kişi -sA | Keşke daha çok param olsa. | G&K §21.4.4.1 |
| öneri | -(y)AlIm, -(y)AyIm | Biraz konuşalım. | G&K §21.4.4.3 |
| ünlem | TDK'nın duygu tanımıyla ünlemler (yaşasın: sevinç, eyvah: üzüntü, vay: şaşma…) | Eyvah, anahtarı evde unuttum. | TDK; G&K §7.1.5 |
Emir ve istek biçimleri 1.806 eylem gövdesinden üretilir. Türetilmiş gövdeler (yanaş-tır-mayın, kullan-ıl-masın) ve ünsüz yumuşaması (git → gidin) de tanınır. "Affedersiniz, istasyon ne tarafta?" özür değil, dikkat çekme sözüdür. "Dikkatini çekti" uyarı değildir.
2. Model (model.py). BERTurk (dbmdz/bert-base-turkish-cased),
iki çıkışlı. ONNX olarak işlemcide çalışır.
- Duygu çıkışı: XED Türkçe verisiyle Plutchik'in 8 temel duygusu (öfke, beklenti, tiksinti, korku, sevinç, üzüntü, şaşkınlık, güven).
- Stil çıkışı (
egit/egit_stil.py): 8 seslendirme stilinin olasılığı. Bu proje için yazılmış açık stil setiyle (turkce_duygu/veri/stil_seti, 908 cümle, CC0; sentetik: bir dil modeli yardımıyla yazıldı), nötr örneklerle ve duygudan eşlenmiş XED cümleleriyle (düşük ağırlıkla) eğitildi.
3. Stil (stil.py). Önce biçim karar verir: soru → merak, özür → özür, uyarı/yasak → uyarı,
emir → hafif uyarı, rica → nötr. Biçimin söylemediği yerde modelin stil çıkışı karar verir. Stil
çıkışı yoksa (eski tek çıkışlı model) duygu eşlemesi kullanılır: sevinç/güven → neşeli,
şaşkınlık/beklenti → heyecan, korku → uyarı, öfke/tiksinti → kızgın, üzüntü → üzgün. Hiçbir duygu
eşiği geçmezse nötr. Çok güçlü öfke ya da üzüntü biçimi ezer: "Kaç kere söyleyeceğim sana, kapıyı
kapat!" emir biçimindedir ama kızgın okunur. Fısıltı metinden seçilmez; yalnız "fısıldadı" gibi açık bir söz geçerse önerilir. Sesin bir
stili yoksa en yakınına düşülür (üzgün → özür, kızgın → uyarı). Ünlem işareti ve pekiştirme sözcükleri (çok, mutlaka, kesinlikle, hemen) yoğunluğu
artırır. Paragrafta, duygulu bir cümlenin ardındaki eşiğe yakın cümle tonu yarı yoğunlukla sürdürür.
Eşleme tablo hâlinde durur, değiştirilebilir.
Doğruluk
Duygu modeli. XED Türkçe sınav kümesi, 904 cümle. Eğitimde ve eşik seçiminde kullanılmadı.
| Model | Makro-F1 | İlk tahmin doğru |
|---|---|---|
| Sınıf sıklığı tabanı | 0,225 | %20,2 |
| TF-IDF + lojistik regresyon | 0,289 | %28,8 |
| BERTurk ince ayar (ONNX) | 0,327 | %35,8 |
- "İlk tahmin doğru": en olası duygu altın etiketlerden biri.
- Doğrulamada makro-F1 0,390'dı; aradaki fark, eşiklerin doğrulama kümesine uymasından gelir.
- Nötr ayrımı: sınav kümesindeki nötr cümlelerin (Vikipedi + Common Voice) %95,1'i nötr, XED cümlelerinin %98,2'si duygulu bulunur. Nötr ve duygulu örnekler farklı kaynaklardan geldiği için bu oranın bir kısmı üslup farkından gelir; üslubu ayrı ölçmek için turkce-uslup.
- ONNX: int8 sıkıştırma kalite kapısını geçmedi (makro-F1 −0,026), model fp32 yayımlanır (443 MB). Tek cümle 13 ms, PyTorch ile birebir aynı.
Seslendirme stili (kurallar + model). Seslen ses atölyesinin ton havuzlarında ölçüldü. Kurallar
ve eşikler yalnız ilk yarılara bakılarak seçildi; sayılar hiç incelenmeyen ikinci yarılardan (2.209
cümle). Havuzlar yayımlanmıyor; betik degerlendirme/stil_havuz.py.
| Ton | Stil çıkışıyla | Yalnız duygu çıkışıyla | En sık karıştığı (stil çıkışıyla) |
|---|---|---|---|
| uyarı | %94,9 | %92,6 | kızgın |
| nötr | %90,1 | %84,3 | üzgün, neşeli |
| özür | %88,0 | %84,6 | üzgün |
| heyecan | %87,7 | %43,4 | neşeli |
| merak | %84,0 | %88,9 | kızgın (öfkeli soru) |
| neşeli | %81,7 | %29,7 | nötr |
| üzgün | %78,8 | %33,7 | nötr |
| kızgın | %72,1 | %37,7 | merak, uyarı |
| toplam | %85,6 | %63,8 |
Biçimle taşınan tonlar (soru, uyarı, özür) iki yolda da güvenilirdir. Yalnız duyguyla taşınan tonlar (neşe, heyecan, üzüntü, öfke) duygu çıkışıyla zayıf kalıyordu: altyazıyla eğitilen model yazılı cümlelerdeki sakin duyguyu çoğu zaman nötr bulur. Stil çıkışı bu açığı kapatır. Yanılgılar çoğunlukla komşu tona (neşeli ↔ heyecan, kızgın ↔ uyarı) ya da nötre düşer. Seslendirmede bu, yanlış duygudan daha zararsızdır.
Bu sayıları okurken:
- Stil seti ile havuz cümleleri aynı türdendir: ikisi de seslendirme için yazılmış kısa örnek cümlelerdir. Bu yüzden sonuçlar gerçek kullanıcı metninde muhtemelen daha düşüktür.
- Üzgün ve kızgın havuzlarıyla birebir ya da çok benzer olan stil seti cümleleri eğitimden önce
ayıklandı (
degerlendirme/sizinti_temizle.py). Yine de bu iki tonun sınavı ötekiler kadar bağımsız değildir. - Biçimi ezen duygu kuralı (
baskin) duygu çıkışıyla varsayılan olarak kapalıdır. Altyazıyla eğitilen model düz soruların çoğunda da öfke görüyor: kural 1,5'te açıkken merak %89'dan %18'e düşüyor. Stil çıkışıyla aynı işstil_baskinile yapılır (varsayılan 0,6). EşiklerCozumleyici(ayar={...})ile değiştirilebilir.
Kurulum
pip install turkce-duygu[model]
Model dosyaları (duygu.onnx, tokenizer.json, esikler.json; ~445 MB) Hugging Face'te yayımlanır ve ilk
kullanımda kendiliğinden iner (önbellekte kalır). TURKCE_DUYGU_MODEL ortam değişkeniyle yerel klasör gösterilir. Model yoksa paket yalnız kurallarla
çalışır.
Yeniden eğitmek (GPU gerekmez, işlemcide yaklaşık bir saat):
pip install turkce-duygu[egitim]
python egit/veri.py # XED (sabit sürüm) + Vikipedi nötr örnekleri, MD5'e göre bölme
python egit/egit.py # BERTurk ince ayar; en iyi tur doğrulama makro-F1'ine göre
python egit/aktar.py # ONNX + eşdeğerlik kapısı (int8 kapıyı geçmezse fp32)
python egit/egit_stil.py # stil çıkışını ekler (iki çıkışlı ONNX)
python degerlendirme/olc.py
Sınırlar
- XED Türkçe etiketleri İngilizce/Fince insan etiketlerinin altyazılara aktarımıdır. Etiketler gürültülüdür. İnsan etiketçiler arasında bile uyum düşüktür (XED'in kendi İngilizce makro-F1'i ~0.5). Sayılar bu tavana göre okunmalıdır.
- Altyazı dili konuşma dilidir. Haber ve ansiklopedi metninde model çoğunlukla nötr kalır. Bu, seslendirme için istenen davranıştır.
- Konuşma eylemi biçimden çıkarılır. Tonlamayla taşınan ironi ve söz sanatı soruları bağlamsız çözülemez. Bunlar sınav dosyasında "belirsiz" olarak işaretlidir.
Kaynaklar
- Göksel, A. & Kerslake, C. (2005). Turkish: A Comprehensive Grammar. Routledge.
- Hatipoğlu, Ç. (2003). Turkish apologies.
- Olshtain, E. & Cohen, A. D. (1983). Apology: a speech act set. Sociolinguistics and Language Acquisition, 18–35.
- Öhman, E., Pàmies, M., Kajava, K. & Tiedemann, J. (2020). XED: A Multilingual Dataset for Sentiment Analysis and Emotion Detection. COLING 2020.
- Schweter, S. (2020). BERTurk – BERT models for Turkish. Zenodo.
- TDK Güncel Türkçe Sözlük (sozluk.gov.tr).
Lisans
Kod MIT (LICENSE). Stil seti (turkce_duygu/veri/stil_seti) CC0: cümleler bu proje için bir dil modeli
yardımıyla yazıldı (sentetik), gerçek kişilere ya da yayımlanmış metinlere dayanmaz. Model ağırlıkları XED'den türediği için CC BY 4.0 (atıf:
Öhman vd. 2020). turkce_duygu/veri/fiiller.txt Vikisözlük türevidir (CC BY-SA 4.0).
Kardeş projeler: turkce-vurgu (vurgulu okunuş), turkce-normalize (metin hazırlama), turkce-plbert, turkce-tts-sinav.
Metadata
Release files for turkce-duygu 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| turkce_duygu-0.1.0.tar.gz | 33.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| turkce_duygu-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 61.1 kB
Release files / turkce_duygu-0.1.0.tar.gz
| Download URL | turkce_duygu-0.1.0.tar.gz |
|---|---|
| Size | 33.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9ed88965a19358f18b1f57d361fffad18dceb7cd3b6c66eab776a547f72fe89c
|
|
BLAKE2b-256 checksum How to use checksums |
aca04807fcb326136bf67ee196de45ed7f7aebb68545a819b3741e38cdc891fe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.10
|
Release files / turkce_duygu-0.1.0-py3-none-any.whl
| Download URL | turkce_duygu-0.1.0-py3-none-any.whl |
|---|---|
| Size | 28.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6942786cd3b72e17fcb3e6000aee5b79ecf3f5b019f79c7b88f5c6388d448eed
|
|
BLAKE2b-256 checksum How to use checksums |
b790e7af4312e39a0e10f526f44a14455d5f76108d352920eca1e63ea3cab310
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.10
|