Whisper ile toplu konuşmayı metne dönüştürme

OpenAI Whisper large-v3-turbo kullanarak ekli bir A10 AI Runtime üzerinde bir grup İngilizce konuşma kaydını metne dönüştürün. Bu defter, şunları nasıl yapacağınızı gösterir:

  • Whisper large-v3-turbo modelini Transformers pipeline’ı ile yükleyin.
  • LibriSpeech test setinden bir dizi ses örneği oluşturun.
  • Her örnekten dalga formunu ve spektrogramını görselleştirin.
  • Toplu transkripsiyonu çalıştırın ve verimliliğini ardışık çıkarımla karşılaştırın.

Note

Bu örnek için Databricks AI ortamı sürüm 6 veya üzeri gereklidir.

Sunucusuz GPU hesaplamasına bağlanma

  1. Notebook hesaplama seçicisinden Sunucusuz GPU seçeneğini seçin.
  2. Ortam panelinde A10 hızlandırıcıyı ve AI v6 ortamını seçin.
  3. Uygula seçeneğine tıklayın, ardından ortamı onaylayın.

Whisper modeli ve LibriSpeech örnek veri seti kamudur ve Hugging Face kimlik doğrulaması gerektirmez.

Kitaplıkları içeri aktarma

Yapay zeka ortamı, bu dizüstü bilgisayarda kullanılan PyTorch, Transformers ve Hugging Face Datasets paketlerini içerir, bu nedenle paket kurulumu gerekmez. Bu hücre onları içe aktarıyor ve bir GPU'nun bağlı olduğunu doğruluyor.

import torch
import transformers
import datasets

print(f"Environment")
print(f"   PyTorch:      {torch.__version__}")
print(f"   Transformers: {transformers.__version__}")
print(f"   Datasets:     {datasets.__version__}")
print(f"\nGPU")
print(f"   Available:    {torch.cuda.is_available()}")
if torch.cuda.is_available():
    print(f"   Device:       {torch.cuda.get_device_name(0)}")
    mem_gb = torch.cuda.get_device_properties(0).total_memory / 1e9
    print(f"   Memory:       {mem_gb:.1f} GB")
Environment
   PyTorch:      2.11.0+cu130
   Transformers: 5.8.1
   Datasets:     4.8.5

GPU
   Available:    True
   Device:       NVIDIA A10G
   Memory:       23.7 GB

Whisper modelini yükle

openai/whisper-large-v3-turbo yükleyin; son teknolojiye yakın doğruluğu daha yüksek çıkarım hızıyla sunan, 809 milyon parametreli damıtılmış bir model. Transformers pipeline, özelliklerin çıkarılması, tokenizasyonu ve kod çözme işlemlerini tek bir çağrıda gerçekleştirir.

from transformers import pipeline
import torch

whisper_pipe = pipeline(
    "automatic-speech-recognition",
    model="openai/whisper-large-v3-turbo",
    torch_dtype=torch.float16,
    device="cuda",
)
print(f"Model loaded on {whisper_pipe.device}")
Model loaded on cuda

Ses örneklerini yükleyin ve keşfedin

LibriSpeech ASR test setini, referans transkripsiyonlu temiz İngilizce konuşma kayıtlarından oluşan bir koleksiyonu yükleyin ve ilk örneği çalın.

from datasets import load_dataset, Audio as AudioFeature
from IPython.display import display, Audio
import numpy as np
import soundfile as sf
import io

# Load the LibriSpeech test samples (decode=False to avoid torchcodec/FFmpeg dependency)
ds = load_dataset(
    "hf-internal-testing/librispeech_asr_dummy", "clean", split="validation"
)
ds = ds.cast_column("audio", AudioFeature(decode=False))
print(f"Loaded {len(ds)} audio samples\n")

def decode_audio(raw):
    """Decode raw audio bytes with soundfile."""
    arr, sr = sf.read(io.BytesIO(raw["bytes"]))
    return {"array": arr, "sampling_rate": sr}

