Gunakan pengenalan suara otomatis (ASR) untuk menghasilkan transkrip podcast menggunakan Granite 3.3 dan watsonx.ai

Dalam tutorial ini, Anda akan menggunakan model ucapan IBM® Granite® 3.3 sumber terbuka untuk menghasilkan transkrip podcast IBM “Mixture of Experts” dari YouTube. Kemudian, menggunakan model bahasa besar (LLM) sumber terbuka IBM Granite-3.3-8B-Instruct, Anda akan menampilkan ringkasan transkrip yang dihasilkan. Anda akan menjalankan kode ini pada watsonx.ai® notebook.

Pengenalan ucapan otomatis

Pengenalan ucapan otomatis (ASR) juga dikenal sebagai pengenalan ucapan atau Speech to Text, adalah teknologi yang mengubah bahasa lisan menjadi teks tertulis. Berbagai machine learning dan teknik komputasi kecerdasan buatan digunakan untuk mengubah ucapan menjadi teks. Teknologi pengenalan ucapan telah berkembang secara signifikan dari permulaannya di pertengahan abad kedua puluh hingga hari ini.

Pada 1960-an, spektrogram awalnya digunakan untuk menganalisis ucapan. Dalam beberapa dekade berikutnya, pergeseran ke model statistik terjadi. Hidden Markov Models (HMM) muncul dan menjadi dominan untuk pemodelan urutan unit suara kecil yang dikenal sebagai fonem dalam linguistik. Arsitektur sistem ASR terdiri dari tiga komponen terpisah: model akustik, model bahasa, dan sebuah decoder.

Pada tahun 2010-an, kemajuan dalam pembelajaran mendalam mulai berdampak pada arsitektur sistem pengenalan suara tradisional. Model encoder-decoder mungkin menggunakan arsitektur jaringan saraf berulang (RNN) atau jaringan saraf convolutional (CNN) di mana encoder memproses data input dan decoder menghasilkan output berdasarkan representasi encoder. Model ini dilatih menggunakan kumpulan data besar berupa pasangan audio-teks tanpa label untuk mempelajari cara mencocokkan sinyal audio dengan transkripsinya. Model ASR populer termasuk DeepSpeech dan Wav2Vec.

Saat ini, asisten virtual seperti Siri Apple, Alexa Amazon, atau Cortana Microsoft menggunakan teknologi ASR untuk memproses ucapan manusia secara real-time. Mereka juga mampu mengintegrasikan speech-to-text dengan model bahasa besar (LLM) dan pemrosesan bahasa alami (NLP). LLM dapat digunakan untuk menambahkan konteks, yang dapat membantu ketika pilihan kata lebih ambigu atau jika ada variabilitas dalam pola bicara manusia.

Prasyarat

Anda memerlukan akun IBM® Cloud untuk membuat proyek watsonx.ai.

Langkah-langkah

Langkah 1. Siapkan lingkungan Anda

Meskipun terdapat pilihan beberapa alat, tutorial ini akan memandu Anda untuk menyiapkan akun IBM menggunakan Jupyter Notebook. 

1. Masuk ke watsonx.ai dengan menggunakan akun IBM Cloud Anda.

2. Buat proyek watsonx.ai.

3. Buat Jupyter Notebook.

Pastikan Anda memilihGPU 2xV100 Runtime 24.1 untuk menentukan konfigurasi. Langkah ini akan membuka lingkungan Jupyter Notebook tempat Anda dapat menyalin kode dari tutorial ini.

Sebagai alternatif, Anda dapat mengunduh notebook ini ke sistem lokal Anda dan mengunggahnya ke proyek watsonx.ai Anda sebagai aset. Tutorial ini juga tersedia di Github. Untuk melihat tutorial Granite lainnya, kunjungi Komunitas IBM Granite

Langkah 2. Instal dan impor pustaka yang relevan

Kami memiliki beberapa dependensi untuk tutorial ini. Pastikan untuk mengimpor yang berikut ini; jika tidak diinstal, Anda dapat menyelesaikan masalah ini dengan instalasi pip cepat.

Jika Anda menerima kesalahan "pip dependensi resolver" terkait dengan paket caikit-nlp, Anda dapat mengabaikannya untuk saat ini karena sisa notebook masih dapat berjalan secara normal.

# Install required packages
! pip install -q peft torchaudio soundfile pytubefix pytube moviepy tqdm https://github.com/huggingface/transformers/archive/main.zip

