MMS-MSG是用於產生語音混合物的高度模塊化和靈活的框架。它擴展了SMS-WSJ數據庫的代碼庫以生成混合信號,以便能夠生成與經典語音混合數據庫相對應的會議式語音混合物和混合信號。
會議數據描述了一個高度動態的設置。兩種具有MMS-MSG的環境,我們都不旨在提供一個新的數據庫。
取而代之的是,我們希望提供一個適應性的框架,該框架允許在盡可能多的環境中進行訪問和轉錄系統的原型和評估。
MMS-MSG的核心方面是會議式數據的生成。會議是以模塊化的方式生成的。可調參數為:
採樣過程是模塊化的,因此可以通過稍微更改採樣管道來創建許多方案。我們提供示例類,以說明如何使用單個模塊。如果不支持方案,則可以輕鬆實現新的採樣模塊以適應您的要求。
MMS-MSG的數據模擬過程分為參數採樣和實際數據生成。通過此,我們支持按需數據生成。這樣,只需要保存源數據和會議參數,從而允許模擬各種會議場景,同時最大程度地減少所需的磁盤空間。但是,如果您的工作流程需要將它們保存到硬盤上,我們還支持會議數據的離線生成。
我們根據當前使用的源分離數據庫的規格提供代碼來生成語音混合物,其中多個揚聲器的單個話語彼此部分或完全重疊。通過使用MMS-MSG生成這些數據庫的培訓數據,我們提供了動態混合的本地支持。
支持的語音混合數據庫:
計劃:
混合物發生器使用Lazy_Dataset。雖然可以在沒有Lazy_DataSet的情況下使用MMS_MSG的核心功能,但某些功能(例如動態混合和數據庫抽象)當時不可用。
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
。
可以將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} } ,
} ```