Whisper ve Deepgram ile Konuşmadan Metne
Gerçek zamanlı ve toplu döküm, dil tespiti ve noktalama.
Whisper ve Deepgram ile Konuşmadan Metne, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.
Ses Ajanlarında Konuşmadan Metne
Bir ses ajanı, LLM'nin işleyebilmesi için konuşulan sesi önce metne dönüştürmelidir. Bu adım Konuşmadan Metne (STT) veya Otomatik Konuşma Tanıma (ASR) olarak adlandırılır.
Öne çıkan iki seçenek: OpenAI Whisper (dosya tabanlı, toplu işleme) ve Deepgram (akışlı, gerçek zamanlı; konuşmacı ayrıştırma ve sözcük zaman damgaları sunar).
OpenAI Whisper: Temel Yazıya Döküm
Whisper, OpenAI arayüzü üzerinden ses dosyalarını yazıya döker. Desteklenen biçimler: mp3, mp4, wav, webm, m4a, flac. En büyük dosya boyutu: 25 MB.
import openai
import os
client = openai.OpenAI(api_key=os.getenv('OPENAI_API_KEY'))
def transcribe_file(audio_path, language=None):
with open(audio_path, 'rb') as audio_file:
params = {
'model': 'whisper-1',
'file': audio_file,
'response_format': 'json' # or 'text', 'srt', 'vtt', 'verbose_json'
}
if language:
params['language'] = language # e.g., 'en', 'fr', 'de'
transcript = client.audio.transcriptions.create(**params)
return transcript.text
# Basic usage
text = transcribe_file('meeting_recording.mp3')
print('Transcribed:', text[:200])Zaman Damgalı Whisper Yazıya Dökümü
Her sözcük ve bölüm için zaman damgaları almak üzere response_format='verbose_json' kullanın. Bu özellik; kayıtlardaki belirli anları bulmak, karaoke tarzı vurgulama yapmak ve yazıya dökülen metinleri ses oynatımıyla eşleştirmek için kullanışlıdır.
import openai
import os
client = openai.OpenAI(api_key=os.getenv('OPENAI_API_KEY'))
def transcribe_with_timestamps(audio_path):
with open(audio_path, 'rb') as f:
result = client.audio.transcriptions.create(
model='whisper-1',
file=f,
response_format='verbose_json',
timestamp_granularities=['word', 'segment'] # get both word and segment times
)
segments = []
for seg in result.segments:
segments.append({
'start': seg.start,
'end': seg.end,
'text': seg.text
})
words = []
if hasattr(result, 'words'):
for word in result.words:
words.append({'word': word.word, 'start': word.start, 'end': word.end})
return {'text': result.text, 'segments': segments, 'words': words}Deepgram SDK: Eşzamansız Akış
Deepgram, gerçek zamanlı akış yazıya dökümü için optimize edilmiştir. Ses, kaydedildikçe parçalar hâlinde gönderilir; konuşmacı bir cümleyi tamamlamadan önce ara yazıya dökümler döndürülür.
pip install deepgram-sdk komutuyla yükleyin.
import asyncio
import os
from deepgram import DeepgramClient, PrerecordedOptions
client = DeepgramClient(os.getenv('DEEPGRAM_API_KEY'))
async def transcribe_with_deepgram(audio_path):
with open(audio_path, 'rb') as f:
audio_data = f.read()
options = PrerecordedOptions(
model='nova-2', # Deepgram's best accuracy model
language='en',
smart_format=True, # auto-add punctuation and formatting
utterances=True, # segment by speaker turns
punctuate=True,
diarize=True # speaker identification
)
response = await client.listen.asyncrest.v('1').transcribe_file(
{'buffer': audio_data},
options
)
return response.results.channels[0].alternatives[0].transcriptKonuşmacı Ayrıştırma
Ayrıştırma, kimin ne zaman konuştuğunu belirler ve bölümleri Konuşmacı 0, Konuşmacı 1 gibi etiketler. Toplantı yazıya dökümleri ve çok taraflı konuşmalar için kritik öneme sahiptir.
async def transcribe_with_diarization(audio_path):
from deepgram import DeepgramClient, PrerecordedOptions
import os
dg_client = DeepgramClient(os.getenv('DEEPGRAM_API_KEY'))
options = PrerecordedOptions(
model='nova-2',
diarize=True,
utterances=True,
smart_format=True
)
with open(audio_path, 'rb') as f:
audio_data = f.read()
response = await dg_client.listen.asyncrest.v('1').transcribe_file(
{'buffer': audio_data}, options
)
utterances = []
for utt in response.results.utterances:
utterances.append({
'speaker': f'Speaker {utt.speaker}',
'start': round(utt.start, 2),
'end': round(utt.end, 2),
'text': utt.transcript
})
return utterances
# Output:
# [{'speaker': 'Speaker 0', 'start': 0.0, 'end': 3.2, 'text': 'Hello everyone.'},
# {'speaker': 'Speaker 1', 'start': 3.5, 'end': 6.1, 'text': 'Good morning!'}]Dil Algılama
Kullanıcının dili bilinmediğinde hem Whisper hem de Deepgram konuşulan dili otomatik olarak algılayabilir. Whisper, dili sesin ilk 30 saniyesinden algılar.
import openai
import os
client = openai.OpenAI(api_key=os.getenv('OPENAI_API_KEY'))
def detect_language(audio_path):
with open(audio_path, 'rb') as f:
# Use translations endpoint to get verbose JSON with language detection
result = client.audio.transcriptions.create(
model='whisper-1',
file=f,
response_format='verbose_json'
)
return {
'detected_language': result.language,
'text': result.text
}
result = detect_language('user_audio.wav')
print(f"Language: {result['detected_language']}")
print(f"Text: {result['text'][:100]}")
# Deepgram: set language='auto' in options
from deepgram import PrerecordedOptions
options = PrerecordedOptions(model='nova-2', language='auto', detect_language=True)Uzun Ses Dosyalarını Parçalara Ayırma
Whisper'ın 25 MB sınırı, uzun kayıtların (1 saatlik toplantılar gibi) parçalara ayrılmasını gerektirir. pydub kullanarak sesi sessizliklere göre bölün, ardından her parçayı yazıya dökün ve parçaları birleştirin.
pip install pydub komutuyla yükleyin. ffmpeg gerektirir.
from pydub import AudioSegment
from pydub.silence import split_on_silence
import io
def transcribe_long_audio(audio_path, chunk_length_ms=60000):
audio = AudioSegment.from_file(audio_path)
# Split on silence
chunks = split_on_silence(
audio,
min_silence_len=1000, # 1 second of silence
silence_thresh=-40, # dBFS
keep_silence=500 # keep 500ms at each end
)
# If no silence splitting worked, use fixed-length chunks
if len(chunks) <= 1:
chunks = [
audio[i:i + chunk_length_ms]
for i in range(0, len(audio), chunk_length_ms)
]
full_transcript = []
for i, chunk in enumerate(chunks):
print(f'Transcribing chunk {i+1}/{len(chunks)}')
buf = io.BytesIO()
chunk.export(buf, format='mp3')
buf.seek(0)
buf.name = f'chunk_{i}.mp3'
result = client.audio.transcriptions.create(model='whisper-1', file=buf)
full_transcript.append(result.text)
return ' '.join(full_transcript)Deepgram ile Canlı Akış
Gerçek zamanlı sesli konuşmalar için Deepgram'ın WebSocket canlı akış arayüzünü kullanın. Ses parçaları kaydedildikçe gönderilir; ara ve nihai yazıya dökümler milisaniyeler içinde gelir.
import asyncio
import os
from deepgram import DeepgramClient, LiveTranscriptionEvents, LiveOptions
async def live_transcribe(on_transcript_callback):
dg_client = DeepgramClient(os.getenv('DEEPGRAM_API_KEY'))
connection = dg_client.listen.asynclive.v('1')
async def on_message(self, result, **kwargs):
sentence = result.channel.alternatives[0].transcript
is_final = result.is_final
if sentence:
await on_transcript_callback(sentence, is_final)
connection.on(LiveTranscriptionEvents.Transcript, on_message)
options = LiveOptions(
model='nova-2',
language='en',
smart_format=True,
interim_results=True, # get partial results before sentence ends
endpointing=500 # ms of silence before finalizing
)
await connection.start(options)
return connection # caller sends audio chunks via connection.send(audio_chunk)Hata Yönetimi ve Yeniden Denemeler
Ses yazıya dökme arayüzleri ağ sorunları, desteklenmeyen biçimler veya istek hız sınırları nedeniyle başarısız olabilir. Üstel geri çekilmeyle yeniden denemeler uygulayın ve göndermeden önce sesi doğrulayın.
import time
import os
MAX_FILE_SIZE_BYTES = 25 * 1024 * 1024 # 25MB
SUPPORTED_FORMATS = ('.mp3', '.mp4', '.wav', '.webm', '.m4a', '.flac', '.ogg')
def validate_audio_file(audio_path):
if not os.path.exists(audio_path):
raise FileNotFoundError(f'Audio file not found: {audio_path}')
size = os.path.getsize(audio_path)
if size > MAX_FILE_SIZE_BYTES:
raise ValueError(f'File too large: {size / 1024 / 1024:.1f}MB (max 25MB)')
ext = os.path.splitext(audio_path)[1].lower()
if ext not in SUPPORTED_FORMATS:
raise ValueError(f'Unsupported format: {ext}. Supported: {SUPPORTED_FORMATS}')
def transcribe_with_retry(audio_path, max_retries=3):
validate_audio_file(audio_path)
for attempt in range(max_retries):
try:
return transcribe_file(audio_path)
except Exception as e:
if attempt < max_retries - 1:
wait = 2 ** attempt
print(f'Retry {attempt + 1} after error: {e}. Waiting {wait}s')
time.sleep(wait)
else:
raiseWhisper ve Deepgram Arasında Seçim
Her iki araç da farklı senaryolarda başarılıdır. Ses ajanınız için doğru olanı seçmek üzere bu karar matrisini kullanın.
COMPARISON = '''
Whisper (OpenAI API):
- Best for: batch transcription, podcast processing, meeting notes
- Latency: file upload latency + ~1-5 seconds processing
- Strengths: excellent multilingual, high accuracy, cheap
- Word timestamps: yes (verbose_json)
- Diarization: NO (must use separate tool)
- Use when: accuracy > speed, offline processing
DeeGram:
- Best for: real-time voice agents, call center transcription
- Latency: <300ms for streaming, ~1s for file upload
- Strengths: streaming, diarization, custom vocabulary
- Word timestamps: yes, with confidence scores
- Diarization: YES (built-in, up to 10 speakers)
- Use when: speed > accuracy, real-time required
Rule of thumb:
Agent voice conversation -> Deepgram live streaming
Batch audio files -> Whisper API
Meeting transcripts with speakers -> Deepgram with diarize=True
'''
print(COMPARISON)Ses Biçimi Dönüştürme
Whisper ve Deepgram yaygın ses biçimlerini destekler; ancak kullanıcı sesi alışılmadık biçimlerde gelebilir (tarayıcılardan ogg, opus ve webm; iOS'tan m4a). Arayüze göndermeden önce sesi standart WAV veya MP3 biçimine dönüştürün.
from pydub import AudioSegment
import os
SUPPORTED_FORMATS = {'.mp3', '.wav', '.flac', '.m4a', '.ogg', '.webm', '.opus'}
def convert_to_wav(input_path, output_path=None):
ext = os.path.splitext(input_path)[1].lower()
if ext not in SUPPORTED_FORMATS:
raise ValueError(f'Unsupported audio format: {ext}')
if output_path is None:
output_path = input_path.rsplit('.', 1)[0] + '.wav'
# pydub handles format detection automatically
audio = AudioSegment.from_file(input_path)
# Normalize to 16kHz mono (optimal for Whisper)
audio = audio.set_frame_rate(16000).set_channels(1)
audio.export(output_path, format='wav')
print(f'Converted {input_path} -> {output_path} ({len(audio) / 1000:.1f}s)')
return output_path
def ensure_compatible_audio(audio_path):
ext = os.path.splitext(audio_path)[1].lower()
if ext in {'.mp3', '.wav', '.m4a', '.flac'}:
return audio_path # already compatible
return convert_to_wav(audio_path)Bilgi Kontrolü
Konuşmadan metne yazıya döküm bağlamında konuşmacı ayrıştırması nedir?
Özet: Whisper ve Deepgram ile Konuşmadan Metne
Whisper (OpenAI arayüzü), toplu yazıya döküm için idealdir; yüksek doğruluk ve çok dilli destek sunar, ayrıca verbose_json aracılığıyla sözcük zaman damgaları sağlar. Gecikmenin kritik olmadığı dosya tabanlı işlemlerde kullanın.
Deepgram, gerçek zamanlı akış için tasarlanmıştır: ara sonuçlar, yerleşik konuşmacı ayrıştırma ve 300 ms'nin altında gecikmeyle canlı WebSocket yazıya dökümü sunar. Etkileşimli ses ajanlarında kullanın. Her ikisi de dil algılamayı destekler; üretimde yeniden deneme mantığı ve dosya doğrulaması gerekir.
Sıkça Sorulan Sorular
“Whisper ve Deepgram ile Konuşmadan Metne” dersi ücretsiz mi?
Evet — “Whisper ve Deepgram ile Konuşmadan Metne” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.
“Whisper ve Deepgram ile Konuşmadan Metne” dersinde ne öğreneceğim?
Gerçek zamanlı ve toplu döküm, dil tespiti ve noktalama. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Agents öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“Whisper ve Deepgram ile Konuşmadan Metne” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Whisper ve Deepgram ile Konuşmadan Metne
- Aracı Yanıtlarında Metinden Sese
- Sesli Konuşma Döngüsü Oluşturma
- Sesli Aracılar İçin Gecikme İyileştirmesi