# Required imports
import json
import os

from pytubefix import YouTube
from tqdm import tqdm
from moviepy.audio.io.AudioFileClip import AudioFileClip

import torch
import torchaudio
from transformers import AutoProcessor, AutoModelForSpeechSeq2Seq
from huggingface_hub import hf_hub_download

Langkah 3. Unduh audio podcast dari YouTube

Dalam tutorial ini, kita akan menggunakan episode terbaru podcast IBM "Mixture of Experts", "AI on IBM z17, Meta's Llama 4 and Google Cloud Next 2025". Podcast ini dihosting di YouTube. Pertama-tama kita akan membuatYouTube  objek dan gunakanstreams.filter(only_audio=True) metode untuk menangkap hanya audio mentah. Dari sana, kita akan mengekstrak audio dari video dan menyimpannya sebagai file audio M4A,out_file .base adalah nama file lengkap, termasuk direktori di mana file akan disimpan tanpam4a  ekstensi. Kami akan menggunakanbase  variabel nanti ketika kita mengonversi format audio.

url = "https://www.youtube.com/watch?v=90fUR1PQgt4" #latest episode 37 minutes

# Create a YouTube object
yt = YouTube(url)

# Download only the audio stream from the video
video = yt.streams.filter(only_audio=True).first()

# Save the audio to a file
out_file = video.download()

# Get the base name and extension of the downloaded audio
base = os.path.splitext(out_file)[0]

Langkah 4: Siapkan file audio podcast untuk inferensi model

Kita perlu membuat beberapa modifikasi pada file audio podcast sebelum kita dapat menggunakannya untuk inferensi model.

Pertama, kita perlu mengonversi file M4A ke file WAV untuk menggunakannya dengan model Granite Speech. Kita akan menggunakan perpustakaan moviepy untuk melakukan konversi ini. Kita dapat menggunakan variabel dasar yang kita definisikan sebelumnya untuk membuat nama file baru dengan.wav ekstensi.

# Load the M4A file
audio_clip = AudioFileClip(out_file)

# Write the audio to a WAV file
audio_clip.write_audiofile(base+".wav")

# Close the audio clip
audio_clip.close()

audio_path = base+".wav"

Selanjutnya, kita akan menggunakan torchaudiodio.load() untuk memuat file audio sebagai tensor dan mengekstrak laju sampel.

Kita juga perlu mengubah bentuk gelombang yang dikembalikan dari suara stereo menjadi suara mono. Kita dapat melakukan ini dengan mengambil rata-rata saluran suara stereo dengan menggunakan torch.mean ().

#Resulting waveform and sample rate
waveform, sample_rate = torchaudio.load(audio_path, normalize=True)

# convert from stereo to mono
mono_waveform = torch.mean(waveform, dim=0, keepdim=True)

# confirm the waveform is mono
assert mono_waveform.shape[0] == 1 # mono

Berikutnya, kita perlu mengambil sampel ulang bentuk gelombang mono ke laju sampel model: 16 khz. Kita dapat menggunakan API resampling torchaudio untuk mencapai ini.

# Resample the mono waveform to the model's sample rate
resample_transform = torchaudio.transforms.Resample(orig_freq=sample_rate, new_freq=16000)
resampled_waveform = resample_transform(mono_waveform)

Akhirnya, kita dapat membagi bentuk gelombang yang disampel ulang menjadi potongan-potongan dengan ukuran yang sama untuk dimasukkan ke dalam model agar inferensi lebih mudah.

Kita akan menggunakan torch.split ()untuk membagi bentuk gelombang yang disampel ulang penuh menjadi potongan-potongan 30 detik dan sampel ukuran potongan sama dengan 30 detik * 16 khz. Langkah ini akan memberi kita daftar bentuk gelombang, potongan, masing-masing dengan 30 detik data audio. Kami akan memasukkan setiap potongan ke dalam model untuk inferensi.

# Define the desired chunk size
chunk_size_seconds = 30 
chunk_size_samples = chunk_size_seconds * 16000

# Split the waveform into chunks of equal size
chunks = torch.split(resampled_waveform, chunk_size_samples, dim=1)

Langkah 5: Muat dan buat instans model ucapan Granite

Sekarang kita dapat mulai membuat instans model ucapan kita.

Pertama-tama kita akan mengatur perangkat obor kita ke CPU. Jika perangkat diatur ke GPU, Anda mungkin mengalami kesalahan kehabisan memori saat menjalankan notebook ini, tetapi CPU akan berfungsi dengan baik pada notebook watsonx.ai Anda. Kami kemudian dapat mengatur prosesor dan tokenizer kami untuk model tersebut.

