Skip to content

Commit dc7437b

Browse files
authored
Remove dataclassy for Python 3.14 compatibility (#947)
1 parent 70c7251 commit dc7437b

31 files changed

+149
-134
lines changed

ci/docker_environment.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ dependencies:
1010
- tqdm
1111
- requests
1212
- pyyaml
13-
- dataclassy
1413
- kaldi=*=*cpu*
1514
- pynini
1615
- openfst

environment.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ dependencies:
99
- tqdm
1010
- requests
1111
- pyyaml
12-
- dataclassy
1312
- kaldi=*=*cpu*
1413
- scipy
1514
- pynini

github_environment.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@ channels:
22
- conda-forge
33
dependencies:
44
- python=3.12
5-
- numpy<2.1.0
5+
- numpy<2.4.0
66
- librosa
77
- pysoundfile
88
- tqdm
99
- requests
1010
- pyyaml
11-
- dataclassy
1211
- kaldi=*=*cpu*
1312
- scipy
1413
- pynini

montreal_forced_aligner/acoustic_modeling/lda.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Class definitions for LDA trainer"""
22
from __future__ import annotations
33

4+
import dataclasses
45
import logging
56
import os
67
import shutil
@@ -35,6 +36,7 @@
3536
logger = logging.getLogger("mfa")
3637

3738

39+
@dataclasses.dataclass(slots=True)
3840
class LdaAccStatsArguments(MfaArguments):
3941
"""Arguments for :func:`~montreal_forced_aligner.acoustic_modeling.lda.LdaAccStatsFunction`"""
4042

@@ -43,6 +45,7 @@ class LdaAccStatsArguments(MfaArguments):
4345
lda_options: MetaDict
4446

4547

48+
@dataclasses.dataclass(slots=True)
4649
class CalcLdaMlltArguments(MfaArguments):
4750
"""Arguments for :func:`~montreal_forced_aligner.acoustic_modeling.lda.CalcLdaMlltFunction`"""
4851

montreal_forced_aligner/acoustic_modeling/monophone.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Class definitions for Monophone trainer"""
22
from __future__ import annotations
33

4+
import dataclasses
45
import logging
56
import typing
67
from pathlib import Path
@@ -27,6 +28,7 @@
2728
logger = logging.getLogger("mfa")
2829

2930

31+
@dataclasses.dataclass(slots=True)
3032
class MonoAlignEqualArguments(MfaArguments):
3133
"""Arguments for :func:`~montreal_forced_aligner.acoustic_modeling.monophone.MonoAlignEqualFunction`"""
3234

montreal_forced_aligner/acoustic_modeling/sat.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Class definitions for Speaker Adapted Triphone trainer"""
22
from __future__ import annotations
33

4+
import dataclasses
45
import logging
56
import os
67
import shutil
@@ -36,6 +37,7 @@
3637
logger = logging.getLogger("mfa")
3738

3839

40+
@dataclasses.dataclass(slots=True)
3941
class AccStatsTwoFeatsArguments(MfaArguments):
4042
"""Arguments for :func:`~montreal_forced_aligner.acoustic_modeling.sat.AccStatsTwoFeatsFunction`"""
4143

montreal_forced_aligner/acoustic_modeling/trainer.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import shutil
99
import time
1010
import typing
11+
from dataclasses import dataclass
1112
from pathlib import Path
1213
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple
1314

@@ -42,14 +43,10 @@
4243
from montreal_forced_aligner.utils import log_kaldi_errors, run_kaldi_function
4344

4445
if TYPE_CHECKING:
45-
from dataclasses import dataclass
46-
4746
from montreal_forced_aligner.acoustic_modeling.base import AcousticModelTrainingMixin
4847
from montreal_forced_aligner.acoustic_modeling.pronunciation_probabilities import (
4948
PronunciationProbabilityTrainer,
5049
)
51-
else:
52-
from dataclassy import dataclass
5350

5451
__all__ = ["TrainableAligner", "TransitionAccFunction", "TransitionAccArguments"]
5552

montreal_forced_aligner/acoustic_modeling/triphone.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Class definitions for TriphoneTrainer"""
22
from __future__ import annotations
33

4+
import dataclasses
45
import logging
56
import os
67
import typing
@@ -34,13 +35,15 @@
3435
logger = logging.getLogger("mfa")
3536

3637

38+
@dataclasses.dataclass(slots=True)
3739
class TreeStatsArguments(MfaArguments):
3840
"""Arguments for :func:`~montreal_forced_aligner.acoustic_modeling.triphone.tree_stats_func`"""
3941

4042
working_directory: Path
4143
model_path: Path
4244

4345

46+
@dataclasses.dataclass(slots=True)
4447
class ConvertAlignmentsArguments(MfaArguments):
4548
"""Arguments for :func:`~montreal_forced_aligner.acoustic_modeling.triphone.ConvertAlignmentsFunction`"""
4649

montreal_forced_aligner/alignment/adapting.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ def meta(self) -> MetaDict:
287287
"clitic_marker": self.clitic_marker,
288288
"position_dependent_phones": self.position_dependent_phones,
289289
},
290+
"language": str(self.language),
290291
"oov_phone": self.oov_phone,
291292
"optional_silence_phone": self.optional_silence_phone,
292293
"silence_probability": self.silence_probability,

montreal_forced_aligner/alignment/base.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -282,9 +282,7 @@ def analyze_alignments(self, calculate_duration_statistics=True):
282282
)
283283
.join(Utterance.file)
284284
.join(Utterance.speaker)
285-
.order_by(
286-
sqlalchemy.desc(Utterance.duration_deviation)
287-
)
285+
.order_by(sqlalchemy.desc(Utterance.duration_deviation))
288286
)
289287
for row in utterances:
290288
writer.writerow([*row])
@@ -1080,7 +1078,7 @@ def collect_alignments(self) -> None:
10801078
self.db_path.as_posix(),
10811079
"--cmd",
10821080
".mode csv",
1083-
f".import {word_csv_path.as_posix()} word_interval_temp",
1081+
f'.import "{word_csv_path.as_posix()}" word_interval_temp',
10841082
]
10851083
)
10861084
subprocess.check_call(
@@ -1089,7 +1087,7 @@ def collect_alignments(self) -> None:
10891087
self.db_path.as_posix(),
10901088
"--cmd",
10911089
".mode csv",
1092-
f".import {phone_csv_path.as_posix()} phone_interval_temp",
1090+
f'.import "{phone_csv_path.as_posix()}" phone_interval_temp',
10931091
]
10941092
)
10951093
with self.session() as session:
@@ -1419,7 +1417,7 @@ def evaluate_alignments(
14191417
to_comp = []
14201418
score_func = functools.partial(
14211419
align_phones,
1422-
silence_phone=self.optional_silence_phone,
1420+
silence_phones={self.optional_silence_phone},
14231421
custom_mapping=mapping,
14241422
debug=config.DEBUG,
14251423
)
@@ -1472,7 +1470,8 @@ def evaluate_alignments(
14721470
to_comp.append((reference_phones, comparison_phones))
14731471
with ThreadPool(1) as pool:
14741472
gen = pool.starmap(score_func, to_comp)
1475-
for i, (score, phone_error_rate, errors) in enumerate(gen):
1473+
for i, result in enumerate(gen):
1474+
score, phone_error_rate, errors = result[:3]
14761475
if score is None:
14771476
continue
14781477
u = indices[i]

0 commit comments

Comments
 (0)