sonusai 1.0.8__py3-none-any.whl → 1.0.10__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.
sonusai/mixture/mixdb.py CHANGED
@@ -2,8 +2,6 @@
2
2
  from functools import cached_property
3
3
  from functools import lru_cache
4
4
  from functools import partial
5
- from sqlite3 import Connection
6
- from sqlite3 import Cursor
7
5
  from typing import Any
8
6
 
9
7
  from ..datatypes import ASRConfigs
@@ -31,66 +29,8 @@ from ..datatypes import TruthDict
31
29
  from ..datatypes import TruthsConfigs
32
30
  from ..datatypes import TruthsDict
33
31
  from ..datatypes import UniversalSNR
34
-
35
-
36
- def db_file(location: str, test: bool = False) -> str:
37
- from os.path import join
38
-
39
- from .constants import MIXDB_NAME
40
- from .constants import TEST_MIXDB_NAME
41
-
42
- if test:
43
- name = TEST_MIXDB_NAME
44
- else:
45
- name = MIXDB_NAME
46
-
47
- return join(location, name)
48
-
49
-
50
- def db_connection(
51
- location: str,
52
- create: bool = False,
53
- readonly: bool = True,
54
- test: bool = False,
55
- verbose: bool = False,
56
- ) -> Connection:
57
- import sqlite3
58
- from os import remove
59
- from os.path import exists
60
-
61
- from .. import logger_db
62
-
63
- name = db_file(location, test)
64
- if create and exists(name):
65
- remove(name)
66
-
67
- if not create and not exists(name):
68
- raise OSError(f"Could not find mixture database in {location}")
69
-
70
- if not create and readonly:
71
- name += "?mode=ro"
72
-
73
- connection = sqlite3.connect("file:" + name, uri=True, timeout=20)
74
-
75
- if verbose:
76
- connection.set_trace_callback(logger_db.debug)
77
-
78
- return connection
79
-
80
-
81
- class SQLiteContextManager:
82
- def __init__(self, location: str, test: bool = False, verbose: bool = False) -> None:
83
- self.location = location
84
- self.test = test
85
- self.verbose = verbose
86
-
87
- def __enter__(self) -> Cursor:
88
- self.con = db_connection(location=self.location, test=self.test, verbose=self.verbose)
89
- self.cur = self.con.cursor()
90
- return self.cur
91
-
92
- def __exit__(self, exc_type, exc_val, exc_tb) -> None:
93
- self.con.close()
32
+ from .db import SQLiteDatabase
33
+ from .db_file import db_file
94
34
 
95
35
 
96
36
  class MixtureDatabase:
@@ -108,19 +48,22 @@ class MixtureDatabase:
108
48
  if not exists(db_file(self.location, self.test)):
109
49
  raise OSError(f"Could not find mixture database in {self.location}")
110
50
 
111
- self.db = partial(SQLiteContextManager, self.location, self.test, self.verbose)
51
+ self.db = partial(SQLiteDatabase, location=self.location, test=self.test, verbose=self.verbose)
112
52
 
113
- # Check config.yml to see if asr_configs has changed and update database if needed
53
+ # Check config.yml to see if asr_configs has changed and update the database if needed
114
54
  config = load_config(self.location)
115
55
  new_asr_configs = json.dumps(config["asr_configs"])
116
56
  with self.db() as c:
117
57
  old_asr_configs = c.execute("SELECT asr_configs FROM top").fetchone()
118
58
 
119
59
  if old_asr_configs is not None and new_asr_configs != old_asr_configs[0]:
120
- con = db_connection(location=self.location, readonly=False, test=self.test, verbose=self.verbose)
121
- con.execute("UPDATE top SET asr_configs = ? WHERE ? = id", (new_asr_configs,))
122
- con.commit()
123
- con.close()
60
+ with SQLiteDatabase(
61
+ location=self.location,
62
+ readonly=False,
63
+ test=self.test,
64
+ verbose=self.verbose,
65
+ ) as cur:
66
+ cur.execute("UPDATE top SET asr_configs = ? WHERE ? = id", (new_asr_configs,))
124
67
 
125
68
  @cached_property
126
69
  def json(self) -> str:
@@ -0,0 +1,145 @@
1
+ """
2
+ Parse config rules
3
+
4
+ sai_expand(0, 5)
5
+ sai_expand(.0, 5)
6
+ sai_expand(0., 5)
7
+ sai_expand(0.0, 5)
8
+ sai_expand(0, .5)
9
+ sai_expand(.0, .5)
10
+ sai_expand(0., .5)
11
+ sai_expand(0.0, .5)
12
+ sai_expand(0, 5.)
13
+ sai_expand(.0, 5.)
14
+ sai_expand(0., 5.)
15
+ sai_expand(0.0, 5.)
16
+ sai_expand(0, 5.0)
17
+ sai_expand(.0, 5.0)
18
+ sai_expand(0., 5.0)
19
+ sai_expand(0.0, 5.0)
20
+
21
+ sai_rand(-1, 1)
22
+ sai_choose(repeat=False)
23
+ sai_choose(repeat=False, tag=tag)
24
+ sai_sequence()
25
+ sai_sequence(tag=tag)
26
+
27
+ sai_expand(0, sai_rand(-1, 1))
28
+ sai_expand(sai_rand(0, 4), 0)
29
+ sai_expand(sai_rand(0, 4), sai_rand(-1, 1))
30
+
31
+ sai_choose(num=1, unique=speaker_id, repeat=False)
32
+ sai_choose(num=1, repeat=False)
33
+ sai_choose(num=1, unique=speaker_id, repeat=True)
34
+ sai_choose(num=1, repeat=True)
35
+ sai_sequence(num=0)
36
+ sai_sequence(num=0, unique=speaker_id)
37
+
38
+ """
39
+
40
+ from dataclasses import dataclass
41
+
42
+
43
+ @dataclass
44
+ class Match:
45
+ group: str
46
+ span: tuple[int, int]
47
+
48
+ def start(self) -> int:
49
+ return self.span[0]
50
+
51
+ def end(self) -> int:
52
+ return self.span[1]
53
+
54
+
55
+ def find_sai_expand(text: str) -> list[Match]:
56
+ import re
57
+
58
+ results = []
59
+ matches = re.finditer(r"sai_expand\(", text)
60
+ if matches:
61
+ for match in matches:
62
+ s = match.start()
63
+ e = match.end()
64
+ num_lparen = 1
65
+ while num_lparen != 0 and e < len(text):
66
+ if text[e] == "(":
67
+ num_lparen += 1
68
+ elif text[e] == ")":
69
+ num_lparen -= 1
70
+ e += 1
71
+ if num_lparen != 0:
72
+ raise ValueError(f"Unbalanced parenthesis in '{text}'")
73
+
74
+ results.append(Match(group=text[s:e], span=(s, e)))
75
+
76
+ return results
77
+
78
+
79
+ def parse_sai_expand(text: str) -> list[str]:
80
+ """
81
+ expand_syntax ::= expand_keyword lparen expand_item next_expand_item+ rparen
82
+ expand_keyword ::= sai_expand
83
+ lparen ::= (
84
+ expand_item ::= expand_syntax | rand_syntax | number
85
+ rand_syntax ::= rand_keyword lparen rand_item comma rand_item rparen
86
+ rand_item ::= real number
87
+ comma ::= ,
88
+ number ::= real number or signed integer
89
+ next_item ::= comma item
90
+ rparen ::= )
91
+ """
92
+ import pyparsing as pp
93
+
94
+ lparen = pp.Literal("(")
95
+ rparen = pp.Literal(")")
96
+ comma = pp.Literal(",")
97
+
98
+ real_number = pp.pyparsing_common.real
99
+ signed_integer = pp.pyparsing_common.signed_integer
100
+ number = real_number | signed_integer
101
+
102
+ identifier = pp.Word(pp.alphanums + "_.-")
103
+
104
+ rand_literal = pp.Literal("sai_rand")
105
+ rand_expression = (rand_literal + lparen + number + comma + number + rparen).set_parse_action(
106
+ lambda tokens: "".join(map(str, tokens))
107
+ )
108
+
109
+ expand_literal = pp.Literal("sai_expand")
110
+ expand_args = pp.DelimitedList(rand_expression | identifier, min=1)
111
+ expand_expression = expand_literal + lparen + expand_args("args") + rparen
112
+
113
+ try:
114
+ result = expand_expression.parse_string(text)
115
+ except pp.ParseException as e:
116
+ raise ValueError(f"Could not parse '{text}'") from e
117
+
118
+ return list(result.args)
119
+
120
+
121
+ def sai_expand(text: str) -> list[str]:
122
+ # initialize with input
123
+ expanded = [text]
124
+
125
+ # look for pattern
126
+ matches = find_sai_expand(text)
127
+
128
+ # if not found, early exit
129
+ if not matches:
130
+ return expanded
131
+
132
+ # remove entry we are expanding
133
+ expanded.pop()
134
+
135
+ # start with the innermost match
136
+ match = matches[-1]
137
+ prelude = text[: match.start()]
138
+ postlude = text[match.end() :]
139
+
140
+ # loop over parsed expand values
141
+ for value in parse_sai_expand(match.group):
142
+ # extend result with expand of replacement (for handling multiple expands in a single rule)
143
+ expanded.extend(sai_expand(prelude + value + postlude))
144
+
145
+ return expanded
@@ -2,10 +2,10 @@ import numpy as np
2
2
 