# Show metadata for first few samples
for i in range(5):
    audio = decode_audio(ds[i]["audio"])
    duration = len(audio["array"]) / audio["sampling_rate"]
    text_preview = ds[i]["text"][:80]
    print(f"  Sample {i+1}:  {duration:.2f}s  |  {audio['sampling_rate']} Hz  |  \"{text_preview}...\"")

# Play the first sample inline
print("\n>> Playing Sample 1:")
audio_0 = decode_audio(ds[0]["audio"])
display(Audio(audio_0["array"], rate=audio_0["sampling_rate"]))
Loaded 73 audio samples

  Sample 1:  5.86s  |  16000 Hz  |  "MISTER QUILTER IS THE APOSTLE OF THE MIDDLE CLASSES AND WE ARE GLAD TO WELCOME H..."
  Sample 2:  4.82s  |  16000 Hz  |  "NOR IS MISTER QUILTER'S MANNER LESS INTERESTING THAN HIS MATTER..."
  Sample 3:  12.48s  |  16000 Hz  |  "HE TELLS US THAT AT THIS FESTIVE SEASON OF THE YEAR WITH CHRISTMAS AND ROAST BEE..."
  Sample 4:  9.90s  |  16000 Hz  |  "HE HAS GRAVE DOUBTS WHETHER SIR FREDERICK LEIGHTON'S WORK IS REALLY GREEK AFTER ..."
  Sample 5:  29.40s  |  16000 Hz  |  "LINNELL'S PICTURES ARE A SORT OF UP GUARDS AND AT EM PAINTINGS AND MASON'S EXQUI..."

>> Playing Sample 1:

Ses dalga formlarını görselleştirin

Her örnekin dalga formunu ve spektrogramını yan yana çizin. Dalga formu zaman içinde genlik gösterirken, spektrogram frekans içeriğini gösterir; ses enerjisi 100 ila 4.000 Hz konuşma bandında yoğunlaşır.

import matplotlib.pyplot as plt
import numpy as np

NUM_SAMPLES = 4
fig, axes = plt.subplots(NUM_SAMPLES, 2, figsize=(16, 3 * NUM_SAMPLES))
fig.suptitle(
    "Waveform & Spectrogram Profiles", fontsize=16, fontweight="bold", y=1.01
)

for i in range(NUM_SAMPLES):
    audio = decode_audio(ds[i]["audio"])
    samples = audio["array"]
    sr = audio["sampling_rate"]
    t = np.arange(len(samples)) / sr

    # --- Waveform ---
    ax_wave = axes[i, 0]
    ax_wave.plot(t, samples, linewidth=0.4, color="#1f77b4", alpha=0.8)
    ax_wave.fill_between(t, samples, alpha=0.15, color="#1f77b4")
    ax_wave.set_ylabel("Amplitude", fontsize=9)
    ax_wave.set_title(f"Sample {i+1} — Waveform ({len(samples)/sr:.1f}s)", fontsize=10)
    ax_wave.set_xlim(0, t[-1])
    ax_wave.grid(True, alpha=0.3)
    if i == NUM_SAMPLES - 1:
        ax_wave.set_xlabel("Time (seconds)", fontsize=9)

    # --- Spectrogram ---
    ax_spec = axes[i, 1]
    ax_spec.specgram(samples, Fs=sr, NFFT=1024, noverlap=512, cmap="magma")
    ax_spec.set_ylabel("Frequency (Hz)", fontsize=9)
    ax_spec.set_title(f"Sample {i+1} — Spectrogram", fontsize=10)
    ax_spec.set_ylim(0, 8000)  # Focus on speech frequencies
    if i == NUM_SAMPLES - 1:
        ax_spec.set_xlabel("Time (seconds)", fontsize=9)

plt.tight_layout()
plt.show()

Tek bir örneği transkribe et

Pipeline'ı doğrulamak için bir örneği transkribe edin, ardından tahmini referans metinle karşılaştırın.

import time

audio_input = decode_audio(ds[0]["audio"])

