Space: port app.py to the 0.1.1 API (synthesize, provenance fingerprint)
Browse files
app.py
CHANGED
|
@@ -192,7 +192,7 @@ def _stats(result: lk.Result, model: str) -> str:
|
|
| 192 |
seconds = len(result.audio) / result.sample_rate
|
| 193 |
return (
|
| 194 |
f"**{seconds:.1f} s of audio.** {result.timings.describe(seconds)}\n\n"
|
| 195 |
-
f"`{model}` 路 `algo[{result.algorithm_fingerprint}]` 路 seed `{result.seed}` 路 "
|
| 196 |
f"speed `{result.speed:g}x` 路 {result.sample_rate} Hz"
|
| 197 |
)
|
| 198 |
|
|
@@ -279,7 +279,7 @@ def _speak_duration(text, name, model, language, seed, speed):
|
|
| 279 |
@spaces.GPU(duration=_speak_duration)
|
| 280 |
def speak(text: str, name: str, model: str, language: str, seed: float, speed: float):
|
| 281 |
text = _check(text, MAX_CHARS)
|
| 282 |
-
result = _engine(model).
|
| 283 |
text,
|
| 284 |
PROFILES[name],
|
| 285 |
seed=int(seed),
|
|
@@ -306,11 +306,11 @@ def compare(text: str, name: str, seed: float):
|
|
| 306 |
profile = PROFILES[name]
|
| 307 |
out = {}
|
| 308 |
for key, engine in ENGINES.items():
|
| 309 |
-
result = engine.
|
| 310 |
out[key] = (
|
| 311 |
_write(result, voice=name, language=BY_NAME[name]["language_id"]),
|
| 312 |
len(result.audio) / result.sample_rate,
|
| 313 |
-
result.algorithm_fingerprint,
|
| 314 |
)
|
| 315 |
|
| 316 |
note = "\n".join(
|
|
@@ -394,7 +394,7 @@ def clone(example, mic, upload, consent: bool, text: str, model: str, language:
|
|
| 394 |
# and read its text through the English funnel.
|
| 395 |
profile = dataclasses.replace(profile, language=language or "en")
|
| 396 |
|
| 397 |
-
result = _engine(model).
|
| 398 |
text, profile, seed=int(seed), language=language or None, speed=float(speed)
|
| 399 |
)
|
| 400 |
return _write(result, voice=label, language=profile.language), _stats(result, model)
|
|
@@ -420,8 +420,8 @@ def probe(text: str, name: str, model: str, seed: float):
|
|
| 420 |
text = _check(text, MAX_PROBE_CHARS)
|
| 421 |
engine = _engine(model)
|
| 422 |
profile = PROFILES[name]
|
| 423 |
-
first = engine.
|
| 424 |
-
second = engine.
|
| 425 |
|
| 426 |
left, right = _sha256_audio(first.audio), _sha256_audio(second.audio)
|
| 427 |
verdict = "Identical." if left == right else "Different. Please report this."
|
|
@@ -433,7 +433,7 @@ def probe(text: str, name: str, model: str, seed: float):
|
|
| 433 |
"```",
|
| 434 |
f"render 1 sha256 {left}",
|
| 435 |
f"render 2 sha256 {right}",
|
| 436 |
-
f" algo[{first.algorithm_fingerprint}] seed {int(seed)} {model}",
|
| 437 |
"```",
|
| 438 |
"",
|
| 439 |
"Identical within this build and this device. loudkit promises a "
|
|
@@ -745,7 +745,7 @@ import loudkit as lk
|
|
| 745 |
|
| 746 |
engine = lk.load("{MODELS["loudr-1"]["repo"]}", revision="v0.1.1")
|
| 747 |
voice = lk.voice("kathleen", repo="{MODELS["loudr-1"]["repo"]}", revision="v0.1.1")
|
| 748 |
-
engine.
|
| 749 |
```
|
| 750 |
|
| 751 |
The same profile reads on the faster model by changing one string:
|
|
|
|
| 192 |
seconds = len(result.audio) / result.sample_rate
|
| 193 |
return (
|
| 194 |
f"**{seconds:.1f} s of audio.** {result.timings.describe(seconds)}\n\n"
|
| 195 |
+
f"`{model}` 路 `algo[{result.provenance.algorithm_fingerprint}]` 路 seed `{result.seed}` 路 "
|
| 196 |
f"speed `{result.speed:g}x` 路 {result.sample_rate} Hz"
|
| 197 |
)
|
| 198 |
|
|
|
|
| 279 |
@spaces.GPU(duration=_speak_duration)
|
| 280 |
def speak(text: str, name: str, model: str, language: str, seed: float, speed: float):
|
| 281 |
text = _check(text, MAX_CHARS)
|
| 282 |
+
result = _engine(model).synthesize(
|
| 283 |
text,
|
| 284 |
PROFILES[name],
|
| 285 |
seed=int(seed),
|
|
|
|
| 306 |
profile = PROFILES[name]
|
| 307 |
out = {}
|
| 308 |
for key, engine in ENGINES.items():
|
| 309 |
+
result = engine.synthesize(text, profile, seed=int(seed))
|
| 310 |
out[key] = (
|
| 311 |
_write(result, voice=name, language=BY_NAME[name]["language_id"]),
|
| 312 |
len(result.audio) / result.sample_rate,
|
| 313 |
+
result.provenance.algorithm_fingerprint,
|
| 314 |
)
|
| 315 |
|
| 316 |
note = "\n".join(
|
|
|
|
| 394 |
# and read its text through the English funnel.
|
| 395 |
profile = dataclasses.replace(profile, language=language or "en")
|
| 396 |
|
| 397 |
+
result = _engine(model).synthesize(
|
| 398 |
text, profile, seed=int(seed), language=language or None, speed=float(speed)
|
| 399 |
)
|
| 400 |
return _write(result, voice=label, language=profile.language), _stats(result, model)
|
|
|
|
| 420 |
text = _check(text, MAX_PROBE_CHARS)
|
| 421 |
engine = _engine(model)
|
| 422 |
profile = PROFILES[name]
|
| 423 |
+
first = engine.synthesize(text, profile, seed=int(seed))
|
| 424 |
+
second = engine.synthesize(text, profile, seed=int(seed))
|
| 425 |
|
| 426 |
left, right = _sha256_audio(first.audio), _sha256_audio(second.audio)
|
| 427 |
verdict = "Identical." if left == right else "Different. Please report this."
|
|
|
|
| 433 |
"```",
|
| 434 |
f"render 1 sha256 {left}",
|
| 435 |
f"render 2 sha256 {right}",
|
| 436 |
+
f" algo[{first.provenance.algorithm_fingerprint}] seed {int(seed)} {model}",
|
| 437 |
"```",
|
| 438 |
"",
|
| 439 |
"Identical within this build and this device. loudkit promises a "
|
|
|
|
| 745 |
|
| 746 |
engine = lk.load("{MODELS["loudr-1"]["repo"]}", revision="v0.1.1")
|
| 747 |
voice = lk.voice("kathleen", repo="{MODELS["loudr-1"]["repo"]}", revision="v0.1.1")
|
| 748 |
+
engine.synthesize("Hello from loudkit.", voice, seed=7).save("hello.wav")
|
| 749 |
```
|
| 750 |
|
| 751 |
The same profile reads on the faster model by changing one string:
|