3
3
 
4
4
  def int16_to_float(x: np.ndarray) -> np.ndarray:
5
- """Convert int16 array to floating point with range +/- 1"""
5
+ """Convert an int16 array to a floating point array with range +/- 1"""
6
6
  return x.astype(np.float32) / 32768
7
7
 
8
8
 
9
9
  def float_to_int16(x: np.ndarray) -> np.ndarray:
10
- """Convert float point array with range +/- 1 to int16"""
10
+ """Convert a floating point array with range +/- 1 to an int16 array"""
11
11
  return (x * 32768).astype(np.int16)
@@ -1,18 +1,15 @@
1
1
  from collections.abc import Callable
2
2
 
3
3
  from ..datatypes import ClassCount
4
+ from ..mixture.helpers import mixture_all_speech_metadata
4
5
  from ..mixture.mixdb import MixtureDatabase
5
6
 
6
7
 
7
8
  def print_mixture_details(
8
9
  mixdb: MixtureDatabase,
9
10
  mixid: int | None = None,
10
- desc_len: int = 1,
11
11
  print_fn: Callable = print,
12
12
  ) -> None:
13
- import numpy as np
14
-
15
- from ..constants import SAMPLE_RATE
16
13
  from ..utils.seconds_to_hms import seconds_to_hms
17
14
 
18
15
  if mixid is not None:
@@ -21,30 +18,29 @@ def print_mixture_details(
21
18
 
22
19
  print_fn(f"Mixture {mixid} details")
23
20
  mixture = mixdb.mixture(mixid)
24
- target_files = [mixdb.target_files[target.file_id] for target in mixture.targets]
25
- target_augmentations = [target.augmentation for target in mixture.targets]
26
- noise_file = mixdb.noise_file(mixture.noise.file_id)
27
- for t_idx, target_file in enumerate(target_files):
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)}")
31
- for truth_name, truth_config in target_file.truth_configs.items():
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}")
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(
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}")
21
+ speech_metadata = mixture_all_speech_metadata(mixdb, mixture)
22
+ for category, source in mixture.all_sources.items():
23
+ source_file = mixdb.source_file(source.file_id)
24
+ print_fn(f" {category}")
25
+ print_fn(f" name: {source_file.name}")
26
+ print_fn(f" effects: {source.effects.to_dict()}")
27
+ print_fn(f" pre_tempo: {source.pre_tempo}")
28
+ print_fn(f" duration: {seconds_to_hms(source_file.duration)}")
29
+ print_fn(f" start: {source.start}")
30
+ print_fn(f" repeat: {source.repeat}")
31
+ print_fn(f" snr: {source.snr}")
32
+ print_fn(f" random_snr: {source.snr.is_random}")
33
+ print_fn(f" snr_gain: {source.snr_gain}")
34
+ for key in source_file.truth_configs:
35
+ print_fn(f" truth '{key}' function: {source_file.truth_configs[key].function}")
36
+ print_fn(f" truth '{key}' config: {source_file.truth_configs[key].config}")
37
+ print_fn(
38
+ f" truth '{key}' stride_reduction: {source_file.truth_configs[key].stride_reduction}"
39
+ )
40
+ for key in speech_metadata[category]:
41
+ print_fn(f"{category} speech {key}: {speech_metadata[category][key]}")
42
+ print_fn(f" samples: {mixture.samples}")
43
+ print_fn(f" feature frames: {mixdb.mixture_feature_frames(mixid)}")
48
44
  print_fn("")