start = time.perf_counter()
result = whisper_pipe(
    audio_input["array"],
    generate_kwargs={"language": "en"},
)
elapsed = time.perf_counter() - start

duration = len(audio_input["array"]) / audio_input["sampling_rate"]

print(f"Inference time:   {elapsed:.2f}s for {duration:.1f}s audio ({duration/elapsed:.1f}x realtime)")
print(f"\nPredicted:  {result['text'].strip()}")
print(f"Reference:  {ds[0]['text']}")
Inference time:   12.23s for 5.9s audio (0.5x realtime)

Predicted:  Mr. Quilter is the apostle of the middle classes, and we are glad to welcome his gospel.
Reference:  MISTER QUILTER IS THE APOSTLE OF THE MIDDLE CLASSES AND WE ARE GLAD TO WELCOME HIS GOSPEL

Toplu çıkarımı çalıştır

Tüm örneklerin dökümünü yapılandırılabilir bir batch_size ile yapın. Toplu işleme, GPU’nun birden fazla ses klibini paralel olarak işlemesini sağlar; bu da ardışık çıkarım işlemine kıyasla iş hacmini artırır. Bu hücre, karşılaştırma için ardışık bir temel değerin süresini de ölçer.

import time
import pandas as pd

_decoded = [decode_audio(ds[i]["audio"]) for i in range(len(ds))]
audio_inputs = [d["array"] for d in _decoded]
_sr = _decoded[0]["sampling_rate"]

# --- Sequential baseline ---
start = time.perf_counter()
seq_results = [
    whisper_pipe(a, generate_kwargs={"language": "en"}) for a in audio_inputs
]
seq_time = time.perf_counter() - start

# --- Batched inference ---
start = time.perf_counter()
batch_results = whisper_pipe(
    audio_inputs, batch_size=8, generate_kwargs={"language": "en"}
)
batch_time = time.perf_counter() - start

total_audio_sec = sum(
    len(a) / _sr for a in audio_inputs
)

print(f"Performance Comparison ({len(audio_inputs)} samples, {total_audio_sec:.1f}s total audio)")
print(f"   Sequential:  {seq_time:.2f}s  ({total_audio_sec/seq_time:.1f}x realtime)")
print(f"   Batched (8): {batch_time:.2f}s  ({total_audio_sec/batch_time:.1f}x realtime)")
print(f"   Speedup:     {seq_time/batch_time:.2f}x\n")

# --- Results table ---
rows = []
for i, res in enumerate(batch_results):
    duration = len(audio_inputs[i]) / _sr
    rows.append({
        "Sample": i + 1,
        "Duration (s)": round(duration, 1),
        "Transcription": res["text"].strip(),
        "Reference": ds[i]["text"],
    })

df = pd.DataFrame(rows)
display(df)
Performance Comparison (73 samples, 481.0s total audio)
   Sequential:  16.02s  (30.0x realtime)
   Batched (8): 9.56s  (50.3x realtime)
   Speedup:     1.68x

Özet

Bu defter şunları gösterdi:

  • Kurulum gerektirmeyen GPU üzerinde çıkarım: AI Runtime ortamı, transformers, datasets ve torch önceden yüklü olarak gelir; %pip install gerekmez
  • Hat içi ses oynatma: örnekleri doğrudan defterde dinleyin IPython.display.Audio
  • Dalga formu ve spektrogram görselleştirme: matplotlibile render edilir, ayrıca önceden kurulu
  • Verimli toplu çıkarım: GPU-paralel transkripsiyon için parametrenin kullanılması batch_size
  • Whisper large-v3-turbo: üretim ortamına uygun, hızlı ve doğru bir konuşmayı metne dönüştürme modeli

Bunu kendi verilerinize uyarlamak için, HuggingFace veri setini Unity Katalog Volume veya bulut depolama yolundan gelen ses dosyalarıyla değiştirin.

Örnek defter

Whisper ile toplu konuşmayı metne dönüştürme

Dizüstü bilgisayar al