Dans ce tutoriel, vous allez utiliser le modèle de reconnaissance vocale open source IBM® Granite 3.3 pour générer la transcription d’un podcast IBM « Mixture of Experts » à partir de YouTube. Ensuite, grâce au modèle de grand langage (LLM) open source IBM Granite-3.3-8B-Instruct, vous produirez la synthèse de la transcription générée. Vous exécuterez ce code sur un notebook watsonx.ai.
La reconnaissance automatique de la parole (ASR), également appelée reconnaissance vocale ou Speech to Text, est la technologie qui convertit la langue parlée en texte écrit. Divers algorithmes de machine learning et techniques de calcul d’intelligence artificielle sont utilisés pour convertir la parole en texte. La technologie de reconnaissance vocale a considérablement évolué depuis ses débuts au milieu du vingtième siècle jusqu’à aujourd’hui.
Dans les années 1960, les spectrogrammes ont été initialement utilisés pour analyser la parole. Une évolution a eu lieu au cours des décennies suivantes avec l’apparition des modèles statistiques. Les modèles de Markov cachés (MMC) ont vu le jour et sont devenus prédominants pour la modélisation des séquences de petites unités sonores appelées phonèmes en linguistique. L’architecture des systèmes de reconnaissance automatique de la parole (ASR) était composée de trois éléments distincts : un modèle acoustique, un modèle de langage et un décodeur.
Dans les années 2010, les avancées en apprentissage profond ont commencé à influencer l’architecture traditionnelle des systèmes de reconnaissance vocale. Les modèles encodeur-décodeur peuvent utiliser une architecture de type réseau de neurones récurrents (RNN) ou réseau de neurones convolutifs (CNN), où un encodeur traite les données d’entrée et un décodeur génère une sortie s’appuyant sur la représentation de l’encodeur. Les modèles peuvent être entraînés sur de grands jeux de données non étiquetées de paires audio/texte pour apprendre à associer les signaux audio aux transcriptions. Les modèles ASR les plus connus sont DeepSpeech et Wav2Vec.
Aujourd’hui, les assistants virtuels tels que Siri d’Apple, Alexa d’Amazon ou Cortana de Microsoft utilisent la technologie ASR pour traiter la parole en temps réel. Ils sont également en mesure d’intégrer Speech to Text aux grands modèles de langage (LLM) et au traitement automatique du langage naturel (TAL). Les LLM peuvent être utilisés pour ajouter du contexte, ce qui peut être utile lorsque les choix de mots sont plus ambigus ou en cas de variabilité dans les schémas de parole.
Vous devez disposer d’un compte IBM® Cloud pour créer votre projet watsonx.ai.
Bien que vous puissiez utiliser un autre outil, ce tutoriel vous guide pas à pas pour configurer votre compte IBM afin de pouvoir utiliser un Jupyter Notebook.
Connectez-vous à watsonx.ai en utilisant votre compte IBM Cloud.
2. Créez un projet watsonx.ai.
3. Créez un Jupyter Notebook.
Veillez à choisir
Vous pouvez également télécharger ce notebook localement sur votre système et le charger dans votre projet watsonx.ai en tant qu’actif. Ce tutoriel est également disponible sur GitHub. Pour voir d’autres tutoriels Granite, consultez les pages de la Communauté IBM Granite.
Nous avons quelques dépendances pour ce tutoriel. Importez les paquets suivants ; s’ils ne sont pas installés, vous pouvez rapidement résoudre ce problème avec une installation pip.
Si vous recevez un message d’erreur « pip dependency resolver » lié au package « caikit-nlp », vous pouvez l’ignorer pour l’instant car le reste du notebook fonctionnera normalement.
# 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
Dans ce tutoriel, nous utiliserons le dernier épisode du podcast IBM « Mixture of Experts », intitulé « IA sur IBM z17, Meta’s Llama 4 et Google Cloud Next 2025 ». Le podcast est hébergé sur YouTube. Nous allons d’abord créer un
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]
Nous allons devoir apporter quelques modifications au fichier audio du podcast afin de pouvoir l’utiliser pour l’inférence du modèle.
Tout d’abord, nous devons convertir le fichier M4A en fichier WAV pour l’utiliser avec le modèle vocal Granite. Nous utiliserons la bibliothèque moviepy pour effectuer cette conversion. Nous pouvons utiliser la variable de base que nous avons définie précédemment pour créer le nouveau nom de fichier avec l’extension .wav.
# 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"
Ensuite, nous utiliserons « torchaudiodio.load() » pour charger le fichier audio en tant que tenseur et extraire le taux d’échantillonnage.
Il nous faudra également convertir la forme d’onde renvoyée de stéréo en mono. Pour ce faire, nous prenons la moyenne des canaux sonores stéréo grâce à « 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
Ensuite, nous devons échantillonner la forme d’onde mono selon le taux d’échantillonnage du modèle : 16 kHz. Pour ce faire, nous pouvons utiliser l’API d’échantillonnage de torchaudio.
# 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)
Enfin, nous divisons la forme d’onde échantillonnée en morceaux de taille égale à introduire dans le modèle pour faciliter l’inférence.
Nous utiliserons « torch.split () » pour diviser la forme d’onde échantillonnée en morceaux de 30 secondes et un échantillon de taille de morceau égale à 30 secondes * 16 kHz. Cette étape nous donnera une liste de formes d’onde, des « morceaux» dont chacun contient 30 secondes de données audio. Nous allons intégrer chaque morceau au modèle à des fins d’inférence.
# 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)
Nous pouvons maintenant commencer à instancier notre modèle vocal.
Nous allons d’abord configurer notre appareil torch sur CPU. S’il est défini sur GPU, vous pourriez rencontrer des erreurs de mémoire insuffisante lors de l’exécution de ce notebook ; « CPU » devrait fonctionner correctement sur votre notebook watsonx.ai. Nous allons ensuite configurer notre processeur et tokeniseur pour le modèle.
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
Si vous exécutez votre notebook sur la plateforme watsonx.ai, il faudra probablement exécuter le code suivant pour modifier manuellement le fichier « adapter_config.json ». Cela évitera toute erreur lors du chargement du modèle.
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)
Parfait, nous pouvons enfin charger le modèle ! Nous utiliserons «AutoModelForSpeechSeq2Seq » de la bibliothèque « transformers » et la méthode `« rom_pretrained » pour charger le modèle.
speech_granite = AutoModelForSpeechSeq2Seq.from_pretrained(model_name, trust_remote_code=True).to(device)
Maintenant que le modèle est chargé et que les données audio sont prêtes, nous pouvons générer un texte à partir du contenu vocal.
Nous allons commencer par créer un prompt pour que le modèle puisse transcrire les données audio. Nous utiliserons « tokenizer.apply_chat_template() » pour donner au prompt un format intégrable au modèle.
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
)
Ensuite, nous allons configurer une liste vide « generated_texts » pour recueillir le texte généré à partir de chaque morceau d’entrée audio.
Nous avons mis en place une boucle « for » pour itérer sur chaque segment audio et le transmettre au modèle pour génération. Ici, nous allons également suivre la progression de la boucle en utilisant une barre de progression « tqdm ».
Les entrées du modèle sont créées avec « speech_granite_processor », que nous avons établi précédemment. Le processeur prend le « text » et « chunk » en entrée et renvoie une version traitée des données audio que le modèle peut utiliser.
Les sorties du modèle sont produites en utilisant la méthode « generate » du modèle vocal. Ensuite, nous utilisons le « tokenizer » pour convertir les sorties du modèle en texte lisible par l’humain et stocker la transcription de chaque morceau dans notre liste « generated_texts ».
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)
Puisque les transcriptions sont actuellement des chaînes individuelles dans une liste, nous allons unir les chaînes avec un espace entre les deux pour former une transcription complète et cohérente.
full_transcript = " ".join(generated_texts)
Maintenant que nous avons une transcription complète, nous allons utiliser le même modèle pour la résumer. Nous pouvons accéder au modèle Granite-3.3-8B-Instruct directement à partir de Granite-speech-3.3-8b en l’appelant simplement avec un prompt textuel qui ne contient pas le token « <|audio|> ».
Nous allons créer un nouveau prompt pour demander à ce modèle de générer une synthèse de la transcription. Nous pouvons utiliser « tokenizer.apply_chat_template() » à nouveau pour convertir le prompt pour l’inférence du modèle.
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)
Nous allons utiliser à nouveau « speech_granite_processor » pour créer des entrées de modèle, mais cette fois, nous ne transmettrons aucun fichier audio.
model_inputs = speech_granite_processor(
text,
device=device, # Computation device; returned tensors are put on CPU
return_tensors="pt",
).to(device)
Nous recevrons la sortie de « speech_granite.generate() » sous forme de tenseur. Nous pouvons convertir cette sortie en texte avec « tokenizer.decode() » et imprimer notre synthèse finale !
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)
Sortie :
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.
Dans ce tutoriel, vous avez téléchargé un fichier audio en anglais sur YouTube. Vous avez transformé le fichier audio pour qu’il puisse être consommé par le modèle vocal Granite, généré la transcription complète de l’audio et utilisé un modèle d’instruction Granite pour générer la synthèse de la transcription.
Concevez facilement des assistants et des agents IA évolutifs, automatisez les tâches répétitives et simplifiez les processus complexes avec IBM watsonx Orchestrate.
Accélérez la valeur métier de l’intelligence artificielle grâce à un portefeuille puissant et flexible de bibliothèques, de services et d’applications.
Réinventez les workflows et les opérations critiques en ajoutant l’IA pour optimiser les expériences, la prise de décision et la valeur métier en temps réel.