device = 'cpu'
model_name = "ibm-granite/granite-speech-3.3-8b"
speech_granite_processor = AutoProcessor.from_pretrained(
    model_name, trust_remote_code=True)
tokenizer = speech_granite_processor.tokenizer

Jika Anda menjalankan notebook Anda di platform watsonx.ai, Anda mungkin juga perlu menjalankan kode berikut untuk mengedit secara manual file adapter_config.json . Ini akan menghindari kesalahan saat memuat model.

adapter_config_file = hf_hub_download(model_name, 'adapter_config.json')

#load the existing config file and print it
with open(adapter_config_file, 'r') as file:
    data = json.load(file)

#remove key, value pairs in config file throwing error
keys_to_delete = ['layer_replication', 'loftq_config', 'megatron_config', 'megatron_core', 'use_dora', 'use_rslora']

for key in keys_to_delete:
    if key in data:
        del data[key]

# write the updated config file back to disk
with open(adapter_config_file, 'w') as file:
    json.dump(data, file, indent=4)

with open(adapter_config_file, 'r') as file:
    data = json.load(file)

Bagus, sekarang kita akhirnya bisa memuat modelnya! Kita akan menggunakan AutoModelForSpeechSeq2seq dari pustaka transformers dan metode from_pretrained untuk memuat model.

speech_granite = AutoModelForSpeechSeq2Seq.from_pretrained(model_name, trust_remote_code=True).to(device)

Langkah 6: Buat sistem ASR dengan model ucapan Granite

Sekarang setelah model dimuat dan data audio disiapkan, kita dapat menggunakannya untuk menghasilkan teks dari ucapan.

Kita akan mulai dengan membuat prompt untuk model untuk mentranskripsikan data audio. Kita akan menggunakan tokenizer.apply_chat_template ()untuk mengubah prompt menjadi format yang dapat dimasukkan ke dalam model.

chat = [
    {
        "role": "system",
        "content": "Knowledge Cutoff Date: April 2025.\nToday's Date: April 16, 2025.\nYou are Granite, developed by IBM. You are a helpful AI assistant",
    },
    {
        "role": "user",
        "content": "<|audio|>can you transcribe the speech into a written format?",
    }
]

text = tokenizer.apply_chat_template(
    chat, tokenize=False, add_generation_prompt=True
)

Kemudian, kita dapat mengatur daftar kosong generated_texts, untuk mengumpulkan teks yang dihasilkan dari setiap potongan input audio.

Kita menyiapkan loop for untuk mengulangi setiap potongan audio dan meneruskannya ke model untuk dibuat. Di sini, kita juga akan melacak kemajuan loop dengan menggunakan bilah kemajuan tqdm.

Input model dibuat melalui speech_granite_processor yang kita buat sebelumnya. Prosesor mengambil text dan chunk sebagai input dan mengembalikan versi data audio yang diproses untuk digunakan model.

Output model dihasilkan dengan menggunakan metode generate model ucapan. Dari sana, kita menggunakan tokenizer untuk mengubah output model menjadi teks yang dapat dibaca manusia dan menyimpan transkripsi setiap potongan ke dalam daftar generated_texts kita.

generated_texts = []

for chunk in tqdm(chunks, desc="Generating transcript..."):

    model_inputs = speech_granite_processor(
        text,
        chunk,
        device=device, # Computation device; returned tensors are put on CPU
        return_tensors="pt",
    ).to(device)
    
    # Generate
    model_outputs = speech_granite.generate(
        **model_inputs,
        max_new_tokens=1000,
        num_beams=1,
        do_sample=False,
        min_length=1,
        top_p=1.0,
        repetition_penalty=1.0,
        length_penalty=1.0,
        temperature=1.0,
        bos_token_id=tokenizer.bos_token_id,
        eos_token_id=tokenizer.eos_token_id,
        pad_token_id=tokenizer.pad_token_id,)

    num_input_tokens = model_inputs["input_ids"].shape[-1]
    new_tokens = torch.unsqueeze(model_outputs[0, num_input_tokens:], dim=0)

    output_text = tokenizer.batch_decode(
        new_tokens, add_special_tokens=False, skip_special_tokens=True)[0]

    generated_texts.append(output_text)