49
45
 
50
46
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: sonusai
3
- Version: 1.0.8
3
+ Version: 1.0.10
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
@@ -31,6 +31,7 @@ Requires-Dist: psutil (>=6.0.0,<7.0.0)
31
31
  Requires-Dist: pyaaware (>=2.0.0,<3.0.0)
32
32
  Requires-Dist: pyaudio (>=0.2.14,<0.3.0)
33
33
  Requires-Dist: pydub (>=0.25.1,<0.26.0)
34
+ Requires-Dist: pyparsing (>=3.2.3,<4.0.0)
34
35
  Requires-Dist: pystoi (>=0.4.1,<0.5.0)
35
36
  Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
36
37
  Requires-Dist: requests (>=2.32.3,<3.0.0)
@@ -18,14 +18,14 @@ sonusai/deprecated/gentcst.py,sha256=nKbHy3aHreHqA-XnLQOzOApS8RuTNUFqnx52a8I5zLQ
18
18
  sonusai/deprecated/plot.py,sha256=ZzOP4b_7cotArSxbTDDDbhc7hj1BFMzooeZ20ppKneg,17430
19
19
  sonusai/deprecated/tplot.py,sha256=0p238DvTaP4oU9y-dp0JdLaTV4TKrooAwbx7zdz_QAc,14641
20
20
  sonusai/doc/__init__.py,sha256=KyQ26Um0RM8A3GYsb_tbFH64RwpoAw6lja2f_moUWas,33
21
- sonusai/doc/doc.py,sha256=vyEfiUNd--F14Eel-u1EY4mfvHUXJrGrV3xKKExUiC4,19272
21
+ sonusai/doc/doc.py,sha256=FURO3pvGKrUCHs5iHf0L2zeNofdePW_jiEwtKQX4pJw,19520
22
22
  sonusai/doc.py,sha256=ZgFSSI56oNDb-yC3xi-RHMClMjryR2VrgGyi3ggX8gM,1098
23
23
  sonusai/genft.py,sha256=yiADvi0J-Fy4kNpNOEB3wVvU9RZowGvOsCTJndQYXFw,5580
24
24
  sonusai/genmetrics.py,sha256=9l7g_DAKa126RGq23-Wilzdh1M3QHCCeNfUVYaQS1mU,6193
25
25
  sonusai/genmix.py,sha256=gcmqcPqZ1Vz_TtZMp29L8cGnqTK5jcw0cAOc16NOR9A,5753
26
26
  sonusai/genmixdb.py,sha256=VDQMF6JHcHc-yJAZ1Se3CM3ac8fFKIgnaxv4e5jdE1I,11281
27
27
  sonusai/ir_metric.py,sha256=nxS_mARPSZG5Y0G3L8HysOnkPj4v-RGxAxAVBYe-gJI,19600
28
- sonusai/lsdb.py,sha256=86t6PpsyardRa6VcSJ-KyU1NiTmlg59VUlcSTptJbn0,5078
28
+ sonusai/lsdb.py,sha256=-Fhwd7YuL-OIymFqaNcBHtOq8l_8LxzoEE6ztduQCpY,5059
29
29
  sonusai/main.py,sha256=72feJv5XEVJE_CQatmNIL1VD9ca-Mo0QNDbXxLrHrbQ,2619
30
30
  sonusai/metrics/__init__.py,sha256=ssV6JEK_oklRSocsp6HMcG-GtJvV8IkRQtdKhHHmwU8,878
31
31
  sonusai/metrics/calc_audio_stats.py,sha256=tIfTa40UdYCkj999kUghWafwnFBqFtJxB5yZhVp1YpA,1244
@@ -45,22 +45,25 @@ sonusai/metrics/confusion_matrix_summary.py,sha256=lhd8TyHVMC03khX85h_D75XElmawx
45
45
  sonusai/metrics/one_hot.py,sha256=aKc-xYd4zWIjbmoQikIcQ6BJB1k-68XKTg8eJCacHTU,13906
46
46
  sonusai/metrics/snr_summary.py,sha256=qKHctpmvGeu2cmjTG7iQPX1lvVUEtEnCIKwUGu6VrEQ,5773
47
47
  sonusai/metrics_summary.py,sha256=jtSwHomw23qwTYfzjFo_JmqzrkZcts1CMFFzTmJCmWk,12189
