Retain isolated number retry evidence and Korean voice register

This commit is contained in:
NINI
2026-10-05 01:24:19 +09:00
parent 1572ddda19
commit 906b467510
5 changed files with 124 additions and 30 deletions
+6 -4
View File
@@ -147,17 +147,18 @@ def reusable_entries(root, catalog, profile):
return result
def generate(catalog, profile, root, ids=None, synthesize=None, environment=None):
def generate(catalog, profile, root, ids=None, synthesize=None, environment=None, regenerate=False):
validate_inputs(catalog, profile)
selected = select_clips(catalog, ids)
root = Path(root)
previous = reusable_entries(root, catalog, profile)
previous = {} if regenerate else reusable_entries(root, catalog, profile)
run_id = datetime.now(timezone.utc).strftime('%Y%m%dT%H%M%S%fZ_') + uuid.uuid4().hex[:8]
run_dir = root / 'generated' / run_id
run_dir.mkdir(parents=True)
manifest = {'schemaVersion': 1, 'runId': run_id, 'createdUtc': datetime.now(timezone.utc).isoformat(),
'modelRevision': profile['modelRevision'], 'catalogHash': digest(catalog),
'profileHash': digest(profile), 'scope': 'selected' if ids else 'all',
'regenerateRequested': regenerate,
'requestedIds': [c['id'] for c in selected], 'environment': environment or {}, 'clips': []}
try:
for clip in selected:
@@ -236,6 +237,7 @@ def main():
parser.add_argument('--ids', help='comma separated IDs; absent means all catalog clips')
parser.add_argument('--validate-only', action='store_true')
parser.add_argument('--manifest', type=Path)
parser.add_argument('--regenerate', action='store_true', help='create a new take for selected IDs, preserving original runs')
args = parser.parse_args()
ids = args.ids.split(',') if args.ids else None
try:
@@ -250,8 +252,8 @@ def main():
else:
selected = select_clips(catalog, ids)
reusable = reusable_entries(root, catalog, profile)
synthesize, environment = (None, {'modelLoad': 'not_needed'}) if all(c['id'] in reusable for c in selected) else load_synthesizer(profile)
manifest = generate(catalog, profile, root, ids, synthesize, environment)
synthesize, environment = (None, {'modelLoad': 'not_needed'}) if not args.regenerate and all(c['id'] in reusable for c in selected) else load_synthesizer(profile)
manifest = generate(catalog, profile, root, ids, synthesize, environment, args.regenerate)
print('Manifest: ' + str(root / 'generated' / manifest['runId'] / 'manifest.json'))
errors = validate_manifest(manifest, catalog, profile, root, ids)
print(json.dumps({'validationScope': 'selected' if ids else 'all_required', 'ids': ids,
+11
View File
@@ -123,6 +123,17 @@ class VoiceHistoryTests(unittest.TestCase):
prepare(manifest, self.catalog, self.profile, self.root, target)
self.assertFalse(target.exists())
def test_new_take_preserves_original_and_other_clips(self):
first = self.run_generation()
original = (self.root / first['clips'][0]['file']).read_bytes()
second = voice.generate(self.catalog, self.profile, self.root, ids=['count_01'],
synthesize=self.fake, regenerate=True)
self.assertEqual('generated', second['clips'][0]['result'])
self.assertTrue(second['regenerateRequested'])
self.assertEqual(1, len(second['clips']))
self.assertEqual(original, (self.root / first['clips'][0]['file']).read_bytes())
self.assertEqual(['count_01', 'guide_collect', 'count_01'], self.calls)
if __name__ == '__main__':
unittest.main()