From efeccccb669e3d4fc5aef9d93d7a73b46ea51ec6 Mon Sep 17 00:00:00 2001 From: kobakos Date: Wed, 22 May 2024 17:57:11 +0900 Subject: [PATCH 1/5] Add beatnet --- README.md | 4 +- audio_processing/beatnet/README.md | 89 ++++ audio_processing/beatnet/beatnet.py | 276 +++++++++++ audio_processing/beatnet/beatnet_common.py | 238 ++++++++++ audio_processing/beatnet/input.mp3 | Bin 0 -> 160749 bytes .../beatnet/particle_filtering_cascade.py | 441 ++++++++++++++++++ 6 files changed, 1047 insertions(+), 1 deletion(-) create mode 100644 audio_processing/beatnet/README.md create mode 100644 audio_processing/beatnet/beatnet.py create mode 100644 audio_processing/beatnet/beatnet_common.py create mode 100644 audio_processing/beatnet/input.mp3 create mode 100644 audio_processing/beatnet/particle_filtering_cascade.py diff --git a/README.md b/README.md index 2d6e2da6c..43d4ba205 100644 --- a/README.md +++ b/README.md @@ -15,9 +15,10 @@ The collection of pre-trained, state-of-the-art AI models. [ailia MODELS tutorial 日本語版](TUTORIAL_jp.md) # Supported models -326 models as of April 30th, 2024 +327 models as of May 22th, 2024 # Latest update +- 2024.05.22 Add beatnet - 2024.04.30 Add cross_encoder_mmarco - 2024.04.28 Add marigold - 2024.04.08 ailia SDK can now be installed via pip. @@ -77,6 +78,7 @@ The collection of pre-trained, state-of-the-art AI models. | [audioset_tagging_cnn](/audio_processing/audioset_tagging_cnn/) | [PANNs: Large-Scale Pretrained Audio Neural Networks for Audio Pattern Recognition](https://github.com/qiuqiangkong/audioset_tagging_cnn) | Pytorch | 1.2.9 and later | | | [deep music enhancer](/audio_processing/deep-music-enhancer/) | [On Filter Generalization for Music Bandwidth Extension Using Deep Neural Networks](https://github.com/serkansulun/deep-music-enhancer) | Pytorch | 1.2.6 and later | | | [pyannote-audio](/audio_processing/pyannote-audio/) | [Pyannote-audio](https://github.com/pyannote/pyannote-audio) | Pytorch | 1.2.15 and later | [JP](https://medium.com/axinc/pyannoteaudio-%E8%A9%B1%E8%80%85%E5%88%86%E9%9B%A2%E3%82%92%E8%A1%8C%E3%81%86%E3%81%9F%E3%82%81%E3%81%AE%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%A2%E3%83%87%E3%83%AB-fca61f4ef5d0) | +| [beatnet](/audio_processing/beatnet/) | [BeatNet: CRNN and Particle Filtering for Online Joint Beat Downbeat and Meter Tracking](https://github.com/mjhydri/BeatNet) | Pytorch | 1.2.16 and later | | ## Background removal diff --git a/audio_processing/beatnet/README.md b/audio_processing/beatnet/README.md new file mode 100644 index 000000000..fecb254df --- /dev/null +++ b/audio_processing/beatnet/README.md @@ -0,0 +1,89 @@ +# BeatNet: CRNN and Particle Filtering for Online Joint Beat Downbeat and Meter Tracking +## Input + +* **Audio path** + +Path to the audio file you want to detect the beats of. +The example in this directory is a drum sound repeated at 120 beats per minute (bpm). + +## Output + +* **Predicted beats** + +The output will be an array with shape (num_beats, 2). +The first column represents the time in seconds in which the beat appeared, and the second column represents the beat number. +The downbeat (the first beat of the bar) is represented by the number 1, and the other beats are numbered sequentially + + + +## Usage +An Internet connection is required when running the script for the first time, as the model files will be downloaded automatically. + +The model will predict the beats in the input audio using CRNN (the model in .onnx format) and other inference models (PF and DBN). +There are 3 modes that you can choose from. The default is offline mode with DBN as the inference model. + +#### Offline mode +```bash +$ python3 beatnet.py --mode offline --inference-model DBN -i input.mp3 +``` +**output** +```bash +[[0.48 1. ] + [1. 2. ] + [1.5 3. ] + ... + [9.5 3. ] + [9.98 4. ]] +``` +Offline mode can only be used with DBN (Dense Bayesian Networks). +While using this mode, the entire audio file is available for the model to use at the time of inference. + +#### Online mode +```bash +$ python3 beatnet.py --mode online --inference-model PF -i input.mp3 +``` +Online mode accepts both DBN and PF (Particle Filter) as its inference models. +While using this mode, only the preceeding sections of the audio file is available at the time of inference. + +#### Realtime mode +```bash +$ python3 beatnet.py --mode realtime --inference-model DBN -i input.mp3 +``` +**output** +```bash +*beat! +beat! +... +*beat! +beat! +[[0.48 1. ] + [0.98 2. ] + [1.48 1. ] + ... + [9.48 1. ] + [9.98 2. ]] +``` +Realtime mode is similar to online mode, but it processes and shows the result in real time. + +#### Switching the model weights +```bash +$ python3 beatnet.py --weight 2 +``` +You can switch the weights of the CRNN model using the --weight argument. Use 1 for weights trained with GTZAN, 2 for weights trained with Ballroom, and 3 for weights trained with Rock_corpus. The default is 1. + +## Reference + +* [BeatNet](https://github.com/mjhydri/BeatNet) + +## Framework + +PyTorch + + +## Model Format + +ONNX opset=11 + +## Netron + +- [beatnet.onnx.prototxt](https://netron.app/?url=https://storage.googleapis.com/ailia-models/beatnet/beatnet.onnx.prototxt) \ No newline at end of file diff --git a/audio_processing/beatnet/beatnet.py b/audio_processing/beatnet/beatnet.py new file mode 100644 index 000000000..adf386a8f --- /dev/null +++ b/audio_processing/beatnet/beatnet.py @@ -0,0 +1,276 @@ +import scipy +import pyaudio +import numpy as np +from madmom.features import DBNDownBeatTrackingProcessor +from particle_filtering_cascade import particle_filter_cascade + + + +import sys +import time + +import ailia + +import numpy as np + +# import original modules +sys.path.append('../../util') + +# logger +from logging import getLogger # noqa: E402 + +from model_utils import check_and_download_models # noqa: E402 +from arg_utils import get_base_parser, get_savepath, update_parser # noqa: E402 + +import matplotlib.pyplot as plt + +logger = getLogger(__name__) + + +# ====================== +# Parameters +# ====================== + +MODEL_NAME = "beatnet" + +MODEL_PATH = MODEL_NAME + '.onnx.prototxt' + +WEIGHT_PATH_1 = MODEL_NAME + "_1.onnx" +WEIGHT_PATH_2 = MODEL_NAME + "_2.onnx" +WEIGHT_PATH_3 = MODEL_NAME + "_3.onnx" + +REMOTE_PATH = "https://storage.googleapis.com/ailia-models/" + MODEL_NAME + "/" + +DEFAULT_INPUT_PATH = 'input.mp3' + +# ====================== +# Arguemnt Parser Config +# ====================== +parser = get_base_parser( + 'Ego2Hands: Egocentric Two-hand Segmentation and Detection', + DEFAULT_INPUT_PATH, None +) + +parser.add_argument('--mode', type=str, default='offline', help='Working mode: realtime, online, or offline') + +parser.add_argument('--inference-model', type=str, default='DBN', help='Inference model to use: PF (Particle Filtering) or DBN (Dynamic Bayesian Network).') + +parser.add_argument('--weights', type=str, default='1', help='Model weights to use (1, 2, or 3). 1 is trained with GTZAN, 2 is trained with Ballroom, 3 is trained with Rock_corpus. Default is 1') + +args = update_parser(parser) + +# ====================== +# Helper functions +# ====================== + +# From https://github.com/mjhydri/BeatNet/blob/main/src/BeatNet/log_spect.py +# imports were modified to not require BeatNet(pip module) + +# Author: Mojtaba Heydari + +from beatnet_common import * + +from madmom.audio.signal import SignalProcessor, FramedSignalProcessor +from madmom.audio.stft import ShortTimeFourierTransformProcessor +from madmom.audio.spectrogram import ( + FilteredSpectrogramProcessor, LogarithmicSpectrogramProcessor, + SpectrogramDifferenceProcessor) +from madmom.processors import ParallelProcessor, SequentialProcessor + + +# feature extractor that extracts magnitude spectrogoram and its differences + +class LOG_SPECT(FeatureModule): + def __init__(self, num_channels=1, sample_rate=22050, win_length=2048, hop_size=512, n_bands=[12], mode='online'): + sig = SignalProcessor(num_channels=num_channels, win_length=win_length, sample_rate=sample_rate) + self.sample_rate = sample_rate + self.hop_length = hop_size + self.num_channels = num_channels + multi = ParallelProcessor([]) + frame_sizes = [win_length] + num_bands = n_bands + for frame_size, num_bands in zip(frame_sizes, num_bands): + if mode == 'online' or mode == 'offline': + frames = FramedSignalProcessor(frame_size=frame_size, hop_size=hop_size) + else: # for real-time and streaming modes + frames = FramedSignalProcessor(frame_size=frame_size, hop_size=hop_size, num_frames=4) + stft = ShortTimeFourierTransformProcessor() # caching FFT window + filt = FilteredSpectrogramProcessor( + num_bands=num_bands, fmin=30, fmax=17000, norm_filters=True) + spec = LogarithmicSpectrogramProcessor(mul=1, add=1) + diff = SpectrogramDifferenceProcessor( + diff_ratio=0.5, positive_diffs=True, stack_diffs=np.hstack) + # process each frame size with spec and diff sequentially + multi.append(SequentialProcessor((frames, stft, filt, spec, diff))) + # stack the features and processes everything sequentially + self.pipe = SequentialProcessor((sig, multi, np.hstack)) + + def process_audio(self, audio): + feats = self.pipe(audio) + return feats.T + +# particle filter cascade +# From + +# ====================== +# Main functions +# ====================== +''' +From https://github.com/mjhydri/BeatNet/blob/main/src/BeatNet/log_spect.py +__init__, activation_extractor_stream, activation_extractor_realtime, activation_extractor_online was modified to run ailia models instead of PyTorch models +Removed the following features: +- threading +- device + +''' +class BeatNet: + + ''' + The main BeatNet handler class including different trained models, different modes for extracting the activation and causal and non-causal inferences + + Parameters + ---------- + Inputs: + model: An scalar in the range [1,3] to select which pre-trained CRNN models to utilize. + mode: An string to determine the working mode. i.e. 'stream', 'realtime', 'online' and ''offline. + 'stream' mode: Uses the system microphone to capture sound and does the process in real-time. Due to training the model on standard mastered songs, it is highly recommended to make sure the microphone sound is as loud as possible. Less reverbrations leads to the better results. + 'Realtime' mode: Reads an audio file chunk by chunk, and processes each chunck at the time. + 'Online' mode: Reads the whole audio and feeds it into the BeatNet CRNN at the same time and then infers the parameters on interest using particle filtering. + 'offline' mode: Reads the whole audio and feeds it into the BeatNet CRNN at the same time and then inferes the parameters on interest using madmom dynamic Bayesian network. This method is quicker that madmom beat/downbeat tracking. + inference model: A string to choose the inference approach. i.e. 'PF' standing for Particle Filtering for causal inferences and 'DBN' standing for Dynamic Bayesian Network for non-causal usages. + plot: A list of strings to plot. + 'activations': Plots the neural network activations for beats and downbeats of each time frame. + 'beat_particles': Plots beat/tempo tracking state space and current particle states at each time frame. + 'downbeat_particles': Plots the downbeat/meter tracking state space and current particle states at each time frame. + Note that to speedup plotting the figures, rather than new plots per frame, the previous plots get updated. However, to secure realtime results, it is recommended to not plot or have as less number of plots as possible at the time. + threading: To decide whether accomplish the inference at the main thread or another thread. + device: type of dvice. cpu or cuda:i + + Outputs: + A vector including beat times and downbeat identifier columns, respectively with the following shape: numpy_array(num_beats, 2). + ''' + + + def __init__(self, model, mode='online', inference_model='PF', plot=['beat_particles']): + self.model = model + self.mode = mode + self.inference_model = inference_model + self.sample_rate = 22050 + self.log_spec_sample_rate = self.sample_rate + self.log_spec_hop_length = int(20 * 0.001 * self.log_spec_sample_rate) + self.log_spec_win_length = int(64 * 0.001 * self.log_spec_sample_rate) + self.proc = LOG_SPECT(sample_rate=self.log_spec_sample_rate, win_length=self.log_spec_win_length, + hop_size=self.log_spec_hop_length, n_bands=[24], mode = self.mode) + if self.inference_model == "PF": # instantiating a Particle Filter decoder - Is Chosen for online inference + self.estimator = particle_filter_cascade(beats_per_bar=[], fps=50, plot=plot, mode=self.mode) + elif self.inference_model == "DBN": # instantiating an HMM decoder - Is chosen for offline inference + self.estimator = DBNDownBeatTrackingProcessor(beats_per_bar=[2, 3, 4], fps=50) + else: + raise RuntimeError('inference_model can be either "PF" or "DBN"') + + self.model = model + + def process(self, audio_path=None): + if self.mode == "realtime": + self.counter = 0 + self.completed = 0 + if self.inference_model != "PF": + raise RuntimeError('The infernece model for the streaming mode should be set to "PF".') + if isinstance(audio_path, str) or audio_path.all()!=None: + while self.completed == 0: + self.activation_extractor_realtime(audio_path) # Using BeatNet causal Neural network realtime mode to extract activations + output = self.estimator.process(self.pred) # Using particle filtering online inference to infer beat/downbeats + self.counter += 1 + return output + else: + raise RuntimeError('An audio object or file directory is required for the realtime usage!') + + + elif self.mode == "online": + if isinstance(audio_path, str) or audio_path.all()!=None: + preds = self.activation_extractor_online(audio_path) # Using BeatNet causal Neural network to extract activations + else: + raise RuntimeError('An audio object or file directory is required for the online usage!') + if self.inference_model == "PF": # Particle filtering inference (causal) + output = self.estimator.process(preds) # Using particle filtering online inference to infer beat/downbeats + return output + elif self.inference_model == "DBN": # Dynamic bayesian Network Inference (non-causal) + output = self.estimator(preds) # Using DBN offline inference to infer beat/downbeats + return output + + + elif self.mode == "offline": + if self.inference_model != "DBN": + raise RuntimeError('The infernece model should be set to "DBN" for the offline mode!') + if isinstance(audio_path, str) or audio_path.all()!=None: + preds = self.activation_extractor_online(audio_path) # Using BeatNet causal Neural network to extract activations + output = self.estimator(preds) # Using DBN offline inference to infer beat/downbeats + return output + + else: + raise RuntimeError('An audio object or file directory is required for the offline usage!') + + + def activation_extractor_realtime(self, audio_path): + if self.counter==0: #loading the audio + self.audio, _ = librosa.load(audio_path, sr=self.sample_rate) # reading the data + if self.counter<(round(len(self.audio)/self.log_spec_hop_length)): + if self.counter<2: + self.pred = np.zeros([1,2]) + else: + feats = self.proc.process_audio(self.audio[self.log_spec_hop_length * (self.counter-2):self.log_spec_hop_length * (self.counter) + self.log_spec_win_length]).T[-1] + feats = feats[None,None] + pred = self.model.predict(feats)[0] + pred = scipy.special.softmax(pred, axis=0) + self.pred = np.transpose(pred[:2, :]) + else: + self.completed = 1 + + + def activation_extractor_online(self, audio_path): + audio, _ = librosa.load(audio_path, sr=22050) # reading the data + feats = self.proc.process_audio(audio).T + feats = feats[None] + preds = self.model.predict(feats) # extracting the activations by passing the feature through the NN + preds = preds[0] + + preds = scipy.special.softmax(preds, axis=0) + preds = np.transpose(preds[:2, :]) + return preds + +def predict(model): + logger.info('Start inference...') + beatnet = BeatNet(model, mode=args.mode, inference_model=args.inference_model, plot=['']) + + audio_path = args.input[0] + + if args.benchmark and not (args.video is not None): + logger.info('BENCHMARK mode') + for i in range(5): + start = int(round(time.time() * 1000)) + out = beatnet.process(audio_path) + end = int(round(time.time() * 1000)) + logger.info(f'\tailia processing time {end - start} ms') + else: + out = beatnet.process(audio_path) + + logger.info('Predicted beats:') + logger.info(out) + + logger.info('Script finished successfully.') + +def main(): + # model files check and download + check_and_download_models(WEIGHT_PATH_1, MODEL_PATH, REMOTE_PATH) + check_and_download_models(WEIGHT_PATH_2, MODEL_PATH, REMOTE_PATH) + check_and_download_models(WEIGHT_PATH_3, MODEL_PATH, REMOTE_PATH) + + # net initialize + WEIGHT_PATH = [WEIGHT_PATH_1, WEIGHT_PATH_2, WEIGHT_PATH_3][int(args.weights) - 1] + model = ailia.Net(MODEL_PATH, WEIGHT_PATH, env_id = args.env_id) + + predict(model) + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/audio_processing/beatnet/beatnet_common.py b/audio_processing/beatnet/beatnet_common.py new file mode 100644 index 000000000..f0c19b561 --- /dev/null +++ b/audio_processing/beatnet/beatnet_common.py @@ -0,0 +1,238 @@ +# URL:https://github.com/mjhydri/BeatNet/blob/main/src/BeatNet/common.py +# No modification is made to the code. + +# My imports +# None of my imports used + +# Regular imports +from abc import abstractmethod + +import numpy as np +import librosa + + +class FeatureModule(object): + """ + Implements a generic music feature extraction module wrapper. + """ + + def __init__(self, sample_rate, hop_length, num_channels=1, decibels=True): + """ + Initialize parameters common to all feature extraction modules. + + Parameters + ---------- + sample_rate : int or float + Presumed sampling rate for all audio + hop_length : int or float + Number of samples between feature frames + num_channels : int + Number of independent feature channels + decibels : bool + Convert features to decibel (dB) units + """ + self.sample_rate = sample_rate + self.hop_length = hop_length + self.num_channels = num_channels + self.decibels = decibels + + + def get_expected_frames(self, audio): + """ + Determine the number of frames the module will return + for a piece of audio. + + This is the default behavior. It can be overridden. + + Parameters + ---------- + audio : ndarray + Mono-channel audio + + Returns + ---------- + num_frames : int + Number of frames expected + """ + + # Simply the number of hops plus one + num_frames = 1 + len(audio) // self.hop_length + + return num_frames + + def get_sample_range(self, num_frames): + """ + Determine the range of audio samples which will produce features + with a given number of frames. + + This is the default behavior. It can be overridden. + + Parameters + ---------- + num_frames : int + Number of frames for sample-range query + + Returns + ---------- + sample_range : ndarray + Valid audio signal lengths to obtain queried number of frames + """ + + # Calculate the boundaries + max_samples = num_frames * self.hop_length - 1 + min_samples = max(1, max_samples - self.hop_length + 1) + + # Construct an array ranging between the minimum and maximum number of samples + sample_range = np.arange(min_samples, max_samples + 1) + + return sample_range + + @abstractmethod + def process_audio(self, audio): + """ + Get features for a piece of audio. + + Parameters + ---------- + audio : ndarray + Mono-channel audio + """ + + return NotImplementedError + + def to_decibels(self, feats): + """ + Convert features to decibels (dB) units. + + This is the default behavior. It can be overridden. + + Parameters + ---------- + feats : ndarray + Calculated amplitude features + + Returns + ---------- + feats : ndarray + Calculated features in decibels + """ + + # Simply use the appropriate librosa function + feats = librosa.core.amplitude_to_db(feats, ref=np.max) + + return feats + + def post_proc(self, feats): + """ + Perform post-processing steps. + + Parameters + ---------- + feats : ndarray + Calculated features + + Returns + ---------- + feats : ndarray + Post-processed features + """ + + if self.decibels: + # Convert to decibels (dB) + feats = self.to_decibels(feats) + + # TODO - make additional variable for 0/1 scaling + # Assuming range of -80 to 0 dB, scale between 0 and 1 + feats = feats / 80 + feats = feats + 1 + else: + # TODO - should anything be done here? - would I ever not want decibels? + pass + + # Add a channel dimension + feats = np.expand_dims(feats, axis=0) + + return feats + + def get_times(self, audio): + """ + Determine the time, in seconds, associated with frame. + + This is the default behavior. It can be overridden. + + Parameters + ---------- + audio: ndarray + Mono-channel audio + + Returns + ---------- + times : ndarray + Time in seconds of each frame + """ + + # Determine the number of frames we will get + num_frames = self.get_expected_frames(audio) + + frame_idcs = np.arange(num_frames + 1) + # Obtain the time of the first sample of each frame + times = librosa.frames_to_time(frames=frame_idcs, + sr=self.sample_rate, + hop_length=self.hop_length) + + return times + + def get_sample_rate(self): + """ + Helper function to access sampling rate. + + Returns + ---------- + sample_rate : int or float + Presumed sampling rate for all audio + """ + + sample_rate = self.sample_rate + + return sample_rate + + def get_hop_length(self): + """ + Helper function to access hop length. + + Returns + ---------- + hop_length : int or float + Number of samples between feature frames + """ + + hop_length = self.hop_length + + return hop_length + + def get_num_channels(self): + """ + Helper function to access number of feature channels. + + Returns + ---------- + num_channels : int + Number of independent feature channels + """ + + num_channels = self.num_channels + + return num_channels + + @classmethod + def features_name(cls): + """ + Retrieve an appropriate tag, the class name, for the module. + + Returns + ---------- + tag : str + Name of the child class calling the function + """ + + return cls.__name__ \ No newline at end of file diff --git a/audio_processing/beatnet/input.mp3 b/audio_processing/beatnet/input.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..bea807567cba97f9e196a96ae40ec7b282415e37 GIT binary patch literal 160749 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