48
- sonusai/mixture/__init__.py,sha256=_vepE2uhAGKHIujPWxfGDeaWHP5yKLf5BjXkU9ZereA,1258
48
+ sonusai/mixture/__init__.py,sha256=l4CgJN0gH4Z19jcQvXJbR8KSZ5f_ysnoAGi93LQaTjM,1260
49
49
  sonusai/mixture/audio.py,sha256=JyrVtVPLH3aTXFgyl446f5uVHxlFRa4aBaSPYaMdg80,5814
50
50
  sonusai/mixture/class_balancing.py,sha256=lubicVCzxs4TMh2dZSsuIffkLkk1gmwjmwtrtQ27BVQ,3638
51
51
  sonusai/mixture/config.py,sha256=2_hEndyRXxyBpGzyBFaDT9REYGoK9Q7HQy8vDqPozus,23320
52
52
  sonusai/mixture/constants.py,sha256=Kklzhf5DL30yb3TpqRbvRUhcFrEXJ4s2S3D_nw4ARxM,1498
53
53
  sonusai/mixture/data_io.py,sha256=DV48sFcP2Qp3NBzvcnlptQOXU3aUEcAeLuh3XOtC5jI,5341
54
+ sonusai/mixture/db.py,sha256=yd0bCiihuUAw3IgRlLqcshXB2QHep837O3TwjPyo-LM,5132
54
55
  sonusai/mixture/db_datatypes.py,sha256=VvNtbOgt5WSeSnBoVcNGC5gs_7hX_38pDUPjy5KRbG4,1471
55
- sonusai/mixture/effects.py,sha256=ghMO-WiSMQc1CvafD0wkt_DGsM2A6Hi_oZS6j-jeZh8,11784
56
+ sonusai/mixture/db_file.py,sha256=P48TWYNyqchycENIqBu1QqhfsRDP6WK2VanPgxN1Imk,278
57
+ sonusai/mixture/effects.py,sha256=zIb6ir0WSdKQJo7uJ3QQnV52RA6lJaqgQqvQh-s0dhc,11038
56
58
  sonusai/mixture/feature.py,sha256=7GJvFhfqeqerfjy9Vq9aKt-cecgYblK0IypNNo5hgwY,2285
57
- sonusai/mixture/generation.py,sha256=2VQ41uc1OLFpDKwu0TlcdtxSXwiTJFr_B6_E20pheIY,32844
59
+ sonusai/mixture/generation.py,sha256=_vGTyqo0ocyOK84rTj_1QXciq1Tmxxl5XhwaXPWIEL0,33105
58
60
  sonusai/mixture/helpers.py,sha256=dmyHwf1C5dZjYOd11kVV16KI33CaM-dU_fyaxOrrKt8,11642
59
61
  sonusai/mixture/ir_delay.py,sha256=aiC23HMWQ08-v5wORgMx1_DOJSdh4kunULqiQ-SGuMo,2026
60
62
  sonusai/mixture/ir_effects.py,sha256=PqiqD4PS42-7kD6ESnsZi2a3tnKCFa4E0xqUujRBvGg,2152
61
63
  sonusai/mixture/log_duration_and_sizes.py,sha256=3ekS27IMKlnxIkQAmprzmBnzHOpRjZh3d7maL2VqWQU,927
62
- sonusai/mixture/mixdb.py,sha256=zGFagqRIV9uX2QiP795lyN29AarGnZgeKTdUIBcuyfY,86305
64
+ sonusai/mixture/mixdb.py,sha256=5YI0zKisFw_B-jKpB-Y1EYlJ8pHQDvOQLs9LEe0gT1w,84905
63
65
  sonusai/mixture/pad_audio.py,sha256=KNxVQAejA0hblLOnMJgLS6lFaeE0n3tWQ5rclaHBnIY,1015
66
+ sonusai/mixture/parse.py,sha256=nqhjuR-J7_3wlGhVitYFvQwLJ1sclU8WZrVF0SyW2Cw,3700
64
67
  sonusai/mixture/resample.py,sha256=jXqH6FrZ0mlhQ07XqPx88TT9elu3HHVLw7Q0a7Lh5M4,221
65
68
  sonusai/mixture/sox_effects.py,sha256=tndS9qrh3eJOTUPrufyWHCt3UqjbPuh81I4Lo4MNmDg,5328
