sonusai 0.20.3__py3-none-any.whl → 1.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. sonusai/__init__.py +16 -3
  2. sonusai/audiofe.py +240 -76
  3. sonusai/calc_metric_spenh.py +71 -73
  4. sonusai/config/__init__.py +3 -0
  5. sonusai/config/config.py +61 -0
  6. sonusai/config/config.yml +20 -0
  7. sonusai/config/constants.py +8 -0
  8. sonusai/constants.py +11 -0
  9. sonusai/data/genmixdb.yml +21 -36
  10. sonusai/{mixture/datatypes.py → datatypes.py} +91 -130
  11. sonusai/deprecated/plot.py +4 -5
  12. sonusai/doc/doc.py +4 -4
  13. sonusai/doc.py +11 -4
  14. sonusai/genft.py +43 -45
  15. sonusai/genmetrics.py +23 -19
  16. sonusai/genmix.py +54 -82
  17. sonusai/genmixdb.py +88 -264
  18. sonusai/ir_metric.py +30 -34
  19. sonusai/lsdb.py +41 -48
  20. sonusai/main.py +15 -22
  21. sonusai/metrics/calc_audio_stats.py +4 -293
  22. sonusai/metrics/calc_class_weights.py +4 -4
  23. sonusai/metrics/calc_optimal_thresholds.py +8 -5
  24. sonusai/metrics/calc_pesq.py +2 -2
  25. sonusai/metrics/calc_segsnr_f.py +4 -4
  26. sonusai/metrics/calc_speech.py +25 -13
  27. sonusai/metrics/class_summary.py +7 -7
  28. sonusai/metrics/confusion_matrix_summary.py +5 -5
  29. sonusai/metrics/one_hot.py +4 -4
  30. sonusai/metrics/snr_summary.py +7 -7
  31. sonusai/metrics_summary.py +38 -45
  32. sonusai/mixture/__init__.py +5 -104
  33. sonusai/mixture/audio.py +10 -39
  34. sonusai/mixture/class_balancing.py +103 -0
  35. sonusai/mixture/config.py +251 -271
  36. sonusai/mixture/constants.py +35 -39
  37. sonusai/mixture/data_io.py +25 -36
  38. sonusai/mixture/db_datatypes.py +58 -22
  39. sonusai/mixture/effects.py +386 -0
  40. sonusai/mixture/feature.py +7 -11
  41. sonusai/mixture/generation.py +484 -611
  42. sonusai/mixture/helpers.py +82 -184
  43. sonusai/mixture/ir_delay.py +3 -4
  44. sonusai/mixture/ir_effects.py +77 -0
  45. sonusai/mixture/log_duration_and_sizes.py +6 -12
  46. sonusai/mixture/mixdb.py +931 -669
  47. sonusai/mixture/pad_audio.py +35 -0
  48. sonusai/mixture/resample.py +7 -0
  49. sonusai/mixture/sox_effects.py +195 -0
  50. sonusai/mixture/sox_help.py +650 -0
  51. sonusai/mixture/spectral_mask.py +2 -2
  52. sonusai/mixture/truth.py +17 -15
  53. sonusai/mixture/truth_functions/crm.py +12 -12
  54. sonusai/mixture/truth_functions/energy.py +22 -22
  55. sonusai/mixture/truth_functions/file.py +5 -5
  56. sonusai/mixture/truth_functions/metadata.py +4 -4
  57. sonusai/mixture/truth_functions/metrics.py +4 -4
  58. sonusai/mixture/truth_functions/phoneme.py +3 -3
  59. sonusai/mixture/truth_functions/sed.py +11 -13
  60. sonusai/mixture/truth_functions/target.py +10 -10
  61. sonusai/mkwav.py +26 -29
  62. sonusai/onnx_predict.py +240 -88
  63. sonusai/queries/__init__.py +2 -2
  64. sonusai/queries/queries.py +38 -34
  65. sonusai/speech/librispeech.py +1 -1
  66. sonusai/speech/mcgill.py +1 -1
  67. sonusai/speech/timit.py +2 -2
  68. sonusai/summarize_metric_spenh.py +10 -17
  69. sonusai/utils/__init__.py +7 -1
  70. sonusai/utils/asl_p56.py +2 -2
  71. sonusai/utils/asr.py +2 -2
  72. sonusai/utils/asr_functions/aaware_whisper.py +4 -5
  73. sonusai/utils/choice.py +31 -0
  74. sonusai/utils/compress.py +1 -1
  75. sonusai/utils/dataclass_from_dict.py +19 -1
  76. sonusai/utils/energy_f.py +3 -3
  77. sonusai/utils/evaluate_random_rule.py +15 -0
  78. sonusai/utils/keyboard_interrupt.py +12 -0
  79. sonusai/utils/onnx_utils.py +3 -17
  80. sonusai/utils/print_mixture_details.py +21 -19
  81. sonusai/utils/{temp_seed.py → rand.py} +3 -3
  82. sonusai/utils/read_predict_data.py +2 -2
  83. sonusai/utils/reshape.py +3 -3
  84. sonusai/utils/stratified_shuffle_split.py +3 -3
  85. sonusai/{mixture → utils}/tokenized_shell_vars.py +1 -1
  86. sonusai/utils/write_audio.py +2 -2
  87. sonusai/vars.py +11 -4
  88. {sonusai-0.20.3.dist-info → sonusai-1.0.1.dist-info}/METADATA +4 -2
  89. sonusai-1.0.1.dist-info/RECORD +138 -0
  90. sonusai/mixture/augmentation.py +0 -444
  91. sonusai/mixture/class_count.py +0 -15
  92. sonusai/mixture/eq_rule_is_valid.py +0 -45
  93. sonusai/mixture/target_class_balancing.py +0 -107
  94. sonusai/mixture/targets.py +0 -175
  95. sonusai-0.20.3.dist-info/RECORD +0 -128
  96. {sonusai-0.20.3.dist-info → sonusai-1.0.1.dist-info}/WHEEL +0 -0
  97. {sonusai-0.20.3.dist-info → sonusai-1.0.1.dist-info}/entry_points.txt +0 -0
sonusai/utils/__init__.py CHANGED
@@ -12,6 +12,8 @@ from .audio_devices import get_input_devices
12
12
  from .braced_glob import braced_glob
13
13
  from .braced_glob import braced_iglob
14
14
  from .calculate_input_shape import calculate_input_shape
