Я пытаюсь разработать детектор горячих слов, используя HF и pytorch. До сих пор я изучал документацию и понял, что такое объятие лица.
Я запускаю код на своем Macbook, используя MPS для ускорения. Я следил за этим блокнотом https://colab.research.google.com/githu ... yXDtQqNUZW, чтобы понять процесс. Цели
Я хотел бы точно настроить wave2vec на наборе данных super/ks, добавив одно ключевое слово (мое горячее слово, что-то вроде «эй, помощник»).
Ожидается, что приложение распознает произносимые слова.
Я создал простое приложение, слушайте микрофон и передайте записанные данные модели, протестированной с помощью предварительно обученной онлайн-модели (
), чтобы убедиться, что оно работает правильно. Проблема
Когда я запускаю приложение, используя свой собственный штраф -настроенная модель, на выходе постоянно выводится «неизвестно».
Я просто не понимаю, что здесь не так. Что я пробовал
Ниже 3 файла, которые я создал для 1) создания набора данных (для моего собственного слова пробуждения), 2) тонкой настройки /training и 3) запустить вывод.
Мой набор данных подготовлен только для слова пробуждения, которое позже я объединим с превосходным/kb.
# prepare_dataset.py
import os
from datasets import Dataset, Audio, ClassLabel
def load_wake_word_files(directory):
"""Generate a dataset compatible with superb/ks.
"""
data = []
for filename in os.listdir(directory):
if filename.endswith(".wav"):
file = os.path.join(directory, filename)
data.append({"file": file, "audio": file, "label": "hey_assistant"}) # Label 1 for wake words
print(f"{len(data)} files found")
return data
# Path to your wake words directory
wake_word_dir = "/Users/jah/code/assistant/py/hotword/data/hey_assistant/"
# Create the dataset for wake words
wake_word_data = load_wake_word_files(wake_word_dir)
dataset = Dataset.from_dict({"file": [item["file"] for item in wake_word_data], "audio": [item["audio"] for item in wake_word_data], "label": [item["label"] for item in wake_word_data]})
# Cast to Audio type, opening each file
dataset = dataset.cast_column("audio", Audio(sampling_rate=16000))
dataset = dataset.cast_column("label", ClassLabel(names=["yes", "no", "up", "down", "left", "right", "on", "off", "stop", "go", "_silence_", "_unknown_", "hey_assistant"]))
# Assuming a 80-20 train-test split
split_dataset = dataset.train_test_split(test_size=0.2)
# Save the dataset
split_dataset.save_to_disk("/Users/jah/code/assistant/py/hotword/data/dataset_wave2vec2/")
print("Wake word dataset created and saved to disk.")
Здесь я объединяю два набора данных, расширяя метки для превосходного, включая мое собственное слово для пробуждения.
# app.py
from transformers import pipeline
from transformers.pipelines.audio_utils import ffmpeg_microphone_live
import torch
# Simplified device assignment
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
if torch.backends.mps.is_available() and torch.backends.mps.is_built():
device = torch.device("mps")
print(f"Device: {device}")
# Load classifier
classifier = pipeline(
"audio-classification",
model="/Users/jah/code/assistant/py/hotword/data/results/wav2vec2-base-finetuned-ks/checkpoint-2150",
device=device,
local_files_only=True
)
print(classifier.model.config.id2label)
def launch_fn(
wake_word="hey_assistant",
prob_threshold=0.5,
chunk_length_s=2.0,
stream_chunk_s=1.0,
debug=False,
):
if wake_word not in classifier.model.config.label2id.keys():
raise ValueError(
f"Wake word {wake_word} not in set of valid class labels, pick a wake word in the set {classifier.model.config.label2id.keys()}."
)
sampling_rate = classifier.feature_extractor.sampling_rate
mic = ffmpeg_microphone_live(
sampling_rate=sampling_rate,
chunk_length_s=chunk_length_s,
stream_chunk_s=stream_chunk_s,
)
print("Listening for wake word...")
for prediction in classifier(mic):
prediction = prediction[0]
if debug:
print(f"Prediction: {prediction}")
if prediction["label"] == wake_word and prediction["score"] > prob_threshold:
print("Wake word detected!")
return True
else:
print("Wake word not detected, continuing...")
if __name__ == "__main__":
launch_fn(debug=True)
Prediction: {'score': 0.13256900012493134, 'label': '_unknown_'} Wake word not detected, continuing...
Я проверил метки, все они присутствуют, однако ни одно из слов не работает, даже те, что взяты из super/ksПользовательский набор данных
Пользовательский набор данных содержит около 6 000 образцов слова с аудиосэмплами продолжительностью от 1 до 3 секунд. Подведение итогов
Будем благодарны за любую помощь. На обучение модели у меня ушло более 7 часов, и я уже потратил на это недели — похоже, я не могу найти блокнот, идущий от начала до конца, и, следовательно, найти рабочее решение, что удручает.< /p>
Результат обучения заканчивается:
Я пытаюсь разработать детектор горячих слов, используя HF и pytorch. До сих пор я изучал документацию и понял, что такое объятие лица. Я запускаю код на своем Macbook, используя MPS для ускорения. Я следил за этим блокнотом https://colab.research.google.com/github/huggingface/notebooks/blob/main/examples/audio_classification.ipynb#scrollTo=UuyXDtQqNUZW, чтобы понять процесс. [b]Цели[/b] Я хотел бы точно настроить wave2vec на наборе данных super/ks, добавив одно ключевое слово (мое горячее слово, что-то вроде «эй, помощник»). Ожидается, что приложение распознает произносимые слова. Я создал простое приложение, слушайте микрофон и передайте записанные данные модели, протестированной с помощью предварительно обученной онлайн-модели ([code]MIT/ast-finetuned-speech-commands-v2[/code]), чтобы убедиться, что оно работает правильно. [b]Проблема[/b] Когда я запускаю приложение, используя свой собственный штраф -настроенная модель, на выходе постоянно выводится «[b]неизвестно[/b]». Я просто не понимаю, что здесь не так. [b]Что я пробовал[/b] Ниже 3 файла, которые я создал для 1) создания набора данных (для моего собственного слова пробуждения), 2) тонкой настройки /training и 3) запустить вывод. Мой набор данных подготовлен только для слова пробуждения, которое позже я объединим с превосходным/kb. [code]# prepare_dataset.py
import os from datasets import Dataset, Audio, ClassLabel
def load_wake_word_files(directory): """Generate a dataset compatible with superb/ks. """ data = [] for filename in os.listdir(directory): if filename.endswith(".wav"): file = os.path.join(directory, filename) data.append({"file": file, "audio": file, "label": "hey_assistant"}) # Label 1 for wake words
print(f"{len(data)} files found") return data
# Path to your wake words directory wake_word_dir = "/Users/jah/code/assistant/py/hotword/data/hey_assistant/"
# Create the dataset for wake words wake_word_data = load_wake_word_files(wake_word_dir) dataset = Dataset.from_dict({"file": [item["file"] for item in wake_word_data], "audio": [item["audio"] for item in wake_word_data], "label": [item["label"] for item in wake_word_data]}) # Cast to Audio type, opening each file dataset = dataset.cast_column("audio", Audio(sampling_rate=16000)) dataset = dataset.cast_column("label", ClassLabel(names=["yes", "no", "up", "down", "left", "right", "on", "off", "stop", "go", "_silence_", "_unknown_", "hey_assistant"]))
# Assuming a 80-20 train-test split split_dataset = dataset.train_test_split(test_size=0.2)
# Save the dataset split_dataset.save_to_disk("/Users/jah/code/assistant/py/hotword/data/dataset_wave2vec2/")
print("Wake word dataset created and saved to disk.") [/code] Здесь я объединяю два набора данных, расширяя метки для превосходного, включая мое собственное слово для пробуждения. [code]# fine_tuning.py """ Reference doc: https://colab.research.google.com/github/huggingface/notebooks/blob/main/examples/audio_classification.ipynb#scrollTo=UuyXDtQqNUZW """ from datasets import load_dataset, load_metric, load_from_disk, ClassLabel, concatenate_datasets from transformers import AutoFeatureExtractor, AutoModelForAudioClassification, TrainingArguments, Trainer import numpy as np import torch
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") if torch.backends.mps.is_available() and torch.backends.mps.is_built(): device = torch.device("mps")
# data testing purposes import random from IPython.display import Audio, display
# this will use the pytorch device set above trainer.train() trainer.evaluate() [/code] Наконец, это приложение, которое должно использовать обученную модель: [code]# app.py
from transformers import pipeline from transformers.pipelines.audio_utils import ffmpeg_microphone_live import torch
# Simplified device assignment device = torch.device("cuda" if torch.cuda.is_available() else "cpu") if torch.backends.mps.is_available() and torch.backends.mps.is_built(): device = torch.device("mps")
def launch_fn( wake_word="hey_assistant", prob_threshold=0.5, chunk_length_s=2.0, stream_chunk_s=1.0, debug=False, ): if wake_word not in classifier.model.config.label2id.keys(): raise ValueError( f"Wake word {wake_word} not in set of valid class labels, pick a wake word in the set {classifier.model.config.label2id.keys()}." )
sampling_rate = classifier.feature_extractor.sampling_rate mic = ffmpeg_microphone_live( sampling_rate=sampling_rate, chunk_length_s=chunk_length_s, stream_chunk_s=stream_chunk_s, )
print("Listening for wake word...") for prediction in classifier(mic): prediction = prediction[0] if debug: print(f"Prediction: {prediction}")
if prediction["label"] == wake_word and prediction["score"] > prob_threshold: print("Wake word detected!") return True else: print("Wake word not detected, continuing...")
if __name__ == "__main__": launch_fn(debug=True)
[/code] К сожалению, он печатает только такие данные: [code]Prediction: {'score': 0.13256900012493134, 'label': '_unknown_'} Wake word not detected, continuing...[/code] Я проверил метки, все они присутствуют, однако ни одно из слов не работает, даже те, что взяты из super/ks[b]Пользовательский набор данных[/b] Пользовательский набор данных содержит около 6 000 образцов слова с аудиосэмплами продолжительностью от 1 до 3 секунд. [b]Подведение итогов[/b] Будем благодарны за любую помощь. На обучение модели у меня ушло более 7 часов, и я уже потратил на это недели — похоже, я не могу найти блокнот, идущий от начала до конца, и, следовательно, найти рабочее решение, что удручает.< /p> Результат обучения заканчивается: [code]{'loss': 2.2602, 'grad_norm': 201870911995904.0, 'learning_rate': 1.5503875968992249e-07, 'epoch': 4.97} {'loss': 2.2482, 'grad_norm': 281655633772544.0, 'learning_rate': 0.0, 'epoch': 5.0} {'eval_loss': 2.2558882236480713, 'eval_accuracy': 0.6209179170344219, 'eval_runtime': 129.4695, 'eval_samples_per_second': 52.507, 'eval_steps_per_second': 1.645, 'epoch': 5.0} {'train_runtime': 20807.897, 'train_samples_per_second': 13.232, 'train_steps_per_second': 0.103, 'train_loss': 2.2983862703900004, 'epoch': 5.0} [/code] Я заметил, что grad_norm сильно колебался, но не уверен, что это указывает на проблемы с самим обучением.
Я следую этому сценарию и пытаюсь адаптироваться, установив device_map = auto для использования нескольких графических процессоров в контейнере Docker. Ниже приведены настройки сервера:
DITRIB_ID=Ubuntu
DISPRIB_RELEASE=22.04
ubuntu@ubuntu:~$...
Почему исходная модель ( csebuetnlp/mT5_multilingual_XLSum ) дала хорошие результаты при тестировании ее на арабских образцах, но при тестировании точно настроенной модели на наборе данных XLSUM для 10 эпох она не дала хороших результатов. Хотя...
Я работаю над проектом с использованием предварительно обученных моделей SBERT (в частности, MiniLM) для проекта классификации текста с 995 классификациями. По большей части я следую шагам, изложенным здесь, и, кажется, все работает.
Моя проблема...