Downloads · 30 days
9
12% of all-time downloads
Cosmobillian/turkish-asr-whisper-llm
turkish-asr-whisper-llm is a machine learning model from Cosmobillian. Use it for the machine learning task on the model card, and read the license before you ship it in a product.
Türkçe konuşmayı metne çeviren ve üzerinde LLM tabanlı işlemler yapabilen multimodal bir model.
Downloads · 30 days
9
12% of all-time downloads
All-time downloads
77
Public
Repo size
6.7 GB
Likes
5
Trending 1
Click a slice to open those files.
.safetensors6.7 GB · 99%
From the Hugging Face model README
Türkçe konuşmayı metne çeviren ve üzerinde LLM tabanlı işlemler yapabilen multimodal bir model.
Bu proje klasik ASR'dan farklı bir yaklaşım kullanıyor:
| Klasik ASR | Bu Proje |
|---|---|
| Ses → Whisper → Metin | Ses → Whisper Encoder → Audio Projector → Turkish LLM → Metin |
| Tek model | 3 bileşen birlikte çalışır |
| Sadece transkript | Transkript + Anlama + Analiz |
┌─────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐
│ Ses │ ──► │ Whisper Encoder │ ──► │ Audio Projector │ ──► │ Turkish LLM │ ──► Metin
│ (Audio) │ │ (1280 dim) │ │ (1280 → 4096) │ │ (4096 dim) │
└─────────┘ └─────────────────┘ └─────────────────┘ └─────────────┘
(Frozen) (Eğitildi) (LoRA + Merge)
| Bileşen | Model | Görevi | Durum |
|---|---|---|---|
| Whisper Encoder | openai/whisper-large-v3-turbo | Sesi 1280 boyutlu vektörlere çevirir | Frozen (eğitilmedi) |
| Audio Projector | 2-layer MLP + LayerNorm | Whisper çıktısını LLM formatına dönüştürür (1280d → 4096d) | Eğitildi |
| Turkish LLM | Trendyol/Trendyol-LLM-7b-chat-v1.0 | Audio vektörlerinden Türkçe metin üretir | LoRA fine-tuned → Merged |
# ============================================================================
# 🎤 TURKISH ASR + LLM FULL PIPELINE
# ============================================================================
!pip install -q bitsandbytes
import torch
import torch.nn as nn
import librosa
import numpy as np
from transformers import WhisperProcessor, WhisperModel, AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
from huggingface_hub import hf_hub_download
from IPython.display import Audio, display
from google.colab import drive
drive.mount('/content/drive')
REPO_ID = "Cosmobillian/turkish-asr-whisper-llm"
DEVICE = "cuda"
class AudioProjector(nn.Module):
def __init__(self):
super().__init__()
self.proj = nn.Sequential(
nn.Linear(1280, 4096),
nn.GELU(),
nn.Linear(4096, 4096),
nn.LayerNorm(4096)
)
def forward(self, x):
return self.proj(x)
print("📥 Modeller yükleniyor...")
whisper_processor = WhisperProcessor.from_pretrained(REPO_ID, subfolder="whisper")
whisper_model = WhisperModel.from_pretrained(REPO_ID, subfolder="whisper", torch_dtype=torch.float16, device_map="auto")
whisper_model.eval()
print("✓ Whisper")
llm_tokenizer = AutoTokenizer.from_pretrained(REPO_ID, subfolder="llm")
if llm_tokenizer.pad_token is None:
llm_tokenizer.pad_token = llm_tokenizer.eos_token
bnb_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.float16)
llm_model = AutoModelForCausalLM.from_pretrained(REPO_ID, subfolder="llm", quantization_config=bnb_config, device_map="auto", trust_remote_code=True)
llm_model.eval()
print("✓ LLM")
projector_path = hf_hub_download(REPO_ID, "audio_projector.pt")
projector = AudioProjector()
projector.load_state_dict(torch.load(projector_path, map_location=DEVICE)['state_dict'])
projector = projector.to(DEVICE).to(torch.float16).eval()
print("✓ Projector")
print("✅ Tüm modeller hazır!")
@torch.no_grad()
def speech_to_text(audio_path):
"""Ses dosyasını transkripte çevirir"""
audio, sr = librosa.load(audio_path, sr=16000, mono=True)
if np.abs(audio).max() > 0:
audio = audio / np.abs(audio).max()
inputs = whisper_processor(audio, sampling_rate=16000, return_tensors="pt")
audio_features = inputs.input_features.to(DEVICE, dtype=torch.float16)
with torch.amp.autocast('cuda', dtype=torch.float16):
audio_embeds = whisper_model.encoder(audio_features).last_hidden_state
projected = projector(audio_embeds)
prompt = llm_tokenizer("Transkript:", return_tensors="pt").input_ids.to(DEVICE)
prompt_embeds = llm_model.get_input_embeddings()(prompt)
inputs_embeds = torch.cat([projected, prompt_embeds], dim=1)
outputs = llm_model.generate(
inputs_embeds=inputs_embeds,
max_new_tokens=256,
do_sample=False,
pad_token_id=llm_tokenizer.pad_token_id,
eos_token_id=llm_tokenizer.eos_token_id
)
text = llm_tokenizer.decode(outputs[0], skip_special_tokens=True)
return text.split("Transkript:")[-1].strip() if "Transkript:" in text else text
# Kullanım
transcript = speech_to_text("ses.wav")
print(transcript)
@torch.no_grad()
def text_to_text(prompt, max_tokens=512):
"""LLM ile metin işleme (özet, analiz, soru-cevap vb.)"""
inputs = llm_tokenizer(prompt, return_tensors="pt").to(DEVICE)
with torch.amp.autocast('cuda', dtype=torch.float16):
outputs = llm_model.generate(
**inputs,
max_new_tokens=max_tokens,
do_sample=True,
temperature=0.7,
top_p=0.9,
pad_token_id=llm_tokenizer.pad_token_id,
eos_token_id=llm_tokenizer.eos_token_id
)
response = llm_tokenizer.decode(outputs[0], skip_special_tokens=True)
if prompt in response:
response = response.replace(prompt, "").strip()
return response
def full_pipeline(audio_path, task="özet"):
"""
Tam pipeline: Ses → Transkript → LLM Analiz
task seçenekleri:
- "özet": Transkripti özetle
- "analiz": İçerik analizi yap
- "düzelt": Yazım hatalarını düzelt
- "başlık": Başlık öner
- "anahtar": Anahtar kelimeler çıkar
- "duygu": Duygu analizi yap
"""
# Adım 1: Transkript
transcript = speech_to_text(audio_path)
# Adım 2: LLM işlem
prompts = {
"özet": f"Aşağıdaki metni kısaca özetle:\n\n{transcript}\n\nÖzet:",
"analiz": f"Aşağıdaki metni analiz et:\n\n{transcript}\n\nAnaliz:",
"düzelt": f"Yazım hatalarını düzelt:\n\n{transcript}\n\nDüzeltilmiş:",
"başlık": f"Başlık öner:\n\n{transcript}\n\nBaşlık:",
"anahtar": f"Anahtar kelimeler:\n\n{transcript}\n\nKelimeler:",
"duygu": f"Duygu analizi:\n\n{transcript}\n\nDuygu:"
}
prompt = prompts.get(task, f"{task}\n\nMetin: {transcript}\n\nCevap:")
result = text_to_text(prompt)
return {"transcript": transcript, "llm_output": result}
# Kullanım
result = full_pipeline("ses.wav", task="özet")
print(result["transcript"])
print(result["llm_output"])
def ask_about_audio(audio_path, question):
"""Ses içeriği hakkında soru sor"""
transcript = speech_to_text(audio_path)
prompt = f"""Transkript: {transcript}
Soru: {question}
Cevap:"""
return text_to_text(prompt)
# Kullanım
answer = ask_about_audio("ses.wav", "Konuşmacı ne anlatıyor?")
print(answer)
| Parametre | Değer |
|---|---|
| Dataset | 23,000+ Türkçe YouTube transkript |
| Batch Size | 1 (gradient accumulation: 8) |
| Learning Rate | 5e-5 |
| Epochs | 3 |
| Precision | BFloat16 |
| Hardware | NVIDIA L4 (22GB) |
| LoRA Config | r=16, alpha=32, dropout=0.05 |
| Target Modules | q_proj, k_proj, v_proj, o_proj |
Cosmobillian/turkish-asr-whisper-llm/
├── whisper/ # Whisper encoder + processor
│ ├── config.json
│ ├── model.safetensors
│ ├── preprocessor_config.json
│ └── ...
├── llm/ # Merged LLM (LoRA değil, full weights)
│ ├── config.json
│ ├── model.safetensors
│ ├── tokenizer.json
│ └── ...
├── audio_projector.pt # Projector weights
├── config.json # Model config
└── README.md
AudioProjector(
Linear(1280, 4096), # Whisper dim → LLM dim
GELU(), # Aktivasyon
Linear(4096, 4096), # Ek dönüşüm
LayerNorm(4096) # Normalizasyon
)
MIT License
Cosmobillian(Cengizhan BAYRAM)