15
+ from .choice import RandomChoice
16
+ from .choice import SequentialChoice
15
17
  from .compress import power_compress
16
18
  from .compress import power_uncompress
17
19
  from .convert_string_to_number import convert_string_to_number
@@ -24,10 +26,12 @@ from .docstring import add_commands_to_docstring
24
26
  from .docstring import trim_docstring
25
27
  from .energy_f import compute_energy_f
26
28
  from .engineering_number import EngineeringNumber
29
+ from .evaluate_random_rule import evaluate_random_rule
27
30
  from .get_frames_per_batch import get_frames_per_batch
28
31
  from .get_label_names import get_label_names
29
32
  from .grouper import grouper
30
33
  from .human_readable_size import human_readable_size
34
+ from .keyboard_interrupt import register_keyboard_interrupt
31
35
  from .load_object import load_object
32
36
  from .max_text_width import max_text_width
33
37
  from .model_utils import import_module
@@ -41,6 +45,7 @@ from .parallel import track
41
45
  from .path_info import PathInfo
42
46
  from .print_mixture_details import print_class_count
43
47
  from .print_mixture_details import print_mixture_details
48
+ from .rand import seed_context
44
49
  from .ranges import consolidate_range
45
50
  from .ranges import expand_range
46
51
  from .read_predict_data import read_predict_data
@@ -54,6 +59,7 @@ from .stacked_complex import stacked_complex_imag
54
59
  from .stacked_complex import stacked_complex_real
55
60
  from .stacked_complex import unstack_complex
56
61
  from .stratified_shuffle_split import stratified_shuffle_split_mixid
57
- from .temp_seed import temp_seed
62
+ from .tokenized_shell_vars import tokenized_expand
63
+ from .tokenized_shell_vars import tokenized_replace
58
64
  from .write_audio import write_audio
59
65
  from .yes_or_no import yes_or_no
sonusai/utils/asl_p56.py CHANGED
@@ -1,4 +1,4 @@
1
- from sonusai.mixture import AudioT
1
+ from ..datatypes import AudioT
2
2
 
3
3
 
4
4
  def asl_p56(audio: AudioT) -> float:
@@ -9,7 +9,7 @@ def asl_p56(audio: AudioT) -> float:
9
9
  import numpy as np
10
10
  import scipy.signal as signal
11
11
 
12
- from sonusai.mixture import SAMPLE_RATE
12
+ from ..constants import SAMPLE_RATE
13
13
 
14
14
  eps = np.finfo(np.float32).eps
15
15
 
sonusai/utils/asr.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from collections.abc import Callable
2
2
  from dataclasses import dataclass
3
3
 
4
- from sonusai.mixture import AudioT
4
+ from ..datatypes import AudioT
5
5
 
6
6
 
7
7
  @dataclass(frozen=True)
@@ -62,7 +62,7 @@ def calc_asr(audio: AudioT | str, engine: str, **config) -> ASRResult:
62
62
 
63
63
  import numpy as np
64
64
 
65
- from sonusai.mixture import read_audio
65
+ from ..mixture.audio import read_audio
66
66
 
67
67
  if not isinstance(audio, np.ndarray):
68
68
  audio = copy(read_audio(audio, config.get("use_cache", True)))
@@ -1,5 +1,5 @@
1
- from sonusai.mixture import AudioT
2
- from sonusai.utils import ASRResult
1
+ from ...datatypes import AudioT
2
+ from ..asr import ASRResult
3
3
 
4
4
 
5
5
  def aaware_whisper_validate(**_config) -> None:
@@ -14,9 +14,8 @@ def aaware_whisper(audio: AudioT, **_config) -> ASRResult:
14
14
 
15
15
  import requests
16
16
 
17
- from sonusai.utils import ASRResult
18
- from sonusai.utils import float_to_int16
19
- from sonusai.utils import write_audio
17
+ from ..numeric_conversion import float_to_int16
18
+ from ..write_audio import write_audio
20
19
 
21
20
  url = getenv("AAWARE_WHISPER_URL")
22
21
  if url is None:
@@ -0,0 +1,31 @@
1
+ from typing import Any
2
+
3
+
4
+ class RandomChoice:
5
+ def __init__(self, data: list, repetition: bool = False):
6
+ self.data = data
7
+ self.repeat = repetition
8
+ self.choices: list = []
9
+
10
+ def next(self) -> Any:
11
+ from random import choice
12
+ from random import sample
13
+
14
+ if self.repeat:
15
+ return choice(self.data) # noqa: S311
16
+
17
+ if not self.choices:
18
+ self.choices = sample(self.data, len(self.data))
19
+
20
+ return self.choices.pop()
21
+
22
+
23
+ class SequentialChoice:
24
+ def __init__(self, data: list):
25
+ self.data = data
26
+ self.choices: list = []
27
+
28
+ def next(self) -> Any:
29
+ if not self.choices:
30
+ self.choices = self.data.copy()
31
+ return self.choices.pop()
sonusai/utils/compress.py CHANGED
@@ -1,4 +1,4 @@
1
- from sonusai.mixture import AudioF
1
+ from ..datatypes import AudioF
2
2
 
3
3
 
4
4
  def power_compress(feature: AudioF) -> AudioF:
@@ -1,4 +1,22 @@
1
- def dataclass_from_dict(klass, dikt):
1
+ from collections.abc import Sequence
2
+ from typing import Any
3
+
4
+
5
+ def dataclass_from_dict(klass, dikt: dict) -> Any:
6
+ """Convert dictionary to dataclass."""
7
+ try:
8
+ field_types = klass.__annotations__
9
+ return klass(**{f: dataclass_from_dict(field_types[f], dikt[f]) for f in dikt})
10
+ except AttributeError:
11
+ return dikt
12
+
13
+
14
+ def list_dataclass_from_dict(klass, dikt: Sequence[dict]) -> list[Any]:
15
+ """Convert list of dictionary to list of dataclass."""
16
+ return [dataclass_from_dict(klass.__args__[0], f) for f in dikt]
17
+
18
+
19
+ def original_dataclass_from_dict(klass, dikt):
2
20
  """Convert dictionary to dataclass."""
3
21
  try:
4
22
  field_types = klass.__annotations__
sonusai/utils/energy_f.py CHANGED
@@ -1,8 +1,8 @@
1
1
  from pyaaware import ForwardTransform
2
2
 
