Как эффективно кластеризовать речевые сегменты по говорящему?

Вопрос или проблема

У нас есть ~30 аудиофрагментов, из которых около 50% принадлежат одному и тому же говорящему, который является нашей целевой целью, а остальные — от различных других говорящих. Мы хотим извлечь все аудиофрагменты от нашего целевого говорящего, то есть определить, какой голос встречается чаще всего, а затем выбрать все аудиозаписи с этим голосом.

Для этой цели мы попытались использовать библиотеку resemblyzer для генерации эмбеддингов на уровне говорящего из наших аудиозаписей, а затем применить PCA, чтобы выяснить, сможем ли мы обнаружить какие-либо кластеры:

from resemblyzer import VoiceEncoder
encoder = VoiceEncoder()

embeddings = []
for snippet in audio_snippets: # audio_snippets — это список numpy представлений наших записей
    embeddings.append(encoder.embed_utterance(snippet, return_partials=False))

from sklearn.cluster import AgglomerativeClustering
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

clustering = AgglomerativeClustering(n_clusters=None, distance_threshold=0.8, linkage="ward")
labels = clustering.fit_predict(embeddings)

pca = PCA(n_components=2)
X_pca = pca.fit_transform(embeddings)

plt.figure()
for i, k in enumerate(embeddings):
    x_val, y_val = X_pca[i, 0], X_pca[i, 1]
    plt.scatter(x_val, y_val, color=f"C{labels[i]}")
    plt.annotate(k, (x_val, y_val), xytext=(5, 2), textcoords="offset points")

plt.xlabel("PC1")
plt.ylabel("PC2")
plt.title("PCA Embeddings Говорящих (Топ 2 Говорящих/Видео)")
plt.show()

Из этого мы ожидаем увидеть четкий кластер из 15 аудиофрагментов, оставшиеся 15 будут разбросаны повсеместно. Однако, это не кластеризует фрагменты по говорящему, так как в большинстве кластеров все еще содержатся записи других говорящих и это, в целом, не очень точно:

Введите описание изображения здесь

Существует ли более эффективный способ достижения этой цели?

Я думаю, было бы полезно сначала визуализировать эмбеддинги, чтобы увидеть, насколько хорошо они позволяют различать разных говорящих.

Мой подход заключался бы в использовании UMAP для проекции эмбеддингов в двумерное пространство, а затем создания диаграммы разброса этих результатов, окрашенных в цвета в зависимости от говорящего.

В идеале вы обнаружите, что разные цвета (говорящие) в целом отделены друг от друга. Если цвета сильно перекрываются (что означает, что эмбеддинги не вполне разделяют разных говорящих), возможно, вам придется пересмотреть, как извлекаются эмбеддинги и/или являются ли проблемой ограничения данных.

Если эмбеддинги выглядят хорошо, я бы попробовал использовать HDBSCAN для кластеризации эмбеддингов$^\dagger$. Важно проецировать эмбеддинги на меньшее количество измерений перед запуском кластеризации ($<50$ для HDBSCAN) – это можно сделать с использованием UMAP(n_components=5, min_dist=0).


$\dagger$ HDBSCAN вернет столько кластеров, сколько найдет; вы не можете ограничить его 15 кластерами, поэтому потребуется некоторая пост-обработка. Вы можете также использовать алгоритм кластеризации, который принимает аргумент n_clusters=, например KMeans. Стоит попробовать несколько различных алгоритмов.

.

Ответ или решение

Кластеризация аудиосегментов по говорящему представляет собой важный шаг в ряде приложений, таких как обработка речи, биометрическая идентификация и автоматизация взаимодействия с клиентами. Основной задачей в вашей ситуации является извлечение всех аудиосегментов, принадлежащих целевому говорящему, из совокупности аудиоданных, содержащих как его голос, так и голоса других людей.

Теория

Основной идеей этого процесса является преобразование аудиоданных в их числовую характеристику, которая отражает уникальные особенности голоса каждого говорящего. Это позволяет сравнивать кусочки аудио друг с другом на более высоком уровне абстракции, чем просто сравнение исходных аудиофайлов. В качестве такой числовой характеристики часто используются эмбеддинги — многомерные векторы, представляющие важные особенности звука.

Следующим шагом является визуализация этих эмбеддингов для оценки их способности разделять разные голоса. Одним из способов визуализации данных в двумерном пространстве является использование t-SNE или UMAP проекций. Это позволяет идентифицировать области, где эмбеддинги различных говорящих сосредоточены, тем самым подсказывая, насколько хорошо они выделяются друг от друга.

После визуализации необходимо применить алгоритм кластеризации, который способен группировать эмбеддинги сходных голосов. Среди распространенных техник кластеризации выделяют KMeans, которая требует задания числа кластеров априори, и HDBSCAN, который находит оптимальное количество кластеров независимо. HDBSCAN часто используется, когда известно, что количество кластеров является переменным.

Пример

Ваша первоначальная попытка задействовала библиотеку Resemblyzer для генерации эмбеддингов. Однако, результат показал, что в кластерах еще присутствуют смешанные записи с другими ораторами. Это может быть вызвано нечеткостью либо чрезмерной схожестью эмбеддингов различных говорящих.

Для улучшения результатов стоит предпринять следующие шаги:

  1. Предобработка данных: Убедитесь, что аудиофайлы очищены от шума и фоновых звуков, которые могут затруднить процесс генерации эмбеддингов.
  2. Анализ эмбеддингов: Используйте UMAP для проекции эмбеддингов в 2D пространство с целью оценки, насколько различимы эмбеддинги от разных ораторов. Настройте параметры n_neighbors и min_dist для улучшения разделимости.
  3. Кластеризация: Применяйте HDBSCAN после уменьшения размерности с помощью UMAP до менее чем 50 признаков. HDBSCAN выявит как большое, так и малое количество кластеров, не требуя априори указание количества этих кластеров.

Применение

  1. Подготовка данных: Перед началом работы убедитесь, что все аудиофайлы стандартизированы по уровню громкости и длительности. Можно рассмотреть пакетную нормализацию аудиоданных.

  2. Получение эмбеддингов:

    from resemblyzer import VoiceEncoder
    encoder = VoiceEncoder()
    
    embeddings = [encoder.embed_utterance(snippet, return_partials=False) for snippet in audio_snippets]
  3. Визуализация:

    import umap
    import matplotlib.pyplot as plt
    
    reducer = umap.UMAP(n_components=2, n_neighbors=15, min_dist=0.0)
    X_umap = reducer.fit_transform(embeddings)
    
    plt.scatter(X_umap[:, 0], X_umap[:, 1], c='gray', s=5)
    plt.title("UMAP Projection of Speaker Embeddings")
    plt.show()
  4. Кластеризация:

    import hdbscan
    
    clusterer = hdbscan.HDBSCAN(min_cluster_size=2, metric='euclidean')
    labels = clusterer.fit_predict(embeddings)
    
    plt.scatter(X_umap[:, 0], X_umap[:, 1], c=labels, cmap='Spectral', s=5)
    plt.title("HDBSCAN Clustering of UMAP-reduced Embeddings")
    plt.show()
  5. Анализ результатов: Если результаты кластеризации остаются неточными, возможно требуется дополнительная работа с параметрами, либо использование гибридных методов (например, объединение результатов KMeans с HDBSCAN).

Таким образом, грамотно выстроенный процесс обработки и анализа позволит выделить целевые сегменты с наибольшей возможной точностью. Результаты, полученные на этом этапе, могут быть дополнительно оценены с использованием ручной валидации или специальных метрик качества кластеризации.

Оцените материал
Добавить комментарий

Капча загружается...