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
وعينات مقياس عشوائي بحد أقصى 5 ديسيبل مع 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
الذي يتم تهيئته ببذور محسوبة من المعلومات الأساسية من قاموس المثال (مثال على المعرفة ومجموعة البيانات) وسلسلة بذور إضافية. هذا يعني أن الأرقام العشوائية التي تم إنشاؤها في وحدة متساوية في كل مرة يتم فيها تطبيق الوحدة على مثال الإدخال نفسه.
إذا كانت وحدة أخذ العينات الخاصة بك تحتوي على مقاييس فرطمية ، فإننا نوصي بنقص بيانات مجمد لضمان عدم قابلية الثبات:
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} } ,
} ```