3
- from sonusai.mixture import AudioF
4
- from sonusai.mixture import AudioT
5
- from sonusai.mixture import EnergyF
3
+ from ..datatypes import AudioF
4
+ from ..datatypes import AudioT
5
+ from ..datatypes import EnergyF
6
6
 
7
7
 
8
8
  def compute_energy_f(
@@ -0,0 +1,15 @@
1
+ def evaluate_random_rule(rule: str) -> str | float:
2
+ """Evaluate 'rand' directive
3
+
4
+ :param rule: Rule
5
+ :return: Resolved value
6
+ """
7
+ import re
8
+ from random import uniform
9
+
10
+ rand_pattern = re.compile(r"rand\(([-+]?(\d+(\.\d*)?|\.\d+)),\s*([-+]?(\d+(\.\d*)?|\.\d+))\)")
11
+
12
+ def rand_repl(m):
13
+ return f"{uniform(float(m.group(1)), float(m.group(4))):.2f}" # noqa: S311
14
+
15
+ return eval(re.sub(rand_pattern, rand_repl, rule)) # noqa: S307
@@ -0,0 +1,12 @@
1
+ def register_keyboard_interrupt() -> None:
2
+ import signal
3
+
4
+ def signal_handler(_sig, _frame):
5
+ import sys
6
+
7
+ from sonusai import logger
8
+
9
+ logger.info("Canceled due to keyboard interrupt")
10
+ sys.exit(1)
11
+
12
+ signal.signal(signal.SIGINT, signal_handler)
@@ -6,14 +6,7 @@ from onnxruntime import InferenceSession
6
6
  from onnxruntime import NodeArg # pyright: ignore [reportAttributeAccessIssue]
7
7
  from onnxruntime import SessionOptions # pyright: ignore [reportAttributeAccessIssue]
8
8
 
9
- REQUIRED_HPARAMS = (
10
- "feature",
11
- "batch_size",
12
- "timesteps",
13
- "flatten",
14
- "add1ch",
15
- "truth_mutex",
16
- )
9
+ REQUIRED_HPARAMS = ("feature", "batch_size", "timesteps")
17
10
 
18
11
 
19
12
  def _extract_shapes(io: list[ValueInfoProto]) -> list[list[int] | str]:
@@ -45,9 +38,7 @@ def _extract_shapes(io: list[ValueInfoProto]) -> list[list[int] | str]:
45
38
  return shapes
46
39
 
47
40
 
48
- def get_and_check_inputs(
49
- model: ModelProto,
50
- ) -> tuple[list[ValueInfoProto], list[list[int] | str]]:
41
+ def get_and_check_inputs(model: ModelProto) -> tuple[list[ValueInfoProto], list[list[int] | str]]:
51
42
  from sonusai import logger
52
43
 
53
44
  # ignore initializer inputs (only seen in older ONNX < v1.5)
@@ -63,9 +54,7 @@ def get_and_check_inputs(
63
54
  return inputs, shapes
64
55
 
65
56
 
66
- def get_and_check_outputs(
67
- model: ModelProto,
68
- ) -> tuple[list[ValueInfoProto], list[list[int] | str]]:
57
+ def get_and_check_outputs(model: ModelProto) -> tuple[list[ValueInfoProto], list[list[int] | str]]:
69
58
  from sonusai import logger
70
59
 
71
60
  outputs = list(model.graph.output)
@@ -88,9 +77,6 @@ def add_sonusai_metadata(model: ModelProto, hparams: dict) -> ModelProto:
88
77
  feature: Model feature type
89
78
  batch_size: Model batch size
90
79
  timesteps: Size of timestep dimension (0 for no dimension)
91
- flatten: Model input feature data is flattened (stride + bins combined)
92
- add1ch: Model input has channel dimension
93
- truth_mutex: Model label output is mutually exclusive
94
80
  """
95
81
  from sonusai import logger
96
82
 
@@ -1,7 +1,7 @@
1
1
  from collections.abc import Callable
2
2
 
3
- from sonusai.mixture import ClassCount
4
- from sonusai.mixture import MixtureDatabase
3
+ from ..datatypes import ClassCount
4
+ from ..mixture.mixdb import MixtureDatabase
5
5
 
6
6
 
7
7
  def print_mixture_details(
@@ -12,8 +12,8 @@ def print_mixture_details(
12
12
  ) -> None:
13
13
  import numpy as np
14
14
 
15
- from sonusai.mixture import SAMPLE_RATE
16
- from sonusai.utils import seconds_to_hms
15
+ from ..constants import SAMPLE_RATE
16
+ from ..utils.seconds_to_hms import seconds_to_hms
17
17
 
18
18
  if mixid is not None:
19
19
  if 0 < mixid >= mixdb.num_mixtures:
@@ -26,23 +26,25 @@ def print_mixture_details(
26
26
  noise_file = mixdb.noise_file(mixture.noise.file_id)
27
27
  for t_idx, target_file in enumerate(target_files):
28
28
  print_fn(f" Target {t_idx}")
29
- print_fn(f'{" Name":{desc_len}} {target_file.name}')
30
- print_fn(f'{" Duration":{desc_len}} {seconds_to_hms(target_file.duration)}')
29
+ print_fn(f"{' Name':{desc_len}} {target_file.name}")
30
+ print_fn(f"{' Duration':{desc_len}} {seconds_to_hms(target_file.duration)}")
31
31
  for truth_name, truth_config in target_file.truth_configs.items():
32
32
  print_fn(f" Truth config: '{truth_name}'")
33
- print_fn(f'{" Function":{desc_len}} {truth_config.function}')
34
- print_fn(f'{" Stride reduction":{desc_len}} {truth_config.stride_reduction}')
35
- print_fn(f'{" Config":{desc_len}} {truth_config.config}')
36
- print_fn(f'{" Augmentation":{desc_len}} {target_augmentations[t_idx]}')
37
- print_fn(f'{" Samples":{desc_len}} {mixture.samples}')
38
- print_fn(f'{" Feature frames":{desc_len}} {mixdb.mixture_feature_frames(mixid)}')
39
- print_fn(f'{" Noise file":{desc_len}} {noise_file.name}')
33
+ print_fn(f"{' Function':{desc_len}} {truth_config.function}")
34
+ print_fn(f"{' Stride reduction':{desc_len}} {truth_config.stride_reduction}")
35
+ print_fn(f"{' Config':{desc_len}} {truth_config.config}")
36
+ print_fn(f"{' Augmentation':{desc_len}} {target_augmentations[t_idx]}")
37
+ print_fn(f"{' Samples':{desc_len}} {mixture.samples}")
38
+ print_fn(f"{' Feature frames':{desc_len}} {mixdb.mixture_feature_frames(mixid)}")
39
+ print_fn(f"{' Noise file':{desc_len}} {noise_file.name}")
40
40
  noise_offset_percent = int(np.round(100 * mixture.noise_offset / float(noise_file.duration * SAMPLE_RATE)))
41
- print_fn(f'{" Noise offset":{desc_len}} {mixture.noise_offset} samples ({noise_offset_percent}%)')
42
- print_fn(f'{" SNR":{desc_len}} {mixture.snr} dB{" (random)" if mixture.snr.is_random else ""}')
43
- print_fn(f'{" Target gain":{desc_len}} {[target.gain if not mixture.is_noise_only else 0 for target in mixture.targets]}')
44
- print_fn(f'{" Target SNR gain":{desc_len}} {mixture.target_snr_gain}')
45
- print_fn(f'{" Noise SNR gain":{desc_len}} {mixture.noise_snr_gain}')
41
+ print_fn(f"{' Noise offset':{desc_len}} {mixture.noise_offset} samples ({noise_offset_percent}%)")
42
+ print_fn(f"{' SNR':{desc_len}} {mixture.snr} dB{' (random)' if mixture.snr.is_random else ''}")
43
+ print_fn(
44
+ f"{' Target gain':{desc_len}} {[target.gain if not mixture.is_noise_only else 0 for target in mixture.targets]}"
45
+ )
46
+ print_fn(f"{' Target SNR gain':{desc_len}} {mixture.target_snr_gain}")
47
+ print_fn(f"{' Noise SNR gain':{desc_len}} {mixture.noise_snr_gain}")
46
48
  print_fn("")
47
49
 
48
50
 
@@ -52,7 +54,7 @@ def print_class_count(
52
54
  print_fn: Callable = print,
53
55
  all_class_counts: bool = False,
54
56
  ) -> None:
55
- from sonusai.utils import max_text_width
57
+ from ..utils.max_text_width import max_text_width
56
58
 
57
59
  print_fn("Class count:")
58
60
  idx_len = max_text_width(len(class_count))
@@ -1,10 +1,10 @@
1
1
  import contextlib
2
2
 
3
- import numpy as np
4
-
5
3
 
6
4
  @contextlib.contextmanager
7
- def temp_seed(seed):
5
+ def seed_context(seed):
6
+ import numpy as np
7
+
8
8
  state = np.random.get_state()
9
9
  np.random.seed(seed)
10
10
  try:
@@ -1,13 +1,13 @@
1
1
  import numpy as np
2
2
 
3
- from sonusai.mixture.datatypes import Predict
3
+ from ..datatypes import Predict
4
4
 
5
5
 
6
6
  def read_predict_data(filename: str) -> Predict:
7
7
  """Read predict data from given HDF5 file and return it."""
8
8
  import h5py
9
9
 
10
- from sonusai import logger
10
+ from .. import logger
11
11
 
12
12
  logger.debug(f"Reading prediction data from {filename}")
13
13
  with h5py.File(filename, "r") as f:
sonusai/utils/reshape.py CHANGED
@@ -1,8 +1,8 @@
1
1
  import numpy as np
2
2
 
3
- from sonusai.mixture.datatypes import Feature
4
- from sonusai.mixture.datatypes import Predict
5
- from sonusai.mixture.datatypes import Truth
3
+ from ..datatypes import Feature
4
+ from ..datatypes import Predict
5
+ from ..datatypes import Truth
6
6
 
7
7
 
8
8
  def get_input_shape(feature: Feature) -> tuple[int, ...]:
@@ -1,6 +1,6 @@
1
1
  import numpy as np
2
2
 
3
- from sonusai.mixture import MixtureDatabase
3
+ from ..mixture.mixdb import MixtureDatabase
4
4
 
5
5
 
6
6
  def stratified_shuffle_split_mixid(
@@ -35,8 +35,8 @@ def stratified_shuffle_split_mixid(
35
35
  import random
36
36
  from copy import deepcopy
37
37
 
38
- from sonusai import logger
39
- from sonusai.mixture import get_class_count_from_mixids
38
+ from .. import logger
39
+ from ..mixture.class_count import get_class_count_from_mixids
40
40
 
41
41
  if vsplit < 0 or vsplit > 1:
42
42
  raise ValueError("vsplit must be between 0 and 1")
@@ -21,7 +21,7 @@ def tokenized_expand(name: str | bytes | Path) -> tuple[str, dict[str, str]]:
21
21
  import os
22
22
  import string
23
23
 
24
- from .constants import DEFAULT_NOISE
24
+ from ..constants import DEFAULT_NOISE
25
25
 
26
26
  os.environ["default_noise"] = str(DEFAULT_NOISE) # noqa: SIM112
27
27
 
@@ -1,5 +1,5 @@
1
- from sonusai.mixture.constants import SAMPLE_RATE
2
- from sonusai.mixture.datatypes import AudioT
1
+ from ..constants import SAMPLE_RATE
2
+ from ..datatypes import AudioT
3
3
 
4
4
 
5
5
  def write_audio(name: str, audio: AudioT, sample_rate: int = SAMPLE_RATE) -> None:
sonusai/vars.py CHANGED
@@ -13,15 +13,15 @@ List custom SonusAI variables.
13
13
  def main() -> None:
14
14
  from docopt import docopt
15
15
 
16
- import sonusai
16
+ from sonusai import __version__ as sai_version
17
17
  from sonusai.utils import trim_docstring
18
18
 
19
- docopt(trim_docstring(__doc__), version=sonusai.__version__, options_first=True)
19
+ docopt(trim_docstring(__doc__), version=sai_version, options_first=True)
20
20
 
21
21
  from os import environ
22
22
  from os import getenv
23
23
 
24
- from sonusai.mixture import DEFAULT_NOISE
24
+ from sonusai.constants import DEFAULT_NOISE
25
25
 
26
26
  print("Custom SonusAI variables:")
27
27
  print("")
@@ -37,4 +37,11 @@ def main() -> None:
37
37
 
38
38
 
39
39
  if __name__ == "__main__":
40
- main()
40
+ from sonusai import exception_handler
41
+ from sonusai.utils import register_keyboard_interrupt
42
+
43
+ register_keyboard_interrupt()
44
+ try:
45
+ main()
46
+ except Exception as e:
47
+ exception_handler(e)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: sonusai
3
- Version: 0.20.3
3
+ Version: 1.0.1
4
4
  Summary: Framework for building deep neural network models for sound, speech, and voice AI
5
5
  Home-page: https://aaware.com
6
6
  License: GPL-3.0-only
@@ -25,9 +25,10 @@ Requires-Dist: onnxruntime (>=1.19.2,<2.0.0)
25
25
  Requires-Dist: paho-mqtt (>=2.1.0,<3.0.0)
26
26
  Requires-Dist: pandas (>=2.2.3,<3.0.0)
27
27
  Requires-Dist: pesq (>=0.0.4,<0.0.5)
28
+ Requires-Dist: pgzip (>=0.3.5,<0.4.0)
28
29
  Requires-Dist: praatio (>=6.2.0,<7.0.0)
29
30
  Requires-Dist: psutil (>=6.0.0,<7.0.0)
30
- Requires-Dist: pyaaware (>=1.6.3,<2.0.0)
31
+ Requires-Dist: pyaaware (>=2.0.0,<3.0.0)
31
32
  Requires-Dist: pyaudio (>=0.2.14,<0.3.0)
32
33
  Requires-Dist: pydub (>=0.25.1,<0.26.0)
33
34
  Requires-Dist: pystoi (>=0.4.1,<0.5.0)
@@ -35,6 +36,7 @@ Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
35
36
  Requires-Dist: requests (>=2.32.3,<3.0.0)
36
37
  Requires-Dist: rich (>=13.9.4,<14.0.0)
37
38
  Requires-Dist: samplerate (>=0.2.1,<0.3.0)
39
+ Requires-Dist: sh (>=2.2.2,<3.0.0)
38
40
  Requires-Dist: soundfile (>=0.12.1,<0.13.0)
39
41
  Requires-Dist: sox (>=1.5.0,<2.0.0)
40
42
  Requires-Dist: torch (>=2.2,<2.3)
@@ -0,0 +1,138 @@
1
+ sonusai/__init__.py,sha256=7kXYJuI8EPKezlFD7djImNolS1JMyyltgq_vqlDUCek,3261
2
+ sonusai/aawscd_probwrite.py,sha256=QZLMQrmPr3OjZ06buyYDwlnk9YPCpyr4KHkBjPsiqjU,3700
3
+ sonusai/audiofe.py,sha256=RPS5VJ1ckNQ1qeFx0eAjTslYDCdZZ_xv5DSBTIKrX7Y,19446
4
+ sonusai/calc_metric_spenh.py,sha256=0Md6hRFUH9lGnsvoydqne99O7Gi0ieG9vMU_1PnASBg,50019
5
+ sonusai/config/__init__.py,sha256=NeXdBQiuRKIm77pK9WHaxkdst9-jwhX1IDrHvpZecpI,52
6
+ sonusai/config/config.py,sha256=nM1W7dQXBWMdMLrgh3o7_cEItztFf1UTW-4faM0hIqY,1692
7
+ sonusai/config/config.yml,sha256=9y8wWXemU8tnvm_O21treyCpZF85QzokHsHQ8yl6IfE,283
8
+ sonusai/config/constants.py,sha256=npf0q3mfrq1-lCRG-CCBSpRed84nH5_1IaLMCZmpfU4,285
9
+ sonusai/constants.py,sha256=ESbZZpe_W7WTpGUBDKcPRpPEhyRsdb_AejpEM2GpqaQ,281
10
+ sonusai/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ sonusai/data/genmixdb.yml,sha256=4913_7pFRDI008dzDRi4fn-qs_M9IrA7C_qmcuDtKww,847
12
+ sonusai/data/silero_vad_v5.1.jit,sha256=hcSOHw7LYE5dKiaPPM-5EtT36TWs3IavWj_FsK6nspo,2269612
13
+ sonusai/data/silero_vad_v5.1.onnx,sha256=JiOilT9v89LB5hdAxs23FoEzR5smff7xFKSjzFvdeI8,2327524
14
+ sonusai/data/speech_ma01_01.wav,sha256=PK0vMKg-NR6rPE3KouxHGF6PKXnJCr7AwjMqfu98LUA,76644
15
+ sonusai/data/whitenoise.wav,sha256=I2umov0m34y56F9IsIBi1XtE76ZeZaSKDf70cJRe3pI,1920044
16
+ sonusai/datatypes.py,sha256=ji5RwhdxP9E0keexHbUJoWQDRzvonigt5cPd8umx13Y,9861
17
+ sonusai/deprecated/gentcst.py,sha256=nKbHy3aHreHqA-XnLQOzOApS8RuTNUFqnx52a8I5zLQ,19921
18
+ sonusai/deprecated/plot.py,sha256=ZzOP4b_7cotArSxbTDDDbhc7hj1BFMzooeZ20ppKneg,17430
19
+ sonusai/deprecated/tplot.py,sha256=0p238DvTaP4oU9y-dp0JdLaTV4TKrooAwbx7zdz_QAc,14641
20
+ sonusai/doc/__init__.py,sha256=KyQ26Um0RM8A3GYsb_tbFH64RwpoAw6lja2f_moUWas,33
21
+ sonusai/doc/doc.py,sha256=vyEfiUNd--F14Eel-u1EY4mfvHUXJrGrV3xKKExUiC4,19272
22
+ sonusai/doc.py,sha256=ZgFSSI56oNDb-yC3xi-RHMClMjryR2VrgGyi3ggX8gM,1098
23
+ sonusai/genft.py,sha256=jGjtjQQEuPunROkoDOYZ7gdyZEa09EMCVhpHrkBZ7A0,5571
24
+ sonusai/genmetrics.py,sha256=EZgf0Nw2ib_3VX0FxfT3eVzvV7S3CjUIz-u33mJoHAg,6065
25
+ sonusai/genmix.py,sha256=U62GPgejGfnDfRgXUosmnVVWvTV07sg46JQEIew0nPg,5744
26
+ sonusai/genmixdb.py,sha256=-GsH7qoWXlmQSDoCd_BLWhs3oKsvsBgK3c6JrhJOg20,10984
27
+ sonusai/ir_metric.py,sha256=nxS_mARPSZG5Y0G3L8HysOnkPj4v-RGxAxAVBYe-gJI,19600
28
+ sonusai/lsdb.py,sha256=86t6PpsyardRa6VcSJ-KyU1NiTmlg59VUlcSTptJbn0,5078
29
+ sonusai/main.py,sha256=72feJv5XEVJE_CQatmNIL1VD9ca-Mo0QNDbXxLrHrbQ,2619
30
+ sonusai/metrics/__init__.py,sha256=ssV6JEK_oklRSocsp6HMcG-GtJvV8IkRQtdKhHHmwU8,878
31
+ sonusai/metrics/calc_audio_stats.py,sha256=tIfTa40UdYCkj999kUghWafwnFBqFtJxB5yZhVp1YpA,1244
32
+ sonusai/metrics/calc_class_weights.py,sha256=uF1jeFz73l5nSk6SQ-xkBGbrgvAvX_MKUA_Det2KAEM,3609
33
+ sonusai/metrics/calc_optimal_thresholds.py,sha256=1bKPoqUYyHpq7lrx7hPnVXrJ5xWIewQjNG632GzKNNU,3502
34
+ sonusai/metrics/calc_pcm.py,sha256=yBQV9UJ1GK5f4c_8TNABMtZR-xyStKJCsSTT0FQGa50,1886
35
+ sonusai/metrics/calc_pesq.py,sha256=pWNbZXgw7oqPYaVRfvTFmxSzBgagIKe9auiwcgfE2wc,930
36
+ sonusai/metrics/calc_phase_distance.py,sha256=MFuBtGXb5qfQvRVciJ0Soz1w0GMSeJLBJud-aK4Loow,1870
37
+ sonusai/metrics/calc_sa_sdr.py,sha256=IdCzlQ_w94A3eK42t-gy_DrFN_tziwfDjTU6-WKuCFs,2531
38
+ sonusai/metrics/calc_sample_weights.py,sha256=0O2EH1-FKlCa0HFgKPUF1BJiknR1hCH7zLbXnoXH7Ag,945
39
+ sonusai/metrics/calc_segsnr_f.py,sha256=yLqUt--8osVgCNAkopbDZsldlVJ6a5AZEggarN8d3-g,2867
40
+ sonusai/metrics/calc_speech.py,sha256=bFiWtKz_Fuu4F1kdWGmZ3qZ_LdoSI3pj0ziXZKxXE3U,14828
41
+ sonusai/metrics/calc_wer.py,sha256=1MQYMx8ldHeodtJEtGibvDKhvSaGe6DBmZV4L8qOMgg,2362
42
+ sonusai/metrics/calc_wsdr.py,sha256=vcALY-zuhyThRa1QMz2qW8L9kSBc2v32gV9u8bV7VaM,2556
43
+ sonusai/metrics/class_summary.py,sha256=mQbMxQ8EtFIN7S2h7A4Dk0X4XF_CIxKk3W8zZMmpfcw,2801
44
+ sonusai/metrics/confusion_matrix_summary.py,sha256=lhd8TyHVMC03khX85h_D75XElmawx56KkqpX3X2O2gQ,3133
45
+ sonusai/metrics/one_hot.py,sha256=aKc-xYd4zWIjbmoQikIcQ6BJB1k-68XKTg8eJCacHTU,13906
46
+ sonusai/metrics/snr_summary.py,sha256=qKHctpmvGeu2cmjTG7iQPX1lvVUEtEnCIKwUGu6VrEQ,5773
47
+ sonusai/metrics_summary.py,sha256=qfQ_NAW4ilgyISRHxSuewTK-u_eo4bkjOjLNX-qd1z4,12197
48
+ sonusai/mixture/__init__.py,sha256=c_Yvc6_aqinwh1wRwNjUKUoIJM0Z6AQBqOpvOvNkxcs,1289
49
+ sonusai/mixture/audio.py,sha256=JyrVtVPLH3aTXFgyl446f5uVHxlFRa4aBaSPYaMdg80,5814
50
+ sonusai/mixture/class_balancing.py,sha256=lubicVCzxs4TMh2dZSsuIffkLkk1gmwjmwtrtQ27BVQ,3638
51
+ sonusai/mixture/config.py,sha256=2_hEndyRXxyBpGzyBFaDT9REYGoK9Q7HQy8vDqPozus,23320
52
+ sonusai/mixture/constants.py,sha256=Kklzhf5DL30yb3TpqRbvRUhcFrEXJ4s2S3D_nw4ARxM,1498
53
+ sonusai/mixture/data_io.py,sha256=DV48sFcP2Qp3NBzvcnlptQOXU3aUEcAeLuh3XOtC5jI,5341
54
+ sonusai/mixture/db_datatypes.py,sha256=VvNtbOgt5WSeSnBoVcNGC5gs_7hX_38pDUPjy5KRbG4,1471
55
+ sonusai/mixture/effects.py,sha256=4FK0Mgo-XL3lMEi3MARIt18AJVirDG2mFHM5BiRZe2I,11780
56
+ sonusai/mixture/feature.py,sha256=7GJvFhfqeqerfjy9Vq9aKt-cecgYblK0IypNNo5hgwY,2285
57
+ sonusai/mixture/generation.py,sha256=0jhp72EENa_vldM1RQL5b1WDmwqHGSZWG2Hx_Ez81LI,32778
58
+ sonusai/mixture/helpers.py,sha256=dmyHwf1C5dZjYOd11kVV16KI33CaM-dU_fyaxOrrKt8,11642
59
+ sonusai/mixture/ir_delay.py,sha256=aiC23HMWQ08-v5wORgMx1_DOJSdh4kunULqiQ-SGuMo,2026
60
+ sonusai/mixture/ir_effects.py,sha256=PqiqD4PS42-7kD6ESnsZi2a3tnKCFa4E0xqUujRBvGg,2152
61
+ sonusai/mixture/log_duration_and_sizes.py,sha256=3ekS27IMKlnxIkQAmprzmBnzHOpRjZh3d7maL2VqWQU,927
62
+ sonusai/mixture/mixdb.py,sha256=ZpgLl27UXcUKrIB3IIv5wAMQAcVa9UTbkIGY8Unh-qk,87483
63
+ sonusai/mixture/pad_audio.py,sha256=KNxVQAejA0hblLOnMJgLS6lFaeE0n3tWQ5rclaHBnIY,1015
64
+ sonusai/mixture/resample.py,sha256=jXqH6FrZ0mlhQ07XqPx88TT9elu3HHVLw7Q0a7Lh5M4,221
65
+ sonusai/mixture/sox_effects.py,sha256=tndS9qrh3eJOTUPrufyWHCt3UqjbPuh81I4Lo4MNmDg,5328
66
+ sonusai/mixture/sox_help.py,sha256=DOTMBZfYQs3bXrqra25iH92lJFhqcGe9M1am4OrKkBY,29855
67
+ sonusai/mixture/spectral_mask.py,sha256=TA3tUvv2IUqeG-XGVhJgsdDtdvfduzbNxgw4wa1aXWM,2014
68
+ sonusai/mixture/truth.py,sha256=9BMMCcW-APQJrF2LqGQIyH6sG8tj9LKmV7MCxeXv-uU,2127
69
+ sonusai/mixture/truth_functions/__init__.py,sha256=0mlOFChPnXG5BC0eKOe4n9VH17jY4iOqZFLuF6Gprdk,1505
70
+ sonusai/mixture/truth_functions/crm.py,sha256=JUo4QTxo_6NqLm3ZqbzqLs8PVPDRhB0p0TLudTWpnNs,3771
71
+ sonusai/mixture/truth_functions/energy.py,sha256=OCS_KECRcpo3iTPquYmG07C090laqnuwTBmxpGgDp6I,6707
72
+ sonusai/mixture/truth_functions/file.py,sha256=6G8ZKhejaj1Z31PkNfXNpk8E27P-F9MAcoKcUJzFgm0,1412
73
+ sonusai/mixture/truth_functions/metadata.py,sha256=Pq5BLt55tB70bnMLKgZVHmKmM-qIcdisLJ-uMkwyioo,759
74
+ sonusai/mixture/truth_functions/metrics.py,sha256=Mu6o4Hf-I0-f-dVA_egFBUvf1OBj5vtf0gdIB6irQWk,857
75
+ sonusai/mixture/truth_functions/phoneme.py,sha256=PhSev7PNDOECcdjnCwiISDZlXQwAiOdk_hD0p3eoXN4,763
76
+ sonusai/mixture/truth_functions/sed.py,sha256=bMYHLBNPfzo4K-22_iGNi2NwDAG82vNtlDioA8VqcOo,3750
77
+ sonusai/mixture/truth_functions/target.py,sha256=06zNRu4aD7TReZiaq0HQgukqOrYr1sDgYhHCTIPV1Es,4913
78
+ sonusai/mkwav.py,sha256=Za0Xdn7ixth3RaYDS7ODOpNJmxjfr9ZMZh0anJO6r4o,4191
79
+ sonusai/onnx_predict.py,sha256=8ViupBIvbWExOHMxNsrpyElzAD0WQovGZoOXy7tnESk,15772
80
+ sonusai/queries/__init__.py,sha256=gB7mgKVg8nIIgH-M1Oivoxkc3TGieOlIFzRHMwBQmrY,277
81
+ sonusai/queries/queries.py,sha256=HLbwbd7OSXKO-IH6LxKzpr98_vfNlNQXIKZSUvQ98lw,7702
82
+ sonusai/speech/__init__.py,sha256=vqAymCBPjMUSM4OZKHTai6BYwXsOBlf_G_vOhELVf8I,133
83
+ sonusai/speech/l2arctic.py,sha256=VQNKuTbmlbW0PJ7bOjx9sr0VjUYxJnxfTiPJIa4OOaA,3829
84
+ sonusai/speech/librispeech.py,sha256=8ksO65-pCrSGc-5paHL58JxMp-8rq6ygxzkCGSoXMi4,3070
85
+ sonusai/speech/mcgill.py,sha256=S_rAOTpW6YGJcbWJor3ZedpFYyoUwz93GCAbahbZPQk,1981
86
+ sonusai/speech/textgrid.py,sha256=WvsUeamKoYyXBNnNnZgug-xfTiq2Z6RnFc1u0swmqNw,2813
87
+ sonusai/speech/timit.py,sha256=73T1eOQcA1FfvpCGN8gC4iP56vt4KWcDjLnlkVgdZ9U,4099
88
+ sonusai/speech/types.py,sha256=4eKVPAktpkIrZ2qoVp2iT45zxTVNocQEGT6O_Zlub_w,214
89
+ sonusai/speech/vctk.py,sha256=WInvRRRkZCW6t_NcZAJffJzgCbyetal-j2w0kKX5SDw,1527
90
+ sonusai/speech/voxceleb.py,sha256=Uu1kB1krf8hess1yuvGbYfV_VgYhklEyoz4I7KfrVpw,2658
91
+ sonusai/summarize_metric_spenh.py,sha256=Zha0PZGZ_NznPeHh8rjVIaWR7ac4MEIlijci1uikiT0,1870
92
+ sonusai/utils/__init__.py,sha256=4XB-62-4Dg_XgZ6Ip2fEOBJ0_oQff6jndYl2rlzl6XE,2699
93
+ sonusai/utils/asl_p56.py,sha256=zH82RI7h399ZYFOOiOC35iv_qi0KhXpmG5uItWB8n78,3854
94
+ sonusai/utils/asr.py,sha256=w5xSBpA2wibzsiCWzdSm1m3LwNd54dcJMMLBWN33FJs,2818
95
+ sonusai/utils/asr_functions/__init__.py,sha256=HKGRm_c48tcxlfwqH63m-MvhAoK_pCcw76lxmFmiP_U,63
96
+ sonusai/utils/asr_functions/aaware_whisper.py,sha256=qgW1we5Y8QHljlv7IDDg77siM-UjDTKPhBPde509uXU,2076
97
+ sonusai/utils/audio_devices.py,sha256=_Eiah86SZjbdp2baD2AUVF4FmhseiNuG3KJkd_LbULk,2041
98
+ sonusai/utils/braced_glob.py,sha256=uvxo7USbxH6cWuVdNeGrz1SbZISFR1gPGbpy0EWm3m8,1645
99
+ sonusai/utils/calculate_input_shape.py,sha256=TIa_rHW3VIvOhlv5Wa3orcWFPMT-a3EPrIFHstbrmo4,906
100
+ sonusai/utils/choice.py,sha256=yU9pKmHovJL_PjX5IU0oH64sTKGn1q2Sq9HHyakQBf0,749
101
+ sonusai/utils/compress.py,sha256=Ez3R5viULqpxtd10Y6g8YS2fj8K8sO3qoSIXaP4lWRU,601
102
+ sonusai/utils/convert_string_to_number.py,sha256=cktFu6Jp1jifi3F6j1WIlVhEoeiCzaw4JlI43dBg9WI,213
103
+ sonusai/utils/create_timestamp.py,sha256=s7ALOX3MAyK3EOX2BVOiYTIcspsKlIM6zXJk2cbFkz0,148
104
+ sonusai/utils/create_ts_name.py,sha256=3xu10hbZkV18sDqK4oR1JYvXeYE53ufzddmvGYx83Vg,405
105
+ sonusai/utils/dataclass_from_dict.py,sha256=0efZc52Twg1aFMdmNJw6ZHvesAj_-rKBHZsCWE1joEI,946
106
+ sonusai/utils/db.py,sha256=lI77MJJLs4CTYxhjFUvBom2Kk2imAP34okOeO4irbDc,371
107
+ sonusai/utils/docstring.py,sha256=aPFrVpqlbYq3kIJE_sLCjhXWEqWCBo_q_DUmEXcGONQ,1516
108
+ sonusai/utils/energy_f.py,sha256=mmtdAcHQWah6QdQclqGIJkGWZO6eTqV6JFz5MFS1kzs,1503
109
+ sonusai/utils/engineering_number.py,sha256=SToFf6S0Xu0NtAJ1SjsVH4wxylH7qK8S9TBkPa15opY,5510
110
+ sonusai/utils/evaluate_random_rule.py,sha256=VBccfAXj8JQ2itOi2-NM79caHUDCiqbiSthlY1QCugI,466
111
+ sonusai/utils/get_frames_per_batch.py,sha256=xnq4tV7MT74N0H6b5ZsiAezqdXucboCLQw1Np9XpZbs,134
112
+ sonusai/utils/get_label_names.py,sha256=df4jZVaQ3WnYQqNj21iUV4aYWyQEZUNmgs93qKW-_rA,820
113
+ sonusai/utils/grouper.py,sha256=qyZ0nj84yOrC-RZsXHC-KJvcUliGktnV8S6-P3PD6_w,203
114
+ sonusai/utils/human_readable_size.py,sha256=DOCS7SAymrtTZli8AczvyCMCh44r7ZDgVBA7jSZupmA,356
115
+ sonusai/utils/keyboard_interrupt.py,sha256=fqBFn8ue_BZ4B2Pw5fk5WPvT4w3aKRNrCExIBcMLk7w,284
116
+ sonusai/utils/load_object.py,sha256=if4Vammcd-jZTz_n7QzwNIlN4HqSL0v91I9YQzcvEEA,493
117
+ sonusai/utils/max_text_width.py,sha256=pxiJMwb_zlkNntexgo7S6lAuF7NLLZvFdOCkxdsQJVY,315
118
+ sonusai/utils/model_utils.py,sha256=OIJBhOjxR0wpxsd7A2r6J2AjqfdYgZzi6UEThw4S1lI,828
119
+ sonusai/utils/numeric_conversion.py,sha256=iFPXFU8C_1mW5tmDqHq8-xP1tL8nVaSmhQRakdCqy30,328
120
+ sonusai/utils/onnx_utils.py,sha256=XkG7ldYD43_pQXkn-1XFSuwwC8HB7-FH7Y4-AYZOUFo,5591
121
+ sonusai/utils/parallel.py,sha256=yvRZvZWPR5slM51i08m7sYx-Mvsb5oryCqqJXVoJ8tQ,2190
122
+ sonusai/utils/path_info.py,sha256=QY7iQ0nYpeEDnPN9RyPh4DsgYmVYsLrrlAzKuzkqX1o,118
123
+ sonusai/utils/print_mixture_details.py,sha256=fUYccs25KF-fpgT9wK3PEKkc18gWfIO99zyiUuNWVBM,2979
124
+ sonusai/utils/rand.py,sha256=yQMpYuJFi8GkIocDYIT3ESfNYEgWA7KZMWpgjqr0UXQ,225
125
+ sonusai/utils/ranges.py,sha256=-TtAR0Vg_j4kYtJOvEOYQllBZEat_KfUKsfRxr5oj-o,1235
126
+ sonusai/utils/read_predict_data.py,sha256=ZcIlfwxfav8Lh3gye7V150t0c6k-C9y5SbzWtDQ6TuU,1037
127
+ sonusai/utils/reshape.py,sha256=BqgNAX6Hwz13jLgSYoqKk4iG_UatSiRmE6mzT3edSi8,5704
128
+ sonusai/utils/seconds_to_hms.py,sha256=9Ya9O97txFtTIXZUQw1K8g7b7Xx-ptvUtMUlzsIduTo,260
129
+ sonusai/utils/stacked_complex.py,sha256=JW6iAa1C-4Tuh4dD5c-D-O-yo-OY5Xm0AKVU0YsqsJU,2782
130
+ sonusai/utils/stratified_shuffle_split.py,sha256=F3TowSWeZiY6lqEGmembaRO0AK14VWUtCQ8v6OUMX6Q,6707
131
+ sonusai/utils/tokenized_shell_vars.py,sha256=EDrrAgz5lJ0RBAjLcTJt1MeyjhbNZiqXkymohsedNMc,4922
132
+ sonusai/utils/write_audio.py,sha256=IHzrJoFtFcea_J6wo6QSiojRkgnNOzAEcg-z0rFV7nU,810
133
+ sonusai/utils/yes_or_no.py,sha256=0h1okjXmDNbJp7rZJFR2V-HFU1GJDm3YFTUVmYExkOU,263
134
+ sonusai/vars.py,sha256=m8pdgfR4A6A9TCGf_rok6jPAT5BgrEsYXTSISIh1nrI,1163
135
+ sonusai-1.0.1.dist-info/METADATA,sha256=zvrhFpNsB1ErqFsUOIi9y67rOM9wvs8j_5cv8KMi1uw,2607
136
+ sonusai-1.0.1.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
137
+ sonusai-1.0.1.dist-info/entry_points.txt,sha256=zMNjEphEPO6B3cD1GNpit7z-yA9tUU5-j3W2v-UWstU,92
138
+ sonusai-1.0.1.dist-info/RECORD,,