MMS-MSG-очень модульная и гибкая структура для генерации речевых смесей. Он расширяет кодовую основу базы данных SMS-WSJ для генерации сигналов смеси, чтобы иметь возможность генерировать как речевые смеси в стиле встречи, так и сигналы смеси, соответствующие базам данных классических речевых смесей.
Встреча данных описывает очень динамическую настройку. Обе среда с MMS-MSG, мы не стремимся предоставить единую новую базу данных.
Вместо этого мы хотим предоставить адаптируемую структуру, которая позволяет прототипировать и оценить систему прохождения и транскрипции в максимально возможной среде.
Основным аспектом MMS-MSG является генерация данных в стиле собрания. Встречи генерируются модульным образом. Регулируемые параметры:
Процесс отбора проб модульный, так что многие сценарии могут быть созданы путем слегка изменяя трубопровод отбора проб. Мы предоставляем примеры классов, чтобы показать, как используются отдельные модули. Если сценарий не поддерживается, новые модули отбора проб могут быть легко реализованы для адаптации MMS-MSG к вашим требованиям.
Процесс моделирования данных MMS-MSG разделен на выборку параметров и фактическую генерацию данных. Благодаря этому мы поддерживаем генерацию данных по требованию. Таким образом, необходимо сохранить только исходные данные и параметры встречи, что позволяет моделировать различные сценарии встречи при минимизации требуемого дискового пространства. Тем не менее, мы также поддерживаем автономное поколение данных о собрании, если для вашего рабочего процесса требуется сохранение их на жесткий диск.
Мы предоставляем код для генерации речевых смесей в соответствии со спецификациями используемых в настоящее время баз данных разделения источников, где отдельные высказывания нескольких динамиков либо частично, либо полностью перекрываются друг с другом. Используя MMS-MSG для создания учебных данных для этих баз данных, мы предлагаем собственную поддержку динамического микширования.
Поддерживаемые базы данных речевой смеси:
Запланировано:
Генератор смеси использует lazy_dataset. В то время как основная функциональность MMS_MSG может использоваться без lazy_dataset, некоторые функции (например, динамическое микширование и абстракция базы данных) недоступны тогда.
from mms_msg . databases . classical . full_overlap import WSJ2Mix
from mms_msg . sampling . utils import collate_fn
db = WSJ2Mix ()
# Get a train dataset with dynamic mixing
# This dataset only emits the metadata of the mixtures, it doesn't load
# the data yet
ds = db . get_dataset ( 'train_si284_rng' )
# The data can be loaded by mapping a database's load_example function
ds = ds . map ( db . load_example )
# Other dataset modifications (see lazy_dataset doc)
ds = ds . shuffle ( reshuffle = True )
ds = ds . batch ( batch_size = 8 ). map ( collate_fn )
# ...
# Parallelize data loading with lazy_dataset
ds = ds . prefetch ( num_workers = 8 , buffer_size = 16 )
# The dataset can now be used in any training loop
for example in ds :
# ... do fancy stuff with the example.
# The loaded audio data is in example['audio_data']
print ( example )
Любые другие процедуры модификации данных могут быть сопоставлены с ds
непосредственно после загрузки примера.
A lazy_dataset.Dataset
можно подключить к torch.utils.data.DataLoader
:
from mms_msg . databases . classical . full_overlap import WSJ2Mix
db = WSJ2Mix ()
ds = db . get_dataset ( 'train_si284_rng' ). map ( db . load_example )
# Parallelize data loading with torch.utils.data.DataLoader
from torch . utils . data import DataLoader
loader = DataLoader ( ds , batch_size = 8 , shuffle = True , num_workers = 8 )
for example in loader :
print ( example )
Входные примеры должны иметь эту структуру:
example = {
'audio_path' : {
'observation' : 'single_speaker_recording.wav'
},
'speaker_id' : 'A' ,
'num_samples' : 1234 , # Number of samples of the observation file
# 'num_samples': {'observation': 1234} # Alernative, if other audios are present
'dataset' : 'test' , # The input dataset name
'example_id' : 'asdf1234' , # Unique ID of this example. Optional if the input data is passes as a dict
'scenario' : 'cafe-asdf1234' , # (Optional) If provided, mms_msg makes sure that all examples of the same speaker in a mixture share the same scenario
# ... (any additional keys)
}
После выбора высказываний для смеси эти примеры высказывания нормализованы и сопоставлены, что приводит к структуре, аналогичной этой:
example = {
'audio_path' : {
'original_source' : [
'source1.wav' ,
'source2.wav' ,
],
},
'speaker_id' : [
'A' , 'B'
],
'num_samples' : { # The structure under some keys mirrors the structure in 'audio_path'
'original_source' : [
1234 , 4321
]
},
'source_id' : [ # Reference to the source examples this mixture was created from
'asdf1234' , 'asdf1235'
],
...
}
Начиная с такой структуры, модули отбора проб могут быть применены для заполнения примера дополнительной информацией, например, смещения или масштабирования высказываний.
Классы или определения базы данных предоставляются для нескольких общих сценариев в mms_msg.databases
. Каждый класс базы данных должен определить два метода:
get_mixture_dataset
, который инкапсулирует стадию «выборки» и строит трубопровод модулей отбора проб иload_example
, который обеспечивает стадию «моделирования», т.е. загружает и смешивает аудиоданные.База данных базовой (без параметров) будет выглядеть так:
from mms_msg . databases . database import MMSMSGDatabase
from lazy_dataset . database import JsonDatabase
import mms_msg
class MyDatabase ( JsonDatabase , MMSMSGDatabase ):
def get_mixture_dataset ( self , name , rng ):
ds = mms_msg . sampling . source_composition . get_composition_dataset (
input_dataset = super (). get_dataset ( name ),
num_speakers = 2 ,
rng = rng ,
)
ds = ds . map ( mms_msg . sampling . pattern . classical . ConstantOffsetSampler ( 8000 ))
ds = ds . map ( mms_msg . sampling . environment . scaling . ConstantScalingSampler ( 0 ))
return ds
def load_example ( self , example ):
return mms_msg . simulation . anechoic . anechoic_scenario_map_fn ( example )
и может быть создан с
db = MyDatabase ( 'path/to/source/database.json' )
Структура конвейера выборки набора данных описана в следующем разделе.
Это пример простого конвейера выборки для одного набора данных:
import mms_msg
input_ds = ... # Get source utterance examples from somewhere
# Compute a composition of base examples. This makes sure that the speaker distribution
# in the mixtures is equal to the speaker distribution in the original database.
ds = mms_msg . sampling . source_composition . get_composition_dataset ( input_dataset = input_ds , num_speakers = 2 )
# If required: Offset the utterances
ds = ds . map ( mms_msg . sampling . pattern . classical . ConstantOffsetSampler ( 0 ))
# If required: Add log_weights to simulate volume differences
ds = ds . map ( mms_msg . sampling . environment . scaling . UniformScalingSampler ( max_weight = 5 ))
Процесс отбора проб всегда начинается с создания «исходной композиции», то есть выборочных (базовых) высказываний для каждой смеси. Это делается в get_composition_dataset
, который реализует алгоритм выборки, аналогичный SMS-WSJ, который одинаково часто использует каждое высказывание из исходной базы данных.
После этого модули отбора проб могут быть применены для имитации различных шаблонов или сред. Приведенный выше пример устанавливает все смещения на ноль (то есть все высказывания начинаются в начале смеси) с ConstantOffsetSampler
и образцами случайной шкалы с максимумом 5DB с UniformScalingSampler
.
Доступны многие другие модули отбора проб, в том числе тот, который имитирует шаблоны разговоров в стиле встречи. Примеры для этого можно найти в этой записной книжке.
Смеси в mms_msg
создаются путем применения отдельных модулей отбора проб к примеру один за другим. Каждый модуль отбора проб является полностью детерминированным, т.е. его вывод зависит только от его гиперпараметров и входного примера, но не разрешается поддерживать изменчивое состояние. Это должно обеспечить воспроизводимость: выборка не зависит от порядка, в котором генерируются смеси, количество или порядок, в котором применяются модули.
Модуль выборки - это вызов, который получает (промежуточную) смесь в качестве словаря, изменяет ее и возвращает. Базовый модуль выборки, реализованный как функция без гиперпараметра, может выглядеть так:
import mms_msg
def my_sampling_module ( example : dict ) -> dict :
# Get a deterministic random number generator based on the input example
# and an additional seed string. The seed string ensures that the RNGs
# differ between different sampling modules
rng = mms_msg . sampling . utils . rng . get_rng_example ( example , 'my_sampler' )
# Sample whatever based on RNG and possibly the contents of example
example [ 'my_random_number' ] = rng . random ()
return example
Важной частью является функция mms_msg.sampling.utils.rng.get_rng_example
. Он возвращает объект np.random.Generator
, который инициализируется семенностью, рассчитанным из основной информации из примера словаря (пример-ID и набор данных) и дополнительной строки семян. Это означает, что случайные числа, сгенерированные в модуле, равны каждый раз, когда модуль применяется к одному и тому же входному примеру.
Если ваш модуль отбора проб есть гиперпараметра, мы рекомендуем заморозить обработку данных для обеспечения неизменности:
import mms_msg
from dataclasses import dataclass
@ dataclass ( frozen = True )
class MySamplingModule :
size : int = 42
def __call__ ( self , example ):
rng = mms_msg . sampling . utils . rng . get_rng_example ( example , 'my_sampler' )
# Sample whatever based on RNG and possibly the contents of example
example [ 'my_random_number' ] = rng . random ( self . size )
return example
Более практичный пример приведен в этой записной книжке.
MMS-MSG был предложен в следующей публикации:
@inproceedings { cordlandwehr2022mms_msg ,
title = { MMS-MSG: A Multi-purpose Multi-Speaker Mixture Signal Generator } ,
author = { Tobias Cord-Landwehr and Thilo von Neumann and Christoph Boeddeker and Reinhold Haeb-Umbach } ,
year = { 2022 } ,
booktitle = { International Workshop on Acoustic Signal Enhancement (IWAENC) } ,
publisher = { {IEEE} } ,
} ```