66
69
  sonusai/mixture/sox_help.py,sha256=DOTMBZfYQs3bXrqra25iH92lJFhqcGe9M1am4OrKkBY,29855
@@ -115,11 +118,11 @@ sonusai/utils/keyboard_interrupt.py,sha256=fqBFn8ue_BZ4B2Pw5fk5WPvT4w3aKRNrCExIB
115
118
  sonusai/utils/load_object.py,sha256=if4Vammcd-jZTz_n7QzwNIlN4HqSL0v91I9YQzcvEEA,493
116
119
  sonusai/utils/max_text_width.py,sha256=pxiJMwb_zlkNntexgo7S6lAuF7NLLZvFdOCkxdsQJVY,315
117
120
  sonusai/utils/model_utils.py,sha256=OIJBhOjxR0wpxsd7A2r6J2AjqfdYgZzi6UEThw4S1lI,828
118
- sonusai/utils/numeric_conversion.py,sha256=iFPXFU8C_1mW5tmDqHq8-xP1tL8nVaSmhQRakdCqy30,328
121
+ sonusai/utils/numeric_conversion.py,sha256=2Ie9ATgJRAo-1y0ECX2YYS23XZ3BG7AB7M7Bys1-pqY,353
119
122
  sonusai/utils/onnx_utils.py,sha256=XkG7ldYD43_pQXkn-1XFSuwwC8HB7-FH7Y4-AYZOUFo,5591
120
123
  sonusai/utils/parallel.py,sha256=yvRZvZWPR5slM51i08m7sYx-Mvsb5oryCqqJXVoJ8tQ,2190
121
124
  sonusai/utils/path_info.py,sha256=QY7iQ0nYpeEDnPN9RyPh4DsgYmVYsLrrlAzKuzkqX1o,118
122
- sonusai/utils/print_mixture_details.py,sha256=fUYccs25KF-fpgT9wK3PEKkc18gWfIO99zyiUuNWVBM,2979
125
+ sonusai/utils/print_mixture_details.py,sha256=7HObpltY60WdPcrC9lcT3zYHkw-clEZZQbESM9a9DKk,2521
123
126
  sonusai/utils/rand.py,sha256=yQMpYuJFi8GkIocDYIT3ESfNYEgWA7KZMWpgjqr0UXQ,225
124
127
  sonusai/utils/ranges.py,sha256=-TtAR0Vg_j4kYtJOvEOYQllBZEat_KfUKsfRxr5oj-o,1235
125
128
  sonusai/utils/read_predict_data.py,sha256=ZcIlfwxfav8Lh3gye7V150t0c6k-C9y5SbzWtDQ6TuU,1037
@@ -131,7 +134,7 @@ sonusai/utils/tokenized_shell_vars.py,sha256=EDrrAgz5lJ0RBAjLcTJt1MeyjhbNZiqXkym
131
134
  sonusai/utils/write_audio.py,sha256=IHzrJoFtFcea_J6wo6QSiojRkgnNOzAEcg-z0rFV7nU,810
132
135
  sonusai/utils/yes_or_no.py,sha256=0h1okjXmDNbJp7rZJFR2V-HFU1GJDm3YFTUVmYExkOU,263
133
136
  sonusai/vars.py,sha256=m8pdgfR4A6A9TCGf_rok6jPAT5BgrEsYXTSISIh1nrI,1163
134
- sonusai-1.0.8.dist-info/METADATA,sha256=UABc8ZNaqTCnFNoOgmRokBRF9G7RI58MDP1B081075c,2652
135
- sonusai-1.0.8.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
136
- sonusai-1.0.8.dist-info/entry_points.txt,sha256=zMNjEphEPO6B3cD1GNpit7z-yA9tUU5-j3W2v-UWstU,92
137
- sonusai-1.0.8.dist-info/RECORD,,
137
+ sonusai-1.0.10.dist-info/METADATA,sha256=kliBuHLQIEAUTsv9Hav0VWo1IGQxpTao5bl233yOnaQ,2695
138
+ sonusai-1.0.10.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
139
+ sonusai-1.0.10.dist-info/entry_points.txt,sha256=zMNjEphEPO6B3cD1GNpit7z-yA9tUU5-j3W2v-UWstU,92
140
+ sonusai-1.0.10.dist-info/RECORD,,