0Pricing
AI Agents · Pelajaran

Speech-to-Text dengan Whisper dan Deepgram

Transkripsi waktu nyata dan batch, deteksi bahasa, serta tanda baca.

Speech-to-Text dengan Whisper dan Deepgram adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.

Ucapan ke Teks dalam Agen Suara

Agen suara harus mengubah audio ucapan menjadi teks sebelum LLM dapat memprosesnya. Langkah ini disebut Speech-to-Text (STT) atau Automatic Speech Recognition (ASR).

Dua pilihan utama: OpenAI Whisper (berbasis berkas, secara berkelompok) dan Deepgram (penstriman, waktu nyata, dengan diarisasi pembicara dan stempel waktu kata).

OpenAI Whisper: Transkripsi Dasar

Whisper melalui API OpenAI mentranskripsikan berkas audio. Format yang didukung: mp3, mp4, wav, webm, m4a, flac. Ukuran berkas maksimum: 25MB.

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])

Whisper dengan Stempel Waktu Kata

Gunakan response_format='verbose_json' untuk mendapatkan stempel waktu setiap kata dan segmen. Ini berguna untuk: menemukan momen tertentu dalam rekaman, menyoroti teks seperti pada karaoke, dan menyelaraskan transkripsi dengan pemutaran audio.

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: Penstriman Asinkron

Deepgram dioptimalkan untuk transkripsi melalui penstriman waktu nyata. Audio dikirim dalam beberapa bagian saat direkam; transkripsi sementara dikembalikan sebelum pembicara menyelesaikan kalimat.

Instal dengan pip install deepgram-sdk.

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].transcript

Diarisasi Pembicara

Diarisasi mengidentifikasi siapa yang sedang berbicara—memberi label pada segmen sebagai Pembicara 0, Pembicara 1, dan seterusnya. Fitur ini penting untuk transkripsi rapat dan percakapan yang melibatkan banyak pihak.

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!'}]

Deteksi Bahasa

Saat bahasa pengguna tidak diketahui, Whisper dan Deepgram dapat mendeteksi bahasa yang diucapkan secara otomatis. Whisper mendeteksi bahasa dari 30 detik pertama audio.

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)

Membagi Berkas Audio Panjang

Batas 25MB milik Whisper berarti rekaman panjang (rapat selama 1 jam) perlu dibagi menjadi beberapa bagian. Bagi audio berdasarkan keheningan menggunakan pydub, lalu transkripsikan setiap bagian dan gabungkan hasilnya.

Instal dengan pip install pydub. Membutuhkan ffmpeg.

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)

Penstriman Langsung Deepgram

Untuk percakapan suara waktu nyata, gunakan API penstriman langsung WebSocket milik Deepgram. Bagian-bagian audio dikirim saat direkam; transkripsi sementara dan akhir diterima dalam hitungan milidetik.

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)

Penanganan Kesalahan dan Percobaan Ulang

API transkripsi audio dapat gagal karena masalah jaringan, format yang tidak didukung, atau batas laju. Terapkan percobaan ulang dengan jeda eksponensial dan validasikan audio sebelum mengirimkannya.

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:
                raise

Memilih antara Whisper dan Deepgram

Kedua alat unggul dalam situasi yang berbeda. Gunakan matriks keputusan ini untuk memilih alat yang tepat bagi agen suara Anda.

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)

Konversi Format Audio

Whisper dan Deepgram mendukung format audio umum, tetapi audio pengguna mungkin diterima dalam format yang tidak biasa (ogg, opus, webm dari peramban, m4a dari iOS). Konversikan audio ke WAV atau MP3 standar sebelum mengirimkannya ke API.

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)

Uji Pemahaman

Apa yang dimaksud dengan diarisasi pembicara dalam konteks transkripsi ucapan ke teks?

Rangkuman: Ucapan ke Teks dengan Whisper dan Deepgram

Whisper (API OpenAI) ideal untuk transkripsi secara berkelompok—akurasinya tinggi, mendukung banyak bahasa, serta menyediakan stempel waktu kata melalui verbose_json. Gunakan alat ini untuk pemrosesan berbasis berkas saat latensi tidak menjadi hal yang penting.

Deepgram dirancang untuk penstriman waktu nyata—transkripsi WebSocket langsung dengan hasil sementara, diarisasi pembicara bawaan, dan latensi di bawah 300ms. Gunakan alat ini untuk agen suara interaktif. Keduanya mendukung deteksi bahasa dan memerlukan logika percobaan ulang serta validasi berkas dalam lingkungan produksi.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Speech-to-Text dengan Whisper dan Deepgram” gratis?

Ya — teks lengkap “Speech-to-Text dengan Whisper dan Deepgram” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Speech-to-Text dengan Whisper dan Deepgram”?

Transkripsi waktu nyata dan batch, deteksi bahasa, serta tanda baca. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai AI Agents?

Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Speech-to-Text dengan Whisper dan Deepgram” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?

Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Speech-to-Text dengan Whisper dan Deepgram
  2. Text-to-Speech dalam Respons Agen
  3. Membangun Putaran Percakapan Suara
  4. Optimasi Latensi untuk Agen Suara
← Kembali ke AI Agents