%6XfYVfe{ns7Xw30`(K0>E$zc`Rb% zNu>^)#V75vb)k)q++fDW;h`&7y|>BswZ+Sqgt7#gF64zInN&JPr7{pYAQ#@x!Av3LGj>ryshrAm_-Ao}(mBdldwP z3Xs{lpswinC#?Sy)iR;+CiM|fll$^d>cbxlk!>48kptc;1-$RC!DUpo#Ngd5S0O*d z>-PtGhdbnk_4$E~(vU8R-lv7bPk%pHx@0)y5}#VCXV@4%KYu*C+XbjKm^@rBohrJ` z9--nn`=JN}^5j0wX(niGb3D<^!l{x*!G~3mF;wTmW~gth^UCIMsb+#5J=R)eyTi!y zE-zIrGF_Rja@s%f-Ogk#K6N(W*eElvr`K#L^%8x3FU&+a*b5oz((wpU#z`+BaRi4lWL)fdCK`%I_ssS~5$< z=@ALlYH`{WOQ{VgndA4itB1*g=)yS*JGB~=X%ui4);&I3ekG*mi3jcb@o)6_K1Ja9dTh3DeElk(qBF!;!Eh0C znY7jbRAI#O5WyF6X*>VR+Z<=R-b zKxc1w)zr?3#4M_&zC;=Nd)?^VrRY2^cl~NSblGzO3qJ$)eWwUE!o;~wUKj_}52=+Y zdQ3X!4&wr|`G_1J$>2)43JF}iFgl|>;b0JDky^Z<%i+~^=Oc!jCH+nk{nfaWimjUz z)XMfZa})7DR@1-adSfPIBL%zM3&&*SG``+x)&=?<>2|l3X|x{%ZaAs}`f@j%P~Gy; zne3!D>s5uh zBd)=zEDyAqCoM-vz2eUA{#3p_rpsBKnU_^+ssvE0)>se=MX3jhLQ~L?n{Bdrgc5Nv zHx-fSK&M?^*_%lnJUn*47ijL#`YpYoI>WEVlNzOQ%&?2$uH8`ASnujXdv({aTNC%9 ztbW`-yYsfoL2iHDt^QRC2pi!+e8zzHf5Go&Aq3tY;9sF}-;2e?dco}hWkLG8)-%MH zYY}rYn13&8;a+mD-K}m>KPn1szRh z$=5z`dD$uPvgB2u6ZEo`HszSjAm9lmX5NUxVI<3ErA471pxut6&-*z2Jm z@}p(orst;8bsw-#2W~g+>y_u(uXiqjo~wUr0-qhK6OcybEXe+r?mkdI{p659_da_r z;_Gax{sA`Bi0kT~t!053^N_X5Ug{i^}3Vf9^*eHupZ8vBvoG;*G^^dI(Y6NTS`IQIAIbU1;?E63v=)S_s-gIL!Jrc_R5cinv`oF#`V%NZ>9O55CBp4 zQaYowjKSoG#IlwxL}oULA1m98P47=^Q5`jYZD6Ymz@%<1kxfxZG0me_flfU?j?ynD z@2@Cb^=1rwQvxcTqKlC+U`U6@EHqAYv%^81SWJ`GnQc;kT0AetJ4xqNy-GUe$CGQJ z)j2c~VjyfGK@G&YFh*KTsvD<&FA!HwEybbFyRTazE$?@W44PnC>^Z4i$7$=|u9P7* z_U3BK=x|9e$yi5<4Erd1*(rbcuDO3zdaT7deTR*_#q+8*y~Y2ek?o^b(4|Tg&kbS| zPFxq$S%OsSB5=rrP5HJidF@ub@rym5nyZPCeybZDUvxhaf;suG) z89S{dBUVSU7qyAqP)j0l$w8_Oq5vn6khmxW>=$q~F$!ll*HH?9&bZHXHmykCksgW=AGDh*d3 zjW%ZgT?^kp5H1)s$r`$9S~jAdILNMLjBZTN?pKTh323MiO!%H9ZE9sp%G~%Y5~Z^= zwL^gX=jNJ#22LsGkB3Hli)Xr;;6rsAPXAaeGxe)NHypn&-B{YOb9x)y7Kof- zrqwm3rf_L4=NREVuV2>c>bl}r)EGrdCIOsKUxx{#vky@wBCb$7gR6n-!39w0!6?wm zK~hlr%*aqdFrRf2*paf8&wWa-%;~mRG3PV|os+)`C`qz;$fr%M`7z>3U(TOf*^7<6 zA+(DMOJD}^Br}Wf0w5$fB+I!@93oRN1}*|fN6?~~y8<_A4E2$&RF67_3oP?y0*L?k zE6T;*iROK+&!qk_ZMu5HzG|Q0wzX!9DXdjS$*6G^@RBE(4v@|2Z~`ySx8K=i38J{pdx5Et;&jw zs5~YpjUE(mw`tT044z{h-21SF2c!DikM6jkjiks{r0vv)I7~ID=?hUYsGKusypSHN zd?JrHFTp=TQE)yGVk*nvm08rCYOV}@1z(qcC4hxS>KFHbHAGf#iSV>I>fwpJLAlWy zFJ>)7{wBLw6R^rMl+#w-pTGlt?Ti4w#MVnH*NWEm9@*aK{FU`vJp%s$3qdGd$m3-s znlF7DLM?xc9i#X;qM~f6N0V85X#O03{63R4d7m>5Tkr@c-UT_Svz<1bTO*?40qPB* zV*qTg`7op305rz{Fs}#zAY$>??(7M|Cj^*?0+<0iD3EFcB&wpDuupCzEp=ZAF)Fqc zw1K?FC0AzbgD;Zg@A0_ z7r3n?Hf1yCddm@2MVYi~eE5>Z5D^f}=Q6$g@uuFnRE08HLJ=|XJX%Df2q??FPc02IGtxcW(vpg<>gE5%##b0c|)ig zh~-N=hU>ovU?72z-~hloHCxP27o(t_Ac)il0C361sknVFGccMC?Rg8ZQgs@$v5Rgt zkpSESp^0X9P?7A$Q&DQ=NRo_zy{CIIN<_$jp|6B#$<>vPg1e73f9s3X0m&kBKG-P( z6d=Trdgsu+DfH@W{DwR5Ya#furn1B#Od?6l7>+`jvpM`kTujZyI}R^wVwj_Zap6 z|GPa1W~>dr#i_`(B~mWb7_~+7n<+JX3%*Dwen_K|AU3o}5nIee_q!??pz>dcC0(t; z(!dt`$9x9vm)3#~dYv=V-< zr*tW+Tb8@)MI>`af5&A-{mc}V0c(adM+yLP!dqt8zeft!8$vYUps`nKLhEUIP@;>y z^ktYkTbzR~zc3+7J&h$*Oz({g_~62Vv2Z!#oq=zk7VB6GP^bU17B)6LbB%xdTyC|D z#y_$LAi~A50>Wni!a!1-T~GX1wYKiUQCL&~(>9|s*$FJ@8&+XrW@sn?K`d@~-w715 z1D}@ulQyCLtNHA}#b;~Pz{UAYx&%`p2}_1(+a+zc=AxF}@-+9mmDY8!0%V>Q1EyhA zU#pT<#^WcswSe_?9LCM@SY};r_s_!QB@_Rr+4g@01%Q}6flm_3!Fzvz8zuq6Ql!c> z6N(?j_HLvU9=Z`oQ_kRT)3LB~ivHoWS#ie4!OXT!!yddHU9xCFtHtqSuLJR-=3(p5 z@a*~Z?B>x?5)58|)E+<(+JI6;A{2vUXetQ?0lgrZG03p?xR9Ab&_%|65L)yfXsA|o zq_W8tXiog5!vR>y3?SkzJ2_@_*{C`R>tRm?gId@0mtgJccmZl$|1>r4aUDwuKBwYl zRMigjL$solr=?L25~!o|q|RzNPU{E-l=-kE!CEte!I;+p!f=u1$PhSYLmf zy&5c%mlxJW9Csv?tJFO-lWKcUbMBm*EbLOV@6)oIOfl_R!Kf`K~-6b#d8+t@!7 z1|(^O?a+WoT`a*kq^!D*luXb??Cbk!4PHxyOa76$V@=Ww%1gEqPq+U{@J^#rGASh% zAqa_s{@o9uQaD3QlBU8U9HfvtR%3TLh~NhWU>xt@HFaPR-nWs ze@I$8_dpTnytJAL=9+%%ldYPStEv>+wi;($rUN7ya89R~i+Q9#85=v*D$N}H-!2b8 z^l@Y^SNK=`yl^kIr9!sKn{1~A*ZrTk=~@Bij?*(P$>}S^6@Lxs%Rceb} zWZg29cLc_b`1~bOyc8e%zeflFlDPt*GJ~n6RfW+N82wRUrKYV(@EFL1HBL!ecKO<-(Pmh4mNU)$(k(gcXxOP|+v zMoOS8!aC{nDwUBe)078e#opG?&nQ(!lDCwHZaVdFD6ufL(s!xe7d2Jp^ZQdV)VtHI2bg;jwUHC1oT6b}Fnm$>E`4 zY0;%L@K8u_6TKu*$MMNfg`5n@Q8e#qLjw?%2k@zy`0%R|Oq2G0ro+d^G*!BOD=VD6 zE1cn7BE@?Ss~j*LVRnilNc_X!SR%=6jfKj`qN>asG4ue>dgAR?2LpYiq{iFjLJO0S z)-xwQ(w;7p%YQEK%{(`cR>PyzslZ+%M9O<-Xlb8!AdkPB^+O7p-%fcG*(LXg+Mw8fAoL%kH&_W~ z;2W_ie-S#{mkAh^a5fe(@(<9e=pdtgF>Xu=_dAq`8plg}0xV1#qm!l}5jLPR$|$hb zi3Q<97&1yEmQz$hw(Kg*M>x!PL?$ak7q*J8GH%ak!%`-wS&+_7%dZ&9 zS{sYh#-lq{N!^}F(TFQ&G8Huysu>IO6m0(d@dB={D@%1rDRbOTZB_Q)naa|c@=jJa zpuy>A8S}mP5YlCaFN*G4_R72fxWEj~d5T4{DA>_9#F2;kcuI=VNEBFxHekVLf`bNb zFqP$xkyEQ)VLYnd3ACtqC`aC8*LY?gS%P9#_Glc?JON%Nf-QFbaixD6So0Yyj`&4` z1t}R`Ld?jmJlE)RTToP9TkzF529g=2BZ zF}NdF9I{GdYioWw2cMm5o}B6k8YSK?)NAq(^jOH}vc0XL`yf?0QgKWOLON4f5Q7(! zOp@&fh+Gazri>H|JyyC(Dx9=)ruG)4;IPt6sCNc7ULL(7;ad^X~~I5tzDR8j8os2bnNt)D{=Q;F4thwBnR|PH{U|8o0M~!(aAp!yGT?~B5M!- z8~@2f_(*WNIzkr119;N#+V6*>ay#=~wA^VA*T!U&jA_KEirYGd2{}8Jb;(Goxk-X6 z{+hIumo&0V42WftkVC&;hGSd5_I(ti?-Dc=4u#!IL56zq{!NOxtchLx1C{2&XO?SJ z&W;bvHb{J?7JQq$C7pp>N;bbdv+Bby8*w=tf4b^_zZM#ux-wm0KN6@fb)7Gq?i}=O zWoy*`?Gb892f(P;)D=s0{OLJNYKJAdMgs`swejE^xx0- zs`SC3b&_i1wPjMG%2vstFnrT5c$iUZG(RbP&oL~F3lRw@Nx&dN*qxt$)IjuyS1p<;M z$R!11LCzs4&CGoYHe}(POt3YrO5@<#(c_gwwvgkML;sW7`0b9arBAe0-_V&}Gk?zp zPVHa$slH9~HuQdc93vQ85(MKJBzOyEy)le6>|=x^_^-EKC`NQyv>>1lb>oEI{;sA- zK5OYmDm`&>luUkD0`Ti{}KXN>O z9A&7w^yeP+`~c&<0%gfKt)x?uk&DEF;W5qXTqj&KZX{YNUS(~Yyy;*loIT#xtWpxH zb@tlT-cS%o%{Tk9tlJG_5{PQ&blqGn#aO7)=hRQP=*7lZ*{2cT&N2<%kWY~Ra1q%# zc2__jV?@?V6*58iZ?y^lG~^W!%D}hMX*w1pIYk?m=A{uxh}^qrXc9E&MbaX=<6Bpu zPn)M7SmEI`#4r$uWLXs1c@|}oUHj~Y0SO4R02_=r=2R9RwKfd_99x6HJD#p631!0b zrh-+f4a__sD*#0Lh7dRiV~a{s6*Ak_LOFqyu^K3FK;&{KCW9^NH$LQw83rZ1jBZzF^TDzI86BNF!e&2s39ak!QSq)cJ13W?TVPUy?OoYS z)I{(aJ@pf>?lEki$ONdpp`gBhO ztY1C=6Gm5ki?#4U;yPn<_?%5N)hfiucFWnhxaQyF%`^~ti;`PK>;M4oW4;2* zBpNnZX6ADurd~uyWHPWtPRv2!gwfbk0`V>l>Kd**SyCTlScLW3OqLbC(JEg=h&0jE zj`nQQCRHDb948$bn0I2Wf1_(@=4H%QPMDS2Xb(6%OM4@ zgFR$7B|~7h*QSj_8-pQ_f*mSmK|_bVkhc&%ngSR4CFp-!Ar?T2RLEeQc(FlBu_Fyq zEc&cSUYc3yx!712r4h|~u?wBGt@z@aaf&L|8-}2e-gok@>yP33vAc)<~sJ8gE$V%=enK*RbsACAU%F?N$EGb{`! z%p~4&xJsh$ZPLDL$17b-j>3hgt^**=B0m{or`Xieeh&_CnwyWc#;AGHz{W>G0bOW` z(vhB9%;}7aZ}&TD#w$cxKZz}^mUfnsCogvAvvXuyR1|2acU#OwyY{=V9_Q0%sEyTj zbSH8Rteakj{8M8+hTUkAinBpXl8WI{AQZAac`V2|1i9K)X)}g2cyVj`vDzzm6D!eI zjJh=@ZBmYRZla-eIBs?sOz2te+X{wfCGeQlc@r2O@wRL1UUS@L2FQu(W7(-b{L)EI zXWxaUk8rxuCj0bZ=CL5(xt<1U7y3hXo*s(!uEl8JAG)WP+JO=E-wtC@G zuG%Bhs#%K9ib=!q{w@cer!g*6$qrJ$wf%ck!$WdQ{$*QLMtMghkInV#`(OQAV8`}d zyRhy2ockX?E@odYO^(IW)DF~P_u6NdPt0VtI$N)w3K=e39!p5Ovhrck>^t)lh^{N{ zRhMpjP%k;e`0P4!R~}c-1E0QCd2`Ex^@nyZ+w1Z}D_@_=Z(jZKi5D<_V}KuhMY582 zFS$0`_Z)v23(apC+E(+OcPFzch+Z>i1Ykf`3TYb!7ya6%-g+UUffj z$=qyTT2i-MLCpFP^;s0=qP`gNGv1H_2@nJcjZvb-hnOS>5gGq=3P8QK`}%)%uMl`R zuoSO+I#ToqXz1+rKKDGI-#or~h_})RH1Nrp;^&&|N{bd7oAu4=pw8Geo1Bh~IyQG1 zn9Q+y$=Nw%5SLM0zn$M}bKGug!}^xn+)brkeCwZmB;%iODjMReY{kzC824Wb8Yn@V zo7Z$@YCy5GWqt$?XAgEOw*tt@*g^v2suO&^Q_LMR0d>;?Ohw<$B}dZ%?7Y&YXM6kN07D zEk1McmndOsXr>3_%+Z$mx@Hz_9N{VvIU=62iOj}wfe8CYle1&(T24^Kz0{?*CJcNv7w>( zoiECG>?bDaw@vOR;*y}BcV$B#4I*1gKF6VTg@p9H=O7M$| zw3KcQ{Aj-43=0hyX3|w`QouG5lS1XT&LXC;)sj=5LTt<_lo>D-jh$vx7=+^(4DUr^ zX)iBd7cIFhGTMwx)g9v&`L#FLB~4NAsp_dH4Y&Y>1^`Dg>|l{VGTkPB6^-p(jG%$M zC@282)!k{!5d;sn)019Xpz*9VP}iYs3wet?#UxW7xyE9*peqM8otTCQUj5PwlFROx z@r~pk9rn}g)Wf0f`)76Q7t+-C*{MA{OBp;@arp~$)S5utXFF~Bz;4;JZ65Ho-^JLW z7+arO7pFRF$8miSE;In^iqX_h{W_qt-R?cbKjnK^xJ8YJk{Vr~Y*Pdhr}&}^W-Vk8$bCYNl9JzbS~!lkC(Mmmiv&nA zLqhRt!RHqACT;>y@u$-<1RNiwaRVLYSs zKND4A!XMC4LZ_VCaQ;#($7^Q{5>ZV15-1fdCyY>Xfl}c2tBZdV%=3L7C?3On7m~n^ zPob=CW?q{}02vx04Jv69;fw-Zsqu#g`9-xcr~Nzvub=S{!+1)+be# z!1|b8Q@K#CUn~#f(yMc5{qOo~F|B0Pn4n;T02Y4c0F&4#F^^i>`gI9AzHHby6H=a# z!I+H$`phheTuf1Nc6-#~bGd=Afk%Yzg3ugCbPIai{*hY)y=EX8RgvCPY}*M$0rZO`AuN92CW z1%6G&nI7w@rwG;G{M#Yq?tdE29A1Xcj%5yqmfnO!wY<(Ek&py~7HmY9a@Z%6oZzdv z()uKDULI$Q_JHg9PO)5(GC{WFa8Yfur)+PAhZosp>&*GRM=;?GNv`DBAmvspL#f7}V6l}# zQdAt>vXDj_e0c5ENnqG~fPGFrT51#4b#a@9lqZYeGoy19wnXkb@AyaVg3nE}-)&xD ziE@_9S+J9~WPJs^qsFJD?+&~t4sj*cnc-KrGv{Aazg%{8_u@?{2<+@=E=|tQ_6n)C zxxXZs9bLpdXbj5Y-?|80>wIo-Z@5mrPd)kd{+>#7I^f#(&!+aP*5}3=?BhvfuUE&ERGn4j#T#ee4Y!}y5hfiBTJ&wrmd$)fqM-qV zqtR`nar5?9{_`2-4K1Ks-ni`Xrq-QGf7Va>GZruG*K#%l3C(xq`RE!ojti^%8tzYTR-*$3`NP zg)Nzq5^fXrvHXL?P%Q0leDjM@^N!yt?`(`prVn_MH);=TY)^u-?iCJ(9q@J&5_pQc zc9{Mlv;%B+Tya#?%Q|Jwfn z{A`bv$Yqp7osr3r>krKA(#&-!?DnV`#C{jPYH%ecn?6(RVd2(r;U)C2@p?VFYmxl8 z>3CHDr?V5+I0OF8>8e9?Cp>fMj=wss7{c-IeXhP+qP*h4b z(KwX96k<3IWXBq~uS9ZYP!SVoCTHNIKM}KOteoI&8EhhoeJYkQ6kj5+!ArlF-Ebby zF$_c=Aq0NCR}^|bW>K#lQD%&qTV7n)4+g(VS{ULE%%GsbBFBmjpqGRQL3ruBkR=|h zSr}f1p>XC1q@d{_<`58hA>U#F(aod}} z0uUh_TpWXvWyumAW+N66tCs4v~lB?5_aTP;a|MDTu=N7TrvqEZ)@lw2$qCm zbQwZ|%T)YPDvAOa#AjPS_5v`JyGb(PjR3Tq=jG0{9+YOlLVsizSQ#bEs)7Vk#Cmr+ zc`b+h-x@8PIt0F?^?Pdh97SGSVBSUX){t#3O1o^jsTTRR#gM`XoDueg_b3~7M-9ly zL`|Ze=@rxwdZ+IH^TR;CPH}ty|29d7{Ml+N?yA;12{R`gJbTlWqQo%>Ar>eoSyrs? zU_ds|MRlA~GnuX!81YagCM6kC!PMx`!X>t(u)-L&mUJ2-v^I0a7912>Vlo8q5im+> zCmCKcjT)%LdvgQUe_OF5`q60~_G+)clLqfH{8aO@@vS1jmuC%A>fqVGYg6`1f)oIG z%hIpPX0P`(Og$*{?i9`)`@e83p4=-Pt%9Ip0w>qwZ4jKpH%OtvBYKG0*+mMF69R^D|iptYxNZM#@uaa?o@FijDqA#@Lk+*nZI5GWAe(fNmBr8G>P4Hhru8`JkuVm*OJtS2O1{3UO!;&!BRT{* z2WtK%i}bw`21#EMO*0oO7`F0*$x2s1fQPCytHqCmStCYhwZq5=pr@(Dh=liUm=-_D ztV6I!;2UKx@4ZR8mhGla88(@K5#k~vL;I!SApmq<97OKhkYKmAl}f>3(<&9E+sJb) zn~vzxZ(l!OGqo$-a)ww*`vi@0Hht%17O*R{YYd@9htil%B)b^cnvM;PYk>A&F9XJSPC{Sho}p4ciS}6?66`A;dEtE4@`+_NjCE_U$yoID*c1> z^Q@X*=6C8p1QTgKq5nFRDTA>OIo|AEa@h@VEPlL(IRi+!cV0 zlM*6R0D%;NRgi?nJ=rMbx523}X^?RdBpEBH1fT`S5r@V3Nl2Dxg(!<)-qH*;+2g>q zYGs&=il=rI%9(!Dlra6H>u`;$NR57ky8I^`yP_}oILEj$BZ$OH^mOHQ2qXYsp9B#b zHlT;s=QIanPODRPGf;r3mYnfVGH95oopf2OF?S4I565zW7?l`Ic#|Gt)yi?LGv3h? z*9#d9?-KPv_;*+UjUPE`JXZU+;+YE%q%c}m$^`7)VVE7LOLXn{!q8muS@_S%ALD7w z&ll){>;v zGd}$RV@!So8&?^gSxx&CEtTMrRh{G7*Vr+$E!5S@N3=czOI1eA!8F&m0t z!Z8MoHp+2f1fsM~Cq8z%cTnkdVElT&RlOjpom3^Pr9LIPom&afdrS3we{z4 zj7)Tx0eS4IDV!g3$M5+WB&%=~*p1RJf{Y5HiY($0bF{{|d9vK%AbqoHc=?z44n0Ha zy8*S!y4IF`-|Whb#PK+pqp)lz(XIEDf|cokCG~W>uPjTM^19*u;9G}MQT9dIdY#3n z(YTtm?MhukjT62K~Gfl{Z4E zfMSeOJbg*a(XDi)jl71A^64?kE_|K9=KDZ>f-qDNfXbMEx^9CtOUiFr>KKb);$QjD zd2}ivi8vc%mypm8vIHiW{yry+;W z%#`T8w7-C=lr}Yp5P{)Lr&lcGI{vq(ncO8ehMAh~e{lAeQE`RsvS8!ZK;!PN0UCFA zm*DOiBse6vyF+k?;2I>jy9EgZcTLdXx5-)a%{h0?%vy8#!P<2H*>rX7{qDD(stPjB zKZ*l-?UQ3ZGIjZPf@Zg_iYO`3dEHm5DME0Iqo$)LSG~IJf9yVNkCJPb*_LR{!Se$) zp)H*D92_HKl^dSd#>6K+c`#6iWFJYC`K=m)xGaCqeeq6inA@OcC87J;_VLxI&BC>B z9n4IwZ0X~~ltp@^RM7YZA6%ke(xvyaZYpCsr(Tg3(=E4$=u?!YbyI_sE)gw_iS30=BCC8SR#9l7m?$bbVvhIv8EJ_uLIea0~RMkBv!LtzjtrqLoa|FASO*9K=3WbX%y_hkfYyd zsj$PW;M+7MWAcUcfH2o;&c@8l@f;4xi}rMaCX%42a%`HUZ*c1k>5e z1`;13y{5jl@{zgHmxWpMgB|=GS|i)b8DIlcW(p(WYACmm3MArHUVlA0L1u1A2VejI zQCiE=?5c+JcNp^BTr>y5^G)REFvozEbbyyzm$c{C$Bf&wY8|POkh9LX`k0hM^%`X5SGRt6Mj$m2cAsvR#Qd}5#7T|a-nj84KiNc@u5R^<~a!up2L4FJoO zOcJt|6E~PR*d>rZGq`b~~ zYBH~}%Dv8=(^b(D;`dhZl0+exGkusSsepXR26GFN1v4b)QHzQD;UhpASNVKl8pga} zF%AlgoOf4nx#tnj-DRtLt?E$a!TAG>3(WPG9Jm80aKT{-ri?BY&9fLVzw6M>+Cf8H zut)X-3Y_^sw=4-*C>xg%YFX9DzEu9*D5PM*{WL&;H~@Zvh(>nS)!OS`=h;XOi;^dk zdolSt^F(2~^4{gCBe;m`fzMinNob@-s-IEP&!3Tai!UjtEL)h7VsRvu%pCnmJQAgY z(QU3%i&Eg1-&m$t?K=NT^qda_A-Ly;05=P2C(GslGgr1G>%TS@s={Uw*vNRYL7STx zTDTKjewX@tD_{NwSjByCtv`j|rg_Y{VnU54A*R5j8HEBSvNI-!gk#7StDX#ze{Mr~ zz=<;cklHxeJZ4Vh{rIs45*OzUH&uXTfk)jJ62ZJpH#92FMxbenWZh-?hR{O4bmLm9-wC!%+rM)}PjG1*ymk5uLGKIA!k!_vC$wg5rtX#&=a7eHX@*~v~ZM%8bc(@2g=QDzQ=$pMDpsoW6% zW=hNO=HOw)f{C4@)Y-kMm5a~cV+qS3p*JIHW{clV%J_3{WBh7Nb)O{sE+AW^ZJUU7 zr2m+=zc`;OW?|F|RMMadWQ06>{164kkqIdZZt+ch8R9Bxnk+9O$5E7KV-wY4$*lC} zE=qr%xY8k54kRc{M2`tRrvIIajU1@6i-kyl>qV@1xf$qzI2|$GWmLjQujsZ%ylRpC zN8Ldye62}9i74reA3vz)L;?-CD2b1-=Z(p3RN};y=})y?)2%1=ac%Gop%;J~8r5JU z#Kx+}^oI(Nsp*l_FU zA*77dhMOM^LW@oNt<$5_|M20_v&mh&3nyLV{P^|4P-g(_iclyf;mG4?NeMg5z49pw zj6Dpxf}7`;yB#-I9ynF^`O{c5CAmpN^6aSkRbi7&&o4|hB=@C_>i`WaTk+*_B!UVHH3VY^o)>w3$BuUZOPdr7z@WI6P_d>~ zn@S|gm30(p=Q9--FiqszYSpDZuB*>g{FZ9Ewy!x!X5n|VYdf%;_{j_%<%5d}NJ=erh%B5ExJ;|A$5+)W!^9^Ixcq&-`eUW5z06kE6*Yz{SF3u`4vkItupT= z^I9@90e3m)-KVeP-#w*YPuVM5$;dhQ`t35MZ{Ql%(BXw;UlrVFX?Sb`bT&JbwVZ6O z5=OHLvaDdm(5AoaYK`m4PT}dVOFMrOH3_x=8%SL|daRQ@7^nrbJcT)CW_+|eW4)YB z>n~}o#rkZ$rfYoX>3$}xQ4zsuC#f#dw!`C(&8bt%G2p=dO^EFYlNJdD0OhW&`TqMB zhlHq+OLiBbgomi_qcouel}u<5vDft40;8(JQNAb1UL_izus20Ph~GD9>RmIGn2!;1 zplLL0Y?hgIG4bpef+VDr3Cx{2ZTK3{S`P3AK}K^+9NwF6?h?%Z#-YndEHctTCJ2Wl zspuikL&|7y`v3Z&Sknq1rQr8^GowVm*RgNlSNpyc2!TI)X(v-!P{!$L%Y;t}>l&PP z74Lcy@HT&+W<0Uh$0Bwzawpk%imX%186P5Y`|}!QGR&&5yZuWOx%1!|U(Ydn+bB+e z`(4pvuDOI9B0=y`FO^lW2A{YD6%>fw03wA4)qR7niboYRI%vC=ys6$Q-Y<9HPFPv3 zb?91NQDe^%-NR_aa*N%`jU;rohNp%=wH&c<7W1|zG2Ct964kV`H)T)oTyYaGp z?5NPwFq5p*@&M+1fJ3Bxt~qV^qQe+Ql=@~6q{!2RnF=Po{v+5+?8hIT(tvo;nvW8U z30v7~$N&^6f~`T)oQ;41YVIYk2M3RF8;;v;oQ3pIGWCyKJhkBjWobQ@<&t<|xj?qdqhW(2 zbYE*CZTt38TYP0T0Yln*d|!%bV%J<-F4I(?6*~#Oj<5+E$Lyy}W+0tNBfpi_x-_tU z50?~ZAAY%5!3gxu@ImG^r5u{XKvm3ax>vG}6q;OwLNp6Tnr=IkECTU12epV(bR^J8 z#AfvsF^w}cf+E=M(fO>Flfg^a5iXqkqOdH^lKPofZu_>t?vL%*-+WiqHQWG}pZsy; zju|UYE7juVXp!|eY^pDB1ZAFNz^8Dr!lmLo6cU`ABOLjG>{aq?hh&%ti3?3*yNO`4 zJUdG%E1_b;B$iJ86jf`FQhwX#>=s6pMw+z&vYXGXnzpHkD>|j+z5m{^vGIto+d`>2a+}dEXWc~5JIOTg+YGmQ1X=vh9tsQ!mVpQe+-uYq<*lsOT z^LMGaBa$tD9pN*)OBMrP*;#PP!3Ds8kAgG}%iw zGw=O7VE1cZu^;BA?Y?kUzBV{fScD`AV8JzfxrUEM+e)7YIe|W&xZcee15$JEhx!uD zL#W{m6)`6>+mV;P2+k%g$Gd0&M>+PMdQVt{7Mq{-X*gC~Z1^^=CJDb)F^iNkzlckD zE9_gVly&ISXAB$fX-{Zi2_<}yGOJr?(BwuswzRX;jFYI9YgSi*8+ALz@9-?&0 zq5i8|-_&*0fYU(ta|6WU);KC4WcUakCDh@%Y25P*34|&Z1!hJ3jU2Gf z>}+Ce*@Uc7nRtWguvuy<+UczO``vDyik~;+mz~aqGndQvB_`+QeyS3u4L5u&M2&S) z3;m$DyfmI^)XC?1CX2js?NGCG~PQ;(&yZ#$O8}Tq}n*Grb4)H<^UJwqUQDlPN z<`m`w%%~vYXUWa$Gxr&I*NBC7bHsebSC*&zxy(N7e+&qUGs2uh|NW2ES;F-@H)bi}23~ZesIM@p5*%eIz z93;yc`_!ap#7Gl4E{$D!$QGpx=a2vm-K?C_mSj9zY+f_Rs1i@@<>{2Pbw$7OYU0?R zKyCX{=SA2$8tm9}cQUwK9DS}&D!=@Gs6!J`HF+Fi79z6lQuK|fYdHPA!MC(akWV^o z%6h({-|)CC2{%Wv5mSnoZEP7&XVd@Lk%!}C$~QK{nx+Z^v4enli&Gl0HJQK&RXAWk zHi|j)2m%b07i?evl5_x>#I>F_F8h~_?Y(_n7x1gw&v|BKPcd%-@()O&okvn!#QBZ+ ziKP~F2;#uJiR-8jg1UIR%;ciwb+*I46K((U|NcZ```Z2EkgN%!DiAWZ9f|;|{jW}e z1qfgV7kiTY+TUVZ5`s?1$ma9vHZWgF^gKGxMdDnwF8qWaKi5{bdHC;ft*)_hJv(I1 zdrlt^v=--+i;@GqczZQd2jv7$3?=%)GWskuZrI#!quPv!xP@q*Bi(J0~;)AKyvW}ltl(mk;B0BZ2|fKW_z`&o_bO_yHk-jC^9paHn{Dy{_na zueVDtvkDPw5g0B4@qs-MgBuWS74mb5#$nMfP170WvsSt$C5Smp7>CcW zH7#s4`L*@OkM%zN@C$G=EYll>egj|^?D}#1dH~`8M9X|c05LZP6{Hg!nyWXzA7}!F zoy?VHc81WH@V=vc%M;|>Og)suvI0d2RG;S5RXNWxvs`{vX$u!B2!?FW?^%@N23bE_UG3De<_ok zo%sGDz~}o_d8a8t%R*d`L+S17>m;kW1olrhu8_%Nn^a5bOo?numuZV<4y|sNnP0>I{Wpyzj7D~**j7`OeT}pSSZ+kO zotx+Mm5Y!e5CAfv&3HDYPdq1^q*-JPHOMO#e8JdoROdh`yZnhyPB=j2GER7A*Sc&RaDzdT%7s6 z^$=CX7z8)P!1_sTFUgzr_3GsHs$V7n@WW2d`9_4+c>om;f5;FG&}#+n2Y|W{41pO9 zFaUT503=bfn4|V!=MZs}pjmq~dFjMq`IOsw*R=ZjF^{^MrMUq$ zi`-OsLVCI8H5;R(Kh`tPr$ZXEn#j?{W?k9Ii_>#oDx1Z~0nyzB>#g@5L3=$D93+pP zpStACVOu^+{~7a$E?PeCAN)3ScTpgG#|k*+mIV;915^$yG<5eFN~FIYv@LCHMPZiVIl)2rg;#E^=%ES%rvc*#HLa=?NDb=B$q$^q4`!C2MUNy7?h z>a(xE=i%{%zy0}SOX~4!haTdhh~^@PY}?%^*VrfnoK9%hK8mldyE|hLF3VLhOwe$A z9+`c02?6&usU!XcME%9ARwGP#v}dCj~bH zQ1#^?B_oK7Rm{jRQ3|aB1X;D-F$yg7s|40pN0kxb<6@j6-?q!bC&c91F3u)_D zcIA%y8{XFV8cRQ{!%9CRmKXDo!{lkogj1&dGa>;$8c%S0fFT-->$CovWD0y%k_2uQkR?_4VKmS$VQF?ajcdy zv^Rv}BA|DO-sGW8MgXMH7(zp4h*$s41TYRTd%Fq5^n<+t6CsVLK{28z#%Hmf0)+!Z zVKEc7B+ZE8o91ZvnSUstNFAQp^q!8Q_5|_#RUbq+A#}-hgbwS+V2y8 zutU@?3>Qh}8pS7@OSHN=WBX;T_b~MSfoigA7lS*ohIE)sGgiUT&MiFC*-zLI(khAV zGrWlwTF|<2m?O?`Ahh~@{O&CpqUqWn}CQ;Q(VWC!H>X7=WglDQub zGu3+F`FF=}2#o+Rcy6p_qV;Z<=~Jmp_N>MG$$%8C?pIB zO_L_2weWNLlj6te=|zi`Omn>sx<;9}Gl^tV9ddp;BpTC#cvrZo3}G_;#f)dG(N8}< ze?IxKpegnEFd>-I^kjX!VVQXFvbNnXUSRLr<@E^#v$*wYhW(}N^Q3Vus`arlaQ?=7 z___PhpZMs8^!4GaDSQLj-Z$v$M5u@qDcMC1#*o1O6u|*30Dvz@Zo-BwYQRhcX5AD& zu-rM6uR>+`&&n`RP>MSgP-(+k?>0?JDfUN`o+P+8AR|Cp5!e}lKPHFFxwBZ>RS(lkwZ06750d(v8)fQeQvo%s!+-3Zr4 ze5r8=LQ2pXYOs{73W6Wr%2>r10H&It2&h2HF9({U&Z^N<4DJ#5OZ^xUKj7f%HHH_4 z+Yrm0L8gU_j61fJi$8tFs7uFcnBP%5^p}HfH60}-uSs3qk_mBoO7X498Stq^QF1cW zx)8H;$S*0v1JbJf_$i7o4xU=b@-hjMEDC27gsf(}JS9NNIxckNkr?bznDo7J7077; zv2~0aT>8@$+w?(v(+10Xm|9hBfqi38IVB0bH~c|rW`MpU3`^PAxreVM-r%^JGoOYm zQ)n5`wjc_9K7nY${sdUnLH^gb5os}SLp80lTd;zIwM!3NO5J*ROplc5%B&eN&eek0Iq9*9kMH}xopIxvpq(<`c8>S{)99! zBaFgfJANlIfB)lCUedGnv*4Bu!JHEZ5RJ=$e8s!Bw;!X9oqP|_1`Q8gQ-&+=gLC=t zj9gssWtYq>@mhmAKokbx9Q;pwxJS}pf*)vnnhB8Ek+p(|;HdQen9~r6)s~Zdfi3PN z!4M%kAY-2fPYy9)Z!(>eF^{5FAstFV;xFY@<5DWj7wb6J6^>i zBxg*C0t0%V#6^gQAYcH5=*#u5-#E+uVC63oecD*OSxUbUxEat8`VDK$DmOvbc;SbQxiJrj+UR~B z-utd!a9@!CxFuA;o*{x>z7D!x`m;G{N~lK9uS-u zGEo90tsl%N#YO&?5VYJFu8c9R3{+NEJkYrj+DTw=#-R>Qtl-_*PvIubWwbPHAu`jG zH2hJ*BLo)gF+G7*-O5*Iq2CEDeh^h2R*SQ&XPEAq09v$yU88d)>np76q=dr5LG4a)tM)^@w=?h21*$1mN;rJ1#li3k5u zPG2K5gm4ETD}_3Zq6mYxGFI4@S~er;99HPY}v)s+PTJl_y@WoIFm;PdeXB;Z5xLBT6;$4aOF$AeQ9O43G>#X zdn3=i`cR+lYUit3F9$9Z(;-FGT)zpLKw4#lLe55uak?EsEJY4RHjtE57IK%j%!k^K z#jV+iXlWImOy8-qraYtwo`*2=fA0HYX@r6V`iaOA{kovyj59||i zjM0cD@|n{nhNcXS@taT_R+aT+0FOC@c-%%fBfmRha{rx8=goY_mwI23q}SvV?V3HQ zP*(QnDgH5^2h)E=XMsu=Fm?m~NI5SL!3E%132_8U@R6vuO)0~2=aJ=)6%OfibsvU?)s5sa4l>}_{r3rli zt0MKML^PYXp4caVE4Z44>1Q5phY?4*La4kW=znMJ8s}yS3Wo92rDDS^GScI`-G?qB zHIxVkqMtzGYJJ}zPHkh|dRWzMK2j?DVM_Qsfe;om{AI zef#Y+;CGDR`eH09Y25S945RjG*5OfSzpaAY@uYnH(RmVj&jV1~F3LBi#Kmz5^@s0i zpEDzzBSn=xf`#oA6Apo@hkx8egQS{j z)`d>vy7gfJ2Q3y#wpN82m>vZ`V6b_Hxk}yfF{AFb`r)>=j+|$*FE|-i1vs;i-5>WJeG^K1@cbd_{+|J~K6FC_Jo zzo-(|YOS&S(JAA9oF#-!M_wqWnm3-NO--)5C?8~GETKuxi{m*#4W(94=Pt7rW^h1> zwGzS@GD2kur1pl^k=6%Pl+vi-o3xlDCV;pZ5mj%0mG_0SeAgViL`G$2$|$Ij6mL%0 z9ZAnYvSd*0(87tx!N}oM9Fw$T!Z5IfF@fV>DAdfBTYn&Qxnf%l3;*bVn zKXP);9JuD{jy%6u)*ql`i6D?$11B*58ih1aYcv_Ca7YZxD2Z!Bv5vUr3}Y)}!GnbXQv_z|A`g7T^m?34)MTK6C&t9LU>i! zdbRt~utzY{{M@7_PGyYk;UG<9-1=Fclf-# z+YLNC5&x$Fy6p}7N-`??>3K$p#ZED@f>p5bnZFUIb!ITX?}yx#-OlCie>H`Wt6Y|T zfAHI=Pvs#Okji8tU>ffoZ71Jrq-ZEqnVb-}}QMf>4a zp;TsSQDAHkQh0v7sJIRQC8#}Y;`@TbftCHkb#W?-+U2%_XA8B|L>dQ?u^U%Q_kBmA z`@0i+JDzhTVGWhJj-fP&JB{TrE=vD=%I|~HPy9^i-9MblXsr$4kw>h$@DfF zk1n3hUoWrD1kSmPh0aZ?d&Q**;1H*vM-tS02pTAIU6hwcN|9X&Fn|FF0WgM$BOzvy zocEal(QwRlYyyHTbV-XcU&SQ54m`eyX{waSkVtZpSocu+u4c;ia}IyGj6JslU?F!U zpaB%hR$&jGl0Je!L z3<91%V&IFfTjX5c*#)~V1uH(fj_b}OVZDvphYbJoZ{J{VChS!kL^?h)@(_F zGg={*?-b*wc?P0g-Zk^QF7GNKNWu8Rs9UEew}o& z_Z0t4WVzC1$hnNCG8yE2WIE=%k2W-Nr5 z1~LSSMMGb)XlFQdx#g-UmJoRmPb5YMilgAj2$To?cKGNZ$|}|8Nd}Er3ynDP#k87e zk)W79h*dsmD;TkK7PKXqI(Mbg=@$X$Q|~KrL~En@0Z}4R^V}~h`snW75c(5WF}DC9RH%zC`Sw!xUYA3s z5q zp5Vv`W-nG`+a$w;PfTeUvu7PndGFSZB;vZ?NBYJkqxba@ca5W}^FMp{M|V@&Wk`xyCJp%*;%E^_F? za`i-h$|z-gBebBFY7cdk5}5sNsqe*;VF+DSKyu3GLT`Y>PH)R1(RU%mbzqhMpxR)O9!8)Th=mo&CL6bxBy zD?$W3NIjG)g&Yw5+EjKghSCBQ$-6Head_wr@;rB_$ zSacrT-+8@}%l9R#VvW|Cz6MQ|bFMZBB8&3(1fB1-_$Kv?VTL0j`^}o#)su5;L?Q9hg{w&h+Lcs{pKY%tmjY%mBh3bAU(R@5Q#Q7vZP z!x31*CzzgKm16T${jnR(G7n)u$#kPm=p|3+P)qT;f0P!i_`x~^4T~d5!dQl(Rcwxs ze^LXG37zC%WW>p@Ty~lO)+*g9;;~~-Y<%KKdK$9YK?NzIQ6s}>iRH6fr+xmz(bBb! zgr~%A!Rg%E0T*BDf|i#2)0KzCr3mDIiKGu#cuszsei+E8 zk2(xJq2ie+WU1*{VC;kB@=IHQNi;P=sjA`06QZ_3onlLktA z4UjGLM5}%!Y4O@=-Q!0G)hnT8Ol=uE%o=78SG&0a1BwW|DWGdUISw$NMfiV`LBMh| zIL^ZAH>aEJ$Yj2QV>YMcjdA7ns2<^BeK-9}Fr@9KuNc#NaX0t-xxf%cMOjEOoPlf* z{?URv9!9gKgP0ZfLsl@fnmn~?cwI2tsc^{8lfj{E)x=u7f(bdRK-9aOB(97>#|fbow5a#Z-P^VF9T?uYFkV|F(yjOrch zlglWT8_{Kq5Ar(4y!GIyC1)OE9En?r#gash=)aenyM zgs;xOi4QRv1JHAl(I6a>g9VrdK+GxLG=mlPX=Clc6W*ef@E(* zU@ECL3R9=gwau^x=O$n~y67aBMTQvs#Y>2l6CE#BkZ%%95R)=S%_toz>d1y$@Fp?W*-uI0|>#;Cnb`p>= z1yMc#B!`v?8^luo7N;OO5kP4H;m|^k#do`s7URON2UKMV<~}SbCkqWPh2FWhGwMiM z6B3!~{Xah03Rzl9es3W8qB1BoxliuVT4Y#(EIi@u!Ctz92-8|0I0$7lxX>~QQ?P_D zRa+pF$78#FY%&{PBPLJWn3eFu6adR9cB&;~g$|c$zi38G{evU$9G0NMslQTeF&Ec6 zVMN1L5D!e5F9-vdk5UA!0}~7gfpG&k0O|tZdIF$W5s`c}j+4~nLU}2Gg3QcW&Wd>< zlv&2}HJK?oss;T!--n%qo@&@0Lpa{&VF$H<+@hz&96xb!ueBZq{d9)?>cy@d; z?_iLg1MQkIDwwZ8Bi*s70nr?JIBwXG!6DL;76_UPc3gz9;XO7Eh)}~~Gaw*78vjAD zz6_lXl=E)Oh%N!x#D-0fgpHmC3NB+f(2n3NOC=q;89&LIk)9In4WVPWg$~<3m`Aog zNpeI}Ls#-|kniipdLe$`HCxf_wIQ%ru^6`+@4vq6^$ZOwHEpPUo zqbHOVI~ruI%%m{WWj;e*eqr|&Sh(H0*Qqe`UWpNI7=F+~m)TL5WwT)?HDJvk|kF2yg^D{RT1uq zwQRP88D;5Oz@NE`Kcpo}1OaA+!xZpfp;2@g#?Z6uYJL zL;z3`4N3hW2+aT}h64bAlj!AM_f%1sq7AYBe89&m){i_zSTjr-iCwWHsr-ofku#Pc zq>zD9bO3VT_Hkf_Bqc^22pv;S(7@XI7eYkFB?j(>jUj923oDoI*ECuDFNT9s)n68( zVbNO-KA;dBdu{9+BwP^nYyG$vOJU!kvC4i`F3+ti!EDr^xy!BHS5&&zohD3?O+l^{ z#p;y3i|(9REkcli{)$#Y!P5jBF8(>UJ5&9|&G_~6kw=!mGudOq;_lx%K%Kl~0)SxP zJ6*=d{GX(GlK9Ma8S+2^Ua<^mI$S?iC~_{HOmPv}3R~0kn;%+o@uM-9<1|vVq}bSg z0CY5FyDI}BdF;ip8e2$eyYcHO+yf~S^t|G{C_(HAbxp}MDwf=1`eo2pbL*GlWC#K5-FC!0~tYz zG$;tc3$WC7jc*8b2EZcFOJF^T&aw62XG2tQqWN0xIN2Anr;G z9=my*kL2@V!)Pq*Y-9K!GWLk_zCLGwDjSC&w0K(6cyYtJ1vH!K5gx9D{%$}_(HlZ@ zh+rg2NK!DqGe-}i3uI}4RHa3ta%c_(7eJ8$iltZU=+d#s@d?=V3Smtts3Dz{KA9K@b=xvG($}yWV|8BriI{Yr5>~?%owQBSOEUr0uq@T_l z(RfUMQh36y-@44Yn~$39pRPh+v}1*zESj3ZobOFi>b>xl(4`_e6&teu}zI2?L zChyxbs|4G%kNGJ7GDdz%yGALP@HdNYT4JjFC>v+^dCEWwL9Q^6vK= zLaV{*HH6X-72E{UoZm>$cTr1 zf$b@z+~dU%pTU?(m=6&*DdM3F%y8|4wiKvn;Nk%-YaR{x&nivg!o&)A6PMr~iBjko zoC_~~vS(!BwCY~K?XHl2s$m&}SD8~L%{DLiV<66tE5drJN!FOj95ur`#v6cj}t~fDwS) zBsPs~-2OpX=F^Cs5Eglz4iGiYORp%6C3?$6yGq5T!IfY!&*amC%9tdA1!1XH-d$I7 z&=*xIQXHdJ%*vJ$0Dtt=J8&56J=>f(HJffAk_b_7h$%OA5j83TIyntR>Ij!^Ozx#O~)xG;5CDS*~>MX%mgqU`6R1@K^iv!mBzXgB~Ug12t4P=#1R z&e$QkLqt@m^42{RrvoW*d`Wj91_Js7bhs0X?zhWH|NHHPQ50sA%@HhtO;+?Pwef>O zkr=!iZNE7lR5Gv!iaek*GHJ2QZ6=TV@wMjj#z!SN1M_5feoQP9S(?yZiWvDc#&Z+1 z<=|sYH(8^DVN#b8>K^FTowY4@0B!?<eOF9 z_p8W*%=-&#PX1OobK}3eJ4ziMcSi9j{pBQzPXgN&cO9o6#(l>p7&SWYp&T{yi5^?c z2-w6DN%wqgx7m{=5r2M8(>Qqf6!yMB7XMVbq#}Nt>_~c#U7ov@ zI^znGIoEu`%?30r4t;+kXxsq_c6!X1x*i{d?rvRMQ#A!JCyg~XZ>9~To+?E8G`RbB z2vs7Bh_IlaRaCHyJ9S<;YR1YlUgzTOS6NuKB4>}r(=k!@yT3EaDbzB^uFGw)Yx(V8bR3QI zSHFY?Y*;{h+G!LKjWv<8t^^B5yxcI9x<&NCL-v-1~XCboZrm6r_@xgzU0)GJ-DrAtn3w%{YGcPSzN@0bBXo!Gk3guXzzeye!*sj|& zlj#tfvND)+5X2eBl^+5Wf#V)Y`XS6Ks&;|Q5}>osz={+hyXeur-pt@_SzR(CExbLZ zp&+cJ9?KdpKz(@covTkJg(bVSONAT5SX3pdBpt@F#XMwIgbLduT8jM0wd~{huAAlM z{@z*^SO}?rkW%ZRrPik;*f;0xX;Az^OK3w}EV^@hSj{@?`K#*}viVc0y|GG-#!Yb` z2zRMizXA`rk$n|hCF^^*@uG9q30s=vGTkv$tO9&aPZ$5JbY~M1vMo+rud^qVJz|p> zt5M2sed^lZrsFh_7GqOdcIoydHP6jh)z4honaY@3^xKD6d5?a-l^+(6`9qrUMzJ2w zWHcb|4tyPI<4qV}DA<@8ESk7=Eh1Cu3fuPki0oZodx1pUvPp_EjWaVf-e5c-Vj^mB z{_0bMd{ouW2`)}smyn!Sr}L~yBL20LP9-8<2h`GyVD+=JAQSk8l=}Pb;y3n&7KsJXQJjviSnSGr#wNo zfWyiCxfE}vC@}H#yGr?q3{?txG_}v1*TxSKV*(9;Qr@|f>pjn*nAyNwvW0g36?$Qj zty1j$@3~xrKgN7N?Yj+L%aY4DBm_!FKfI=?jZ+Ekq#Gv`+*%6H69{(MW%a%F zByTi6N%~akd{H02o>W1K$--@8zdmPc@5^z%Z;47PZI3|#SleleXjKR#!qss=Fr zhfDu$#SG=z2e8pR)ilFK#5d0x4b*~1WX*uJ!9`05N)k$L#uv)XZuUE$vYq$NNkx=U zU!on?digA$3c1r(|G0c&2^qP!MG^**6A+HwDEUh&BY>CHLbiaOE!km4> z9{FE!=&@GGc=XtK> z(vB$97}!Wuyp4V1{8B zLRc&`F*9;^y6E=yl8&2^9Aj%*nbmfuT@D+ea45a8qMI01jxD@}W(9Cyz zDZ5eDRaAR&(COB?$_peKqIRBz+hdqd*|Lz#rTz4B_1fF%4 zVzB8<@{=>#gWjXyVLMI-h34l7EB;ZGyBK$WNfm0lZYFTr3zUXSzrLa^UcF@JBM&Qxp@H)_GNiwWNCu5NOb6;?3?{cqQUhAM=YI$cfJy5k9i z1=6Ka``ihutKN;U1om_Mv!@gvs+ihpFL0Nu9DzuNJD1sICMK>#iB-VcKrETap#o~< zXg+45v5@c?so2Ir658EvWhjT3la8t+JCT}S9jae@rq92_=|u+gohIF&6!d=yPEg! zo%!N3*m>c5WK^WvmoWCHdj|7GRt1q50r}xKeAhej zr8}_Hv{7mjte6da-&O7rg>-!Tqh0~^e6xAs0}#Z_f%ZmF(sPW;zA%7__p>z|7%2ak zM#z+c6ep}X355_#QrSUFb(Vg}hqX(D4r0jMrIE=*f0wfQZ{pFm0Z8~2WRLi#U@JpJ z2q*P*839by%5MDpL~uIx`k?Sq?(QHR=IS$vrQKBa{YBKWBu94j(awpge~^w(Z_)Lu zLq(_Co7}bRHg%-}q*FgOrgM0??d# z8y~iHW~l8be}O=2aD|9mldwT;d~tuH>%Gc)X5)9#-MepX9qMB1bGqL$zjc#mG66Ll z_v6W*)8;E7fsatRiHrBe4%vnV3(eDdG_Pj-yx9Fhkg&nd;L_+^`|uH*4?}0T!Kr6S zKGq@j6ZMr05>`zvtkTva5sKaI?yD|p@lp`Z~Remz?(y(-> zssOJ@o`KSTOQYY}9;3o&vb4%94pze?##kRd*q&~}IX2!QQe|NQvz!;t^tP{2zW%n+YZ|!H(;*_NR9wW3yQ$d%?J~LSfC1iC92qz8I<1Lq0x4Er zz7`Ut`@c#_(i_6RMEP@D#jN*;8Ds=jI&{P^O9@k1QjQm>Y3=2?hO-PX+~eH@1yWF# z)V@(FF1)>wqIR%X8~h8aFXcRuR=cIGN=_TG>>J`8LsAHfm>LTtT^+LQQBtyI_wJ6n zJBAT01A6AtMC7cpn6`l2aSi%Xxp5Z*PatoSrc|RLs*<7#B0r|70u+-# zQS8D@g&S_^+QuPo>Sui`C$h|c^?3~YpS@^Gz}Bv_c_hQYXn!FD^PcugyE&15&idBB z9;nIthpp9Ax1<%c21>s*lU}96WfvCz+CH7|+)s)hYs>vK7HvIxH?2neC2Sb^xW~;$ z(ni0g`N2Xq=TR_Drs&Ylu6Zru>D$3$q^GxBT1igBs*%^kXbujxXX>?NHKxAz>>PU- z7Kt;jc|=bDEuPtr=vm)H|2%&@!rPvH+EON76#Cnz9tBRDcMLHEIPdCmA|vgj`j|L= zQQ(V7h8ck}yyUz%F>X=7t4Lv#wAjuGclP35X0E$bZ?2Th>j10iKz+g18HQWH;;G+B z9w)n-ewl0wicQuVZF?b;mk90S4kP9Mt#TT#`iP13cNwLt{*7&i60@91a3p#1NbLwD zC!CcnG$5Qm+N29bUl%tvalKrfYqt1YWBZP2c0MD70(fxqDQPA9<4}2+@ut?b9uNKY z0(zR4FRBD=7w4>1sZHz)6KFizi)i~ZxUv!^)ii7@yF#i(y)@70dwXvEOnk=uE)#0& zfCoyU*yu4Nmt1#{XbrEIL(S+*J>a&xzuBIJx=&P+kS>3JQQ=`v$?omM}_9da-M^|yDTQYaH z{J5}$KSPRN=Zs`&ejC98x>MWk)vr*+CL6tAeuwRkSnH1!PWAywkEUd#>tiVsxip5T zEVa*u#aE~R8C_R2%?tClyjlA`ms^gJu8&a+jPo9N5KlBqRX{%0GI}x&THJ$_bFz!zp3e8IT6u55|n5v4ltg_NN7Z07ikWjm<|ve-AvvK2PMc{M2sE=f+I z$fjK#oIhh$H!3cDiO_mDS+P`)>0c=orPtaI$W_L`RhN0_9n_3Oga9!B=H-}5kc1kl z1MS7?Z`dtpgGP5nc&d~=7cgC1$rlBD@7zWwab&#_khjdd=U>AHNV_{gqY!BuUc&SB zbPeKEs%y1isbgbrjtkPBQ7yBRU*k`UgKR^RtI%=Z<>pPCXu*7@l+KJ!KbsUn1n#QC zqzmpbH%jPIT4V=I>-{L8Eh;xDR*c)w&HeRZxVmTsQJZ)C_{V8yaD8)$_CXmAUic#I zNoIEA?7}FFDM-iAF19*n-Xbq)AXs(&q$i^}6Qw2i`pC>%EAYiS6TSidWU+D4Zgj;> z=bGJ4HNp@hcyfKqt)*FxM0c1+GrsRn9^6u{S>`Q6M0@^ed#KDhY>|%~2aOt3c6M)y zxUb{!_<1~OsX~U1fofzf48}zMm1rJCK#tjLcm}c2xst5ce$t61Ne&f#)G>exgO1ts zu(TipDm`&hvZpBmu3iH&!kcVGhGqItohU32&)3BD+;2DrQuw15&Y%>W>wf#N=;hwf z5q%P)sn{RC=}Uw*fJ|Xx8oI=a6_F3Qbb>S9DEik(!YR(D0*?LNvfi8{enlaxVvpXv z_1q(8Y<~XWjgNOQIVM5u)8MahciB)c3gv*wcPaNMI8*>xI*eHlUcb*)m;?hf7WE>0 z-&FeLN1Xpa*>jJqQp15G6EyAKZY6q@6fFVO1 z#E<}>EG6I?G2{o8t?9aspk2!U86mmzT}!Id$3u8r+v!K+8i$97&h#i!21(6@Sml5C zV#BILpgrN%V#@-0s_nUlMDsY&f7xXmlfrZA)fB(#d~5ZQ=#%ai3my8rn^U){yv#>u zPiL2!M_1bVdr|9e2cbIz{0GxdPEew)4e65NsqO8qz@nLTE+_ZY7wmjhHluIP|CO!T zsflx5Cc^twK2uE-Rc94i;zd8^TNjMJn>!Ep~_SWUFfUTWF zWx3MXklv+*i@gsCRk@jGO%iB}->99Xzl-s%+sfZI-Go}Uw!&KMPpaI`;v4sBvq4ka*_1(fq+Zu+hu~j5lRq_JB8o#BZFvS>USi z5j^cbFIfq;BfPcwvtl`X(loM0$VsU$h!LmBZ>-YwB?($85Xk|p2z74PCGhZimxXw< zNJ=8w)K7(I>FiSxU9>TH z_xn=CI7slaf1I3bU`sBQ^OWzRBRfiG=T2*W3D~knVK!yZHu%E-E~PIECx^PeIj+b0 z(Lejp5;eJ)15)>LZ2L!`1G&04-H<*bQ3MBehV#2Vxm@0z5b zl}?RU1MPo|eDw;=J1es+$D)(Z4a7ASlV%1*>Ii)!CepE*0nm7lL(hu`FPbwjyu${E zF>w@RF3|)GHQ_f-ko1NiO+7#6oo!+9oBw%VkA-{ve2ZXgSEz26sr>*rAvzqGyclTZ@hhSluO|jRiTu7 z1Teyc5yjd(;;UU0U0$4w&uIyS)8|mzB4=1iH8Vxxh!GowCKa;6k0qD*0FgtR0IE3q tI~SgUlooNq<{iv{D=~5`h+pA=?(1n + + +import numpy as np +import matplotlib.pyplot as plt +from numpy.random import default_rng +rng = default_rng() +from madmom.features.beats_hmm import BarStateSpace, BarTransitionModel # importing the bar pointer state space implemented in Madmom +from madmom.ml.hmm import TransitionModel, ObservationModel + +class BDObservationModel(ObservationModel): + """ + Observation model for beat and downbeat tracking with particle filtering. + + Parameters + ---------- + state_space : :class:`BarStateSpace` instance + BarStateSpace instance. + observation_lambda : str + Based on the first character of this parameter, each (down-)beat period gets split into (down-)beat states + "B" stands for border model which classifies 1/(observation lambda) fraction of states as downbeat states and + the rest as the beat states (if it is used for downbeat tracking state space) or the same fraction of states + as beat states and the rest as the none beat states (if it is used for beat tracking state space). + "N" model assigns a constant number of the beginning states as downbeat states and the rest as beat states + or beginning states as beat and the rest as none-beat states + "G" model is a smooth Gaussian transition (soft border) between downbeat/beat or beat/none-beat states + + """ + + def __init__(self, state_space, observation_lambda): + + if observation_lambda[0] == 'B': + observation_lambda = int(observation_lambda[1:]) + # compute observation pointers + # always point to the non-beat densities + pointers = np.zeros(state_space.num_states, dtype=np.uint32) + # unless they are in the beat range of the state space + border = 1. / observation_lambda + pointers[state_space.state_positions % 1 < border] = 1 + # the downbeat (i.e. the first beat range) points to density column 2 + pointers[state_space.state_positions < border] = 2 + # instantiate a ObservationModel with the pointers + super(BDObservationModel, self).__init__(pointers) + + elif observation_lambda[0] == 'N': + observation_lambda = int(observation_lambda[1:]) + # compute observation pointers + # always point to the non-beat densities + pointers = np.zeros(state_space.num_states, dtype=np.uint32) + # unless they are in the beat range of the state space + for i in range(observation_lambda): + border = np.asarray(state_space.first_states) + i + pointers[border[1:]] = 1 + # the downbeat (i.e. the first beat range) points to density column 2 + pointers[border[0]] = 2 + # instantiate a ObservationModel with the pointers + super(BDObservationModel, self).__init__(pointers) + + elif observation_lambda[0] == 'G': + observation_lambda = float(observation_lambda[1:]) + pointers = np.zeros((state_space.num_beats + 1, state_space.num_states)) + for i in range(state_space.num_beats + 1): + pointers[i] = gaussian(state_space.state_positions, i, observation_lambda) + pointers[0] = pointers[0] + pointers[-1] + pointers[1] = np.sum(pointers[1:-1], axis=0) + pointers = pointers[:2] + super(BDObservationModel, self).__init__(pointers) + + +def gaussian(x, mu, sig): + return np.exp(-np.power((x - mu) / sig, 2.) / 2) + + +# assigning beat vs non-beat weights +def beat_densities(observations, observation_model, state_model): + new_obs = np.zeros(state_model.num_states, float) + if len(np.shape(observation_model.pointers)) != 2: # B or N + new_obs[np.argwhere(observation_model.pointers == 2)] = observations + new_obs[np.argwhere(observation_model.pointers == 0)] = 0.03 + elif len(np.shape(observation_model.pointers)) == 2: # G + new_obs = observation_model.pointers[0] * observations + new_obs[new_obs < 0.005] = 0.03 + return new_obs + +# assigning downbeat vs beat weights +def down_densities(observations, observation_model, state_model): + new_obs = np.zeros(state_model.num_states, float) + if len(np.shape(observation_model.pointers)) != 2: # B or N + new_obs[np.argwhere( + observation_model.pointers == 2)] = observations[1] + new_obs[np.argwhere( + observation_model.pointers == 0)] = observations[0] + elif len(np.shape(observation_model.pointers)) == 2: # G + new_obs = observation_model.pointers[0] * observations + new_obs[new_obs < 0.005] = 0.03 + return new_obs + +# assigning downbeat vs beat weights - second model +def down_densities2(observations, beats_per_bar): + new_obs = np.zeros(beats_per_bar, float) + new_obs[0] = observations[1] # downbeat activation + new_obs[1:] = observations[0] # beat activation + return new_obs + +# Inference initialization +class particle_filter_cascade: + np.random.seed(1) + PARTICLE_SIZE = 1500 # 1500 + DOWN_PARTICLE_SIZE = 250 # 250 + MIN_BPM = 55. + MAX_BPM = 215. + NUM_TEMPI = 300 + LAMBDA_B = 60 # beat transition lambda + LAMBDA_D = 0.1 # downbeat transition lambda + OBSERVATION_LAMBDA_B = "B56" # beat observation lambda + OBSERVATION_LAMBDA_D = "B56" # downbeat observation lambda + fps = 50 + T = 1 / fps + MIN_BEAT_PER_BAR = 2 + MAX_BEAT_PER_BAR = 4 + OFFSET = 0 # The point of time after which the inference model starts to work. Can be zero! + IG_THRESHOLD = 0.4 # Information Gate threshold + + def __init__(self, beats_per_bar=[], particle_size=PARTICLE_SIZE, down_particle_size=DOWN_PARTICLE_SIZE, + min_bpm=MIN_BPM, max_bpm=MAX_BPM, num_tempi=NUM_TEMPI, min_beats_per_bar=MIN_BEAT_PER_BAR, + max_beats_per_bar=MAX_BEAT_PER_BAR, offset=OFFSET, ig_threshold=IG_THRESHOLD, lambda_b=LAMBDA_B, + lambda_d=LAMBDA_D, observation_lambda_b=OBSERVATION_LAMBDA_B, observation_lambda_d=OBSERVATION_LAMBDA_D, + fps=None, plot=False, mode=None, **kwargs): + self.particle_size = particle_size + self.down_particle_size = down_particle_size + self.particle_filter = [] + self.beats_per_bar = beats_per_bar + self.fps = fps + self.Lambda_b = lambda_b + self.Lambda_d = lambda_d + self.observation_lambda_b = observation_lambda_b + self.observation_lambda_d = observation_lambda_d + self.plot = plot + self.min_beats_per_bar = min_beats_per_bar + self.max_beats_per_bar = max_beats_per_bar + self.offset = offset + self.ig_threshold = ig_threshold + self.mode = mode + # convert timing information to construct a beat state space + min_interval = 60. * fps / max_bpm + max_interval = 60. * fps / min_bpm + self.st = BarStateSpace(1, min_interval, max_interval, num_tempi) # beat tracking state space + if beats_per_bar: # if the number of beats per bar is given + self.st2 = BarStateSpace(1, min(self.beats_per_bar ), max(self.beats_per_bar), + max(self.beats_per_bar ) - min(self.beats_per_bar) + 1) # downbeat tracking state space + else: # if the number of beats per bar is not given + self.st2 = BarStateSpace(1, self.min_beats_per_bar, self.max_beats_per_bar, self.max_beats_per_bar - self.min_beats_per_bar + 1) # downbeat tracking state space + tm = BarTransitionModel(self.st, self.Lambda_b) + self.tm = list(TransitionModel.make_dense(tm.states, tm.pointers, tm.probabilities)) # beat transition model + self.om = BDObservationModel(self.st, self.observation_lambda_b) # beat observation model + self.st.last_states = list(np.concatenate(self.st.last_states).flat) # beat last states + self.om2 = BDObservationModel(self.st2, self.observation_lambda_d) # downbeat observation model + self.tm2 = np.zeros((len(self.st2.first_states[0]), len(self.st2.first_states[0]))) # downbeat transition model + for i in range(len(self.st2.first_states[0])): + for j in range(len(self.st2.first_states[0])): + if i == j: + self.tm2[i, j] = 1 - self.Lambda_d + else: + self.tm2[i, j] = self.Lambda_d / (len(self.st2.first_states[0]) - 1) + pass + self.T = 1 / self.fps + self.counter = -1 + self.path = np.zeros((1, 2), dtype=float) + + # particles initialization + self.particles = np.sort(np.random.choice(np.arange(0, self.st.num_states - 1), self.particle_size, replace=True)) + self.down_particles = np.sort(np.random.choice(np.arange(0, self.st2.num_states - 1), self.down_particle_size, replace=True)) + self.beat = np.squeeze(self.st.first_states) + + # plots initialization + if 'activations' in self.plot and (self.mode == 'stream' or self.mode == 'realtime'): + f1, self.subplot1 = plt.subplots(figsize=(100, 40), dpi=5) + self.subplot1.set_ylim([0,1]) + self.beats_activation_show = np.zeros(100) + self.downbeats_activation_show = np.zeros(100) + self.subplot1.plot(self.beats_activation_show, color='black', label='Beat Activations', linewidth=15) # Make a new line for the beat activations + self.subplot1.set_xlabel("t", size=200) + self.subplot1.set_ylabel("activations likelihood", size=200) + self.subplot1.set_title("Activations plot", size=200) + self.subplot1.plot(self.downbeats_activation_show , color='purple', label='Downbeat Activations', linewidth=15) # Make a new line for the downbeat activations + self.activation_lines = self.subplot1.get_lines() # Obtain a list of lines on the plot + + if 'beat_particles' in self.plot: + f2, self.subplot2 = plt.subplots(figsize=(30, 10), dpi=50) + self.beat_particles_show = self.subplot2.collections # setting up beat particle collections to display + position_beats = np.median(self.st.state_positions[self.particles]) + m = np.r_[True, self.particles[:-1] != self.particles[1:], True] + counts = np.diff(np.flatnonzero(m)) + unq = self.particles[m[:-1]] + part = np.c_[unq, counts] + self.subplot2.scatter(self.st.state_positions, np.max(self.st.state_intervals)-self.st.state_intervals, marker='o', color='grey', alpha=0.12) + self.subplot2.scatter(self.st.state_positions[part[:, 0]], np.max(self.st.state_intervals) - self.st.state_intervals[part[:, 0]], marker='o', s=part[:, 1] * 2, color="red") + self.subplot2.scatter(self.st.state_positions[self.om.pointers == 2], np.max(self.st.state_intervals) - self.st.state_intervals[self.om.pointers == 2], marker='o', s=50, color='yellow', alpha=0) + self.subplot2.set_xlabel("ϕ_b: Phase of the frame within the beat interval", size=20) + self.subplot2.set_ylabel("ϕ'_b: Tempo", size=20) + self.subplot2.set_title("Beat particle states", size=20) + self.beat_particles_swarm = self.subplot2.axvline(x=position_beats) # setting up beat particle average to display + + if 'downbeat_particles' in self.plot: + f3, self.subplot3 = plt.subplots(figsize=(30, 10), dpi=50) + self.downbeat_particles_show = self.subplot3.collections + m = np.bincount(self.down_particles) + self.down_max = np.argmax(m) # calculating downbeat particles clutter + position_downs = np.max(self.st2.state_positions[self.down_max]) + m1 = np.r_[True, self.down_particles[:-1] != self.down_particles[1:], True] + counts1 = np.diff(np.flatnonzero(m1)) + unq1 = self.down_particles[m1[:-1]] + part1 = np.c_[unq1, counts1] + self.subplot3.scatter(self.st2.state_positions, np.max(self.st2.state_intervals) - self.st2.state_intervals, marker='o', color='grey', alpha=0.12, s=50) + self.subplot3.scatter(self.st2.state_positions[part1[:, 0]], np.max(self.st2.state_intervals) - self.st2.state_intervals[part1[:, 0]], marker='o', s=part1[:, 1] * 4, color="red") + self.subplot3.scatter(self.st2.state_positions[self.om2.pointers == 2], np.max(self.st2.state_intervals) - self.st2.state_intervals[self.om2.pointers == 2], marker='o',s=100, color='green', alpha=0) + self.subplot3.set_xlabel("ϕ_d: Phase of the beat within the bar interval", size=20) + self.subplot3.set_ylabel("ϕ'_d: Meter", size=20) + self.subplot3.set_title("Downbeat particle states", size=20) + self.down_particles_swarm = self.subplot3.axvline(x=position_downs) # setting up downbeat particle average to display + + #plt.show(block=False) + + def process(self, activations): + + """ + Running Particle filtering over the given activation function to infer beats/downbeats. + + Parameters + ---------- + activations : numpy array, shape (num_frames, 2) + Activation function with probabilities corresponding to beats + and downbeats given in the first and second column, respectively. + + Returns + ------- + beats, downbeats : numpy array, shape (num_beats, 2) + Detected (down-)beat positions [seconds] and beat numbers. + + """ + # applying the offset and information gate thresholds + activations = activations[int(self.offset / self.T):] + if np.shape(activations)==(2,): + activations = np.reshape(activations, (-1, 2)) + both_activations = activations.copy() + activations = np.max(activations, axis=1) + activations[activations < self.ig_threshold] = 0.03 + self.activations = activations + self.both_activations = both_activations + + if 'activations' in self.plot and (self.mode == 'online' or self.mode == 'offline'): + self.activations_plot() + + for i in range(len(activations)): # loop through the provided frame/s to infer beats/downbeats + self.counter += 1 + if 'activations' in self.plot and (self.mode == 'stream' or self.mode == 'realtime'): # Ploting the activations + self.activations_plot() + gathering = int(np.median(self.particles)) # calculating beat particles clutter + # checking if the clutter is within the beat interval + if ((gathering - self.beat[self.st.state_intervals[self.beat] == self.st.state_intervals[gathering]]) < ( + int(.07 / self.T)) + 1).any() and (self.offset + self.counter * self.T) - self.path[-1][0] > .4 * self.T * \ + self.st.state_intervals[gathering]: + + # downbeat particles motion + last1 = self.down_particles[np.in1d(self.down_particles, self.st2.last_states)] + state1 = self.down_particles[~np.in1d(self.down_particles, self.st2.last_states)] + 1 + for j in range(len(last1)): + arg1 = np.argwhere(self.st2.last_states[0] == last1[j])[0][0] + nn = np.random.choice(self.st2.first_states[0], 1, p=(np.squeeze(self.tm2[arg1]))) + state1 = np.append(state1, nn) + self.down_particles = state1 + + # downbeat particles correction + if both_activations[i][1]>0.7: + self.down_particles = np.append(self.down_particles,np.array([self.st2.first_states])) + obs2 = down_densities(both_activations[i], self.om2, self.st2) + self.down_particles = universal_resample(self.down_particles, obs2[self.down_particles]) + if both_activations[i][1]>0.7: + self.down_particles = np.delete(self.down_particles, np.random.choice(self.down_particle_size, len(self.st2.first_states), replace=False)) + m = np.bincount(self.down_particles) + self.down_max = np.argmax(m) # calculating downbeat particles clutter + + # beat vs downbeat distinguishment + if self.down_max in self.st2.first_states[0] and self.path[-1][1] !=1 and both_activations[i][1]>0.4: + self.path = np.append(self.path, [[self.offset + self.counter * self.T, 1]], axis=0) + if self.mode == 'stream' or self.mode == 'realtime': + print("*beat!") + elif (activations[i]>0.4) : + self.path = np.append(self.path, [[self.offset + self.counter * self.T, 2]], axis=0) + if self.mode == 'stream' or self.mode == 'realtime': + print("beat!") + #librosa.clicks(times=None, frames=None, sr=22050, hop_length=512, click_freq=440.0, click_duration=0.1, click=None, length=None) + if 'downbeat_particles' in self.plot: + self.downbeat_particles_plot() + + # beat particles motion + last = self.particles[np.in1d(self.particles, self.st.last_states)] + state = self.particles[~np.in1d(self.particles, self.st.last_states)] + 1 + for j in range(len(last)): + args = np.argwhere(self.tm[1] == last[j]) + probs = self.tm[2][args] + nn = np.random.choice(np.squeeze(self.tm[0][args]), 1, p=(np.squeeze(probs))) + state = np.append(state, nn) + self.particles = state + + # beat particles correction + obs = beat_densities(activations[i], self.om, self.st) + if activations[i] > 0.1: # resampling is done only when there is a meaningful activation + if activations[i] > 0.8: + self.particles = np.append(self.particles,np.array([self.st.first_states[0][np.arange(np.random.randint(4),len(self.st.first_states[0]),6)]])) + self.particles = universal_resample(self.particles, obs[self.particles], ) # beat correction + if activations[i] > 0.8: + np.delete(self.particles, np.random.choice(self.particle_size, len(self.st.first_states), replace=False)) + if 'beat_particles' in self.plot: + if self.counter % 1 == 0: # choosing how often to plot + self.beat_particles_plot() + return self.path[1:] + + + def activations_plot(self): + if self.mode == 'online' or self.mode == 'offline': + f, subplot1 = plt.subplots(figsize=(30,5), dpi=100) + subplot1.set_ylim([0,1]) + subplot1.plot(self.both_activations[:,0], color='black', label='Beat Activations') # plotting beat activations + subplot1.plot(self.both_activations[:,1] , color='purple', label='Downbeat Activations') # plotting downbeat activations + plt.show() + elif self.mode == 'stream' or self.mode == 'realtime': + self.beats_activation_show = np.roll(self.beats_activation_show,1) + self.beats_activation_show[-1] = self.both_activations[0,0] + self.downbeats_activation_show = np.roll(self.downbeats_activation_show,1) + self.downbeats_activation_show[-1] = self.both_activations[0,1] + # Update the existing beat activations + self.activation_lines[0].set_ydata(self.beats_activation_show) + # Update the existing downbeat activations + self.activation_lines[1].set_ydata(self.downbeats_activation_show) + plt.pause(0.0000000001) + + + def beat_particles_plot(self): + position_beats = np.median(self.st.state_positions[self.particles]) # calculating beat clutter position + m = np.r_[True, self.particles[:-1] != self.particles[1:], True] + counts = np.diff(np.flatnonzero(m)) + unq = self.particles[m[:-1]] + part = np.c_[unq, counts] + if self.mode == 'stream' or self.mode == 'realtime': + current_activations = self.both_activations[0] + current_activation = self.activations[0] + else: + current_activations = self.both_activations[self.counter] + current_activation = self.activations[self.counter] + if current_activations [0] > current_activations[1]: + beat_color_show='yellow' + else: + beat_color_show='green' + self.beat_particles_show[1].set_offsets(np.c_[self.st.state_positions[part[:, 0]], np.max( + self.st.state_intervals) - self.st.state_intervals[part[:, 0]]]) + self.beat_particles_show[2].set_alpha(current_activation) + self.beat_particles_show[2].set_color(beat_color_show) + self.beat_particles_swarm.set_xdata(x=position_beats) + plt.pause(0.000000001) + + def downbeat_particles_plot(self): + m1 = np.r_[True, self.down_particles[:-1] != self.down_particles[1:], True] + counts1 = np.diff(np.flatnonzero(m1)) + unq1 = self.down_particles[m1[:-1]] + part1 = np.c_[unq1, counts1] + position_downs = np.max(self.st2.state_positions[self.down_max]) + if self.mode == 'stream' or self.mode == 'realtime': + current_activations = self.both_activations[0] + else: + current_activations = self.both_activations[self.counter] + self.downbeat_particles_show[1].set_offsets(np.c_[self.st2.state_positions[part1[:, 0]], np.max(self.st2.state_intervals) - self.st2.state_intervals[part1[:, 0]]]) + self.downbeat_particles_show[2].set_alpha(current_activations[1]) + self.down_particles_swarm.set_xdata(x=position_downs) + plt.pause(0.0000000001) + + + +def universal_resample_original(particles, weights): # state_space + new_particles = [] + J = len(particles) + weights = weights / sum(weights) + r = np.random.uniform(0, 1 / J) + i = 0 + c = weights[0] + for j in range(J): + U = r + j * (1 / J) + while U > c: + i += 1 + c += weights[i] + new_particles = np.append(new_particles, particles[i]) + new_particles = new_particles.astype(int) + return new_particles + +# The following resampling method is optimized and is faster than the original BeatNet resampling +def universal_resample(particles, weights): + J = len(particles) + weights = weights / sum(weights) + cumsum_weights = np.cumsum(weights) + r = np.random.uniform(0, 1 / J, J) + U = r + np.arange(J) * (1 / J) + new_particles = particles[np.searchsorted(cumsum_weights, U)] + return new_particles + + +def systematic_resample(particles, weights): + N = len(weights) + # make N subdivisions, choose positions + # with a consistent random offset + positions = (np.random.randint(0, N) + np.arange(N)) / N + + indexes = np.zeros(N, 'i') + cumulative_sum = np.cumsum(weights) + i, j = 0, 0 + while i < N & j < N: + if positions[i] < cumulative_sum[j]: + indexes[i] = j + i += 1 + else: + j += 1 + return particles[indexes] + + +def stratified_resample(particles, weights): + N = len(weights) + # make N subdivisions, chose a random position within each one + positions = (np.random.randint(0, N) + np.arange(N)) / N + + indexes = np.zeros(N, 'i') + cumulative_sum = np.cumsum(weights) + i, j = 0, 0 + while i < N & j < N: + if positions[i] < cumulative_sum[j]: + indexes[i] = j + i += 1 + else: + j += 1 + return particles[indexes] \ No newline at end of file From a84ebb233178b79386a9d55ca21dea3deec36b57 Mon Sep 17 00:00:00 2001 From: kobakos Date: Wed, 22 May 2024 18:04:10 +0900 Subject: [PATCH 2/5] add madmom --- audio_processing/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/audio_processing/requirements.txt b/audio_processing/requirements.txt index 2a403208a..0f63d292c 100644 --- a/audio_processing/requirements.txt +++ b/audio_processing/requirements.txt @@ -3,3 +3,4 @@ SoundFile librosa torch pyaudio +madmom \ No newline at end of file From 9c164e1729c4f36f4997fc8a31143a5396d3e2c0 Mon Sep 17 00:00:00 2001 From: Koki <53651931+kobakos@users.noreply.github.com> Date: Fri, 9 Aug 2024 14:58:23 +0900 Subject: [PATCH 3/5] Update beatnet.py Fix parser explanation and typo --- audio_processing/beatnet/beatnet.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/audio_processing/beatnet/beatnet.py b/audio_processing/beatnet/beatnet.py index adf386a8f..f83408394 100644 --- a/audio_processing/beatnet/beatnet.py +++ b/audio_processing/beatnet/beatnet.py @@ -47,7 +47,7 @@ # Arguemnt Parser Config # ====================== parser = get_base_parser( - 'Ego2Hands: Egocentric Two-hand Segmentation and Detection', + 'BeatNet: CRNN and Particle Filtering for Online Joint Beat Downbeat and Meter Tracking', DEFAULT_INPUT_PATH, None ) @@ -64,7 +64,7 @@ # ====================== # From https://github.com/mjhydri/BeatNet/blob/main/src/BeatNet/log_spect.py -# imports were modified to not require BeatNet(pip module) +# Imports were modified to not require BeatNet(pip module) # Author: Mojtaba Heydari @@ -78,7 +78,7 @@ from madmom.processors import ParallelProcessor, SequentialProcessor -# feature extractor that extracts magnitude spectrogoram and its differences +# feature extractor that extracts magnitude spectrogram and its differences class LOG_SPECT(FeatureModule): def __init__(self, num_channels=1, sample_rate=22050, win_length=2048, hop_size=512, n_bands=[12], mode='online'): @@ -102,7 +102,7 @@ def __init__(self, num_channels=1, sample_rate=22050, win_length=2048, hop_size= diff_ratio=0.5, positive_diffs=True, stack_diffs=np.hstack) # process each frame size with spec and diff sequentially multi.append(SequentialProcessor((frames, stft, filt, spec, diff))) - # stack the features and processes everything sequentially + # stack the features and process everything sequentially self.pipe = SequentialProcessor((sig, multi, np.hstack)) def process_audio(self, audio): @@ -131,10 +131,10 @@ class BeatNet: Parameters ---------- Inputs: - model: An scalar in the range [1,3] to select which pre-trained CRNN models to utilize. - mode: An string to determine the working mode. i.e. 'stream', 'realtime', 'online' and ''offline. - 'stream' mode: Uses the system microphone to capture sound and does the process in real-time. Due to training the model on standard mastered songs, it is highly recommended to make sure the microphone sound is as loud as possible. Less reverbrations leads to the better results. - 'Realtime' mode: Reads an audio file chunk by chunk, and processes each chunck at the time. + model: A scalar in the range [1,3] to select which pre-trained CRNN models to utilize. + mode: A string to determine the working mode. i.e. 'stream', 'realtime', 'online', and ''offline. + 'stream' mode: Uses the system microphone to capture sound and does the process in real time. Due to training the model on standard mastered songs, it is highly recommended to make sure the microphone sound is as loud as possible. Less reverbrations leads to the better results. + 'Realtime' mode: Reads an audio file chunk by chunk, and processes each chunk at the time. 'Online' mode: Reads the whole audio and feeds it into the BeatNet CRNN at the same time and then infers the parameters on interest using particle filtering. 'offline' mode: Reads the whole audio and feeds it into the BeatNet CRNN at the same time and then inferes the parameters on interest using madmom dynamic Bayesian network. This method is quicker that madmom beat/downbeat tracking. inference model: A string to choose the inference approach. i.e. 'PF' standing for Particle Filtering for causal inferences and 'DBN' standing for Dynamic Bayesian Network for non-causal usages. @@ -143,7 +143,7 @@ class BeatNet: 'beat_particles': Plots beat/tempo tracking state space and current particle states at each time frame. 'downbeat_particles': Plots the downbeat/meter tracking state space and current particle states at each time frame. Note that to speedup plotting the figures, rather than new plots per frame, the previous plots get updated. However, to secure realtime results, it is recommended to not plot or have as less number of plots as possible at the time. - threading: To decide whether accomplish the inference at the main thread or another thread. + threading: To decide whether to accomplish the inference at the main thread or another thread. device: type of dvice. cpu or cuda:i Outputs: @@ -273,4 +273,4 @@ def main(): if __name__ == '__main__': - main() \ No newline at end of file + main() From fa59c37df4f0d80411c4572500387a40bb5ba982 Mon Sep 17 00:00:00 2001 From: Kazuki Kyakuno Date: Sat, 10 Aug 2024 20:39:18 +0900 Subject: [PATCH 4/5] Update readme --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index c1eeeab70..fee1f143e 100644 --- a/README.md +++ b/README.md @@ -73,14 +73,11 @@ The collection of pre-trained, state-of-the-art AI models. | [audioset_tagging_cnn](/audio_processing/audioset_tagging_cnn/) | [PANNs: Large-Scale Pretrained Audio Neural Networks for Audio Pattern Recognition](https://github.com/qiuqiangkong/audioset_tagging_cnn) | Pytorch | 1.2.9 and later | | | [deep music enhancer](/audio_processing/deep-music-enhancer/) | [On Filter Generalization for Music Bandwidth Extension Using Deep Neural Networks](https://github.com/serkansulun/deep-music-enhancer) | Pytorch | 1.2.6 and later | | | [pyannote-audio](/audio_processing/pyannote-audio/) | [Pyannote-audio](https://github.com/pyannote/pyannote-audio) | Pytorch | 1.2.15 and later | [JP](https://medium.com/axinc/pyannoteaudio-%E8%A9%B1%E8%80%85%E5%88%86%E9%9B%A2%E3%82%92%E8%A1%8C%E3%81%86%E3%81%9F%E3%82%81%E3%81%AE%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%A2%E3%83%87%E3%83%AB-fca61f4ef5d0) | -<<<<<<< HEAD -| [beatnet](/audio_processing/beatnet/) | [BeatNet: CRNN and Particle Filtering for Online Joint Beat Downbeat and Meter Tracking](https://github.com/mjhydri/BeatNet) | Pytorch | 1.2.16 and later | | -======= | [kotoba-whisper](/audio_processing/kotoba-whisper/) | [kotoba-whisper](https://huggingface.co/kotoba-tech/kotoba-whisper-v1.0) | Pytorch | 1.2.16 and later | | | [reazon_speech](/audio_processing/reazon_speech/) | [ReazonSpeech](https://research.reazon.jp/projects/ReazonSpeech/) | Pytorch | 1.4.0 and later | | | [reazon_speech2](/audio_processing/reazon_speech2/) | [ReazonSpeech2](https://research.reazon.jp/projects/ReazonSpeech/) | Pytorch | 1.4.0 and later | | | [gpt-sovits](/audio_processing/gpt-sovits/) | [GPT-SoVITS](https://github.com/RVC-Boss/GPT-SoVITS) | Pytorch | 1.4.0 and later | [JP](https://medium.com/axinc/gpt-sovits-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%B3%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%A7%E3%81%8D%E3%82%8B0%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%E3%81%AE%E9%9F%B3%E5%A3%B0%E5%90%88%E6%88%90%E3%83%A2%E3%83%87%E3%83%AB-2212eeb5ad20) | ->>>>>>> master +| [beatnet](/audio_processing/beatnet/) | [BeatNet: CRNN and Particle Filtering for Online Joint Beat Downbeat and Meter Tracking](https://github.com/mjhydri/BeatNet) | Pytorch | 1.2.16 and later | | ## Background removal From a4b852c322b1fa4de42dbc9e9adba9a545acb294 Mon Sep 17 00:00:00 2001 From: Kazuki Kyakuno Date: Sat, 10 Aug 2024 20:40:47 +0900 Subject: [PATCH 5/5] Add license --- audio_processing/beatnet/LICENSE | 395 +++++++++++++++++++++++++++++++ scripts/download_all_models.sh | 1 + 2 files changed, 396 insertions(+) create mode 100644 audio_processing/beatnet/LICENSE diff --git a/audio_processing/beatnet/LICENSE b/audio_processing/beatnet/LICENSE new file mode 100644 index 000000000..2f244ac81 --- /dev/null +++ b/audio_processing/beatnet/LICENSE @@ -0,0 +1,395 @@ +Attribution 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More_considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution 4.0 International Public License ("Public License"). To the +extent this Public License may be interpreted as a contract, You are +granted the Licensed Rights in consideration of Your acceptance of +these terms and conditions, and the Licensor grants You such rights in +consideration of benefits the Licensor receives from making the +Licensed Material available under these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + d. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + e. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + f. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + g. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + h. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + i. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's + License You apply must not prevent recipients of the Adapted + Material from complying with this Public License. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/scripts/download_all_models.sh b/scripts/download_all_models.sh index 76821420e..ad502babd 100755 --- a/scripts/download_all_models.sh +++ b/scripts/download_all_models.sh @@ -37,6 +37,7 @@ cd ../../audio_processing/kotoba-whisper/; python3 kotoba-whisper.py ${OPTION} cd ../../audio_processing/reazon_speech/; python3 reazon_speech.py ${OPTION} cd ../../audio_processing/reazon_speech2/; python3 reazon_speech2.py ${OPTION} cd ../../audio_processing/gpt-sovits/; python3 gpt-sovits.py ${OPTION} +cd ../../audio_processing/beatnet/; python3 beatnet.py ${OPTION} cd ../../background_ramoval/deep-image-matting; python3 deep-image-matting.py ${OPTION} cd ../../background_ramoval/u2net; python3 u2net.py ${OPTION} cd ../../background_ramoval/u2net; python3 u2net.py -a small ${OPTION}