Karena transkrip potongan saat ini merupakan string individu dalam daftar, kami akan menggabungkan string bersama dengan spasi di antaranya untuk membuat satu transkrip penuh yang kohesif.

full_transcript = " ".join(generated_texts)

Langkah 7: Gunakan model instruksi Granite untuk ringkasan

Sekarang kita memiliki transkrip lengkap, kita akan menggunakan model yang sama untuk meringkasnya. Kita dapat mengakses Granite-3.3-8B-Instruct model langsung dari Granite-Speech-3.3-8b hanya dengan memanggilnya dengan prompt teks yang tidak berisi token &lt;|audio|&gt;.

Kami akan menyiapkan prompt baru untuk menginstruksikan model ini untuk menghasilkan ringkasan transkrip lengkap. Kita dapat menggunakan tokenizer.apply_chat_template() lagi untuk mengonversi prompt untuk inferensi model.

conv = [{"role": "user", 
         "content": f"Compose a single, unified summary of the following transcript. Your response should only include the unified summary. Do not provide any further explanation. Transcript:{full_transcript}"}]

text = tokenizer.apply_chat_template(conv, tokenize=False, add_generation_prompt=True)

Kita akan gunakan speech_granite_processor lagi untuk membuat input model, tetapi kami tidak akan meneruskan file audio apa pun kali ini.

model_inputs = speech_granite_processor(
    text,
    device=device, # Computation device; returned tensors are put on CPU
    return_tensors="pt",
).to(device)

Kita akan menerima output dari speech_granite.generate ()sebagai tensor. Kita dapat mengonversi output ini menjadi teks dengan menggunakan tokenizer.decode (). Dan cetak ringkasan akhir!

output = speech_granite.generate(
    **model_inputs,
    max_new_tokens= 2000, # concise summary
)

summary = tokenizer.decode(output[0, model_inputs["input_ids"].shape[1]:], skip_special_tokens=True)
print(summary)

Output:

In the 50th episode of Mixture of Experts, the panel discusses various AI-related topics. 

Kate Soule, Director of Technical Product Management at Granite, estimates that 90% of enterprise data is unstructured. 

Hilary Hunter, IBM Fellow and CTO of IBM Infrastructure, introduces IBM's new mainframe launch, IBM z, emphasizing its zero downtime and eight nines of reliability, crucial for global financial transactions. 

The conversation also touches on Meta's Llama 4 release, featuring three models: Scout (100 billion parameters), Maverick (200 billion parameters), and Behemoth (two trillion parameters). The panelists discuss the implications of these models, particularly the mixture of experts architecture, and its potential to become more community-driven. 

Shobhit Varshney Head of Data and AI for the Americas, shares insights on handling unstructured data in enterprises, advocating for bringing AI close to transaction data for low-latency, mission-critical applications. 

The episode concludes with a brief overview of Google Cloud Next, highlighting advancements in AI models, on-premises AI capabilities, and Google's focus on AI for media creation and agent-to-agent communication. 

The panel also references a Pew Research report on American perceptions of AI, noting discrepancies between experts' optimism and the general public's concerns about job impacts from AI.

Kesimpulan

Dalam tutorial ini, Anda mengunduh file audio bahasa Inggris dari YouTube. Anda mengubah file audio untuk dikonsumsi oleh model ucapan Granite, menghasilkan transkrip lengkap audio dan menggunakan model instruksi Granite untuk menghasilkan ringkasan transkrip.

Solusi terkait
IBM watsonx Orchestrate

Rancang asisten dan agen AI yang dapat diskalakan dengan mudah, otomatiskan tugas berulang, dan sederhanakan proses kompleks dengan IBM watsonx Orchestrate.

Temukan watsonx Orchestrate
Alat dan API pemrosesan bahasa alami

Mempercepat nilai bisnis kecerdasan buatan dengan portofolio pustaka, layanan, dan aplikasi yang kuat dan fleksibel.

Jelajahi solusi NLP
Konsultasi dan layanan AI

Temukan kembali alur kerja dan operasi yang penting dengan menambahkan AI untuk memaksimalkan pengalaman, pengambilan keputusan secara real-time, dan nilai bisnis.

Jelajahi layanan AI
Ambil langkah selanjutnya

Rancang asisten dan agen AI yang dapat diskalakan dengan mudah, otomatiskan tugas berulang, dan sederhanakan proses kompleks dengan IBM watsonx Orchestrate.

Temukan watsonx Orchestrate Jelajahi solusi NLP