speaker_helper package
Subpackages
- speaker_helper.eval package
- Submodules
- Module contents
Submodules
- speaker_helper.api module
- speaker_helper.cli module
- speaker_helper.click_cli module
- speaker_helper.client module
- speaker_helper.cloning module
- speaker_helper.config module
- speaker_helper.engine module
- speaker_helper.profiles module
- speaker_helper.router module
- Module summary
- Usage example
- Author
OperatingPointRouteDecisionRouteDecision.apply()RouteDecision.backendRouteDecision.candidates_consideredRouteDecision.conditionRouteDecision.confidenceRouteDecision.engineRouteDecision.first_chunk_sentencesRouteDecision.justificationRouteDecision.mean_rtfRouteDecision.modeRouteDecision.pareto_sizeRouteDecision.qualityRouteDecision.quality_sourceRouteDecision.rtf_sourceRouteDecision.stream_concurrencyRouteDecision.to_dict()
RouteRequestdefault_operating_points()route()route_settings()
- speaker_helper.sources module
- speaker_helper.speaker module
- speaker_helper.text module
- speaker_helper.transcription module
- speaker_helper.types module
Module contents
speaker-helper — professional text-to-speech, offline and streaming.
Module summary
speaker-helper is the inverse of vocal-helper: it turns text into
speech. It wraps the local Voicebox
engine behind a small, typed API with two modes — offline (whole text →
one audio) and streaming (sentence-split, low time-to-first-audio) — and
ships a CLI and a REST API. It runs locally (conda + pip) or as a Docker
server.
The default engine is kokoro, which synthesises faster than real time on
CPU (real-time factor well below 1.0).
Usage example
>>> from speaker_helper import Speaker, Settings
>>> spk = Speaker(Settings.from_mapping({"engine": "kokoro", "language": "fr"}))
>>> # spk.save("Bonjour le monde.", "hello.wav") # requires a running Voicebox
See EXAMPLES.md for a runnable cookbook.
- class speaker_helper.AudioResult(wav_bytes, sample_rate, duration_s, compute_s, text, voice_id, language)[source]
Bases:
objectA synthesised audio payload and its measured metadata.
- Parameters:
wav_bytes (bytes) – The complete WAV file contents (RIFF header + PCM), ready to write to disk or stream to a client.
sample_rate (int) – Sample rate of the audio in Hz.
duration_s (float) – Audio duration in seconds.
compute_s (float) – Wall-clock seconds spent producing this audio (network + synthesis).
text (str) – The text that was synthesised.
voice_id (str) – The voice used.
language (str) – The language used.
Notes
rtf(real-time factor) is derived, not stored:compute_s / duration_s. A value below1.0means synthesis was faster than real time — the operating point speaker-helper aims for.
- class speaker_helper.LanguageProfile(language, engine='kokoro', voice_id='', normalize=True, first_chunk_sentences=1, stream_concurrency=1, measured_rtf=None, measured_quality=None)[source]
Bases:
objectHyperparameters and a measured operating point for one language.
- Parameters:
language (str) – ISO-639-1 code this profile targets.
engine (str) – Engine/model id to use for this language.
voice_id (str) – Preset voice id; empty means “auto-pick a voice for the language”.
normalize (bool) – Ask the engine to loudness-normalise the output.
first_chunk_sentences (int) – Streaming producer granularity — sentences in the first emitted chunk.
1minimises time-to-first-audio.stream_concurrency (int) – Streaming consumer parallelism — chunks synthesised at once.
1is a strict pipeline (lowest first-audio latency).measured_rtf (float or None) – Mean real-time factor measured for this language, or
Noneif untuned.measured_quality (float or None) – Quality score in
[0, 1]measured for this language, orNone.
- apply(settings=None)[source]
Return
settings(or fresh defaults) with this profile applied.- Parameters:
settings (Settings or None) – Base configuration to derive from;
Noneuses defaults.- Returns:
A copy carrying this profile’s language, engine, voice, and producer granularity.
stream_concurrencyis aSpeakerargument, not aSettingsfield, so pass it separately (seefrom_profile()).- Return type:
- with_measurement(report)[source]
Return a copy with
measured_rtf/measured_qualityfrom a report.- Parameters:
report (EvalReport) – A report for this language (duck-typed: needs
mean_rtfandquality).- Returns:
A copy carrying the measured operating point.
- Return type:
- class speaker_helper.MockEngine(settings)[source]
Bases:
objectA deterministic, serverless TTS backend for tests and evaluation.
It produces a real (decodable) WAV whose duration is proportional to the input length at a fixed speaking rate, and reports a compute time derived from a configured real-time factor. No audio model runs and no network call is made, so behaviour is reproducible and fast — ideal for CI, for exercising the evaluation layer’s anomaly checks, and for proving that engine-agnostic code paths work against any backend.
- Parameters:
settings (Settings) – Used for
languageandenginelabels and for themockknobs (rtf,chars_per_sec,sample_rate,amplitude,frequency_hz) read viaSettings.mock.
Notes
The audio is a quiet sine tone (not silence) so evaluation’s “empty audio” and “clipping” checks see a realistic, non-degenerate signal. Set
mock.amplitudeabove 1.0 to deliberately synthesise a clipping signal for testing the anomaly detector.- async clone_voice(name, samples, *, language=None)[source]
Pretend to clone a voice; return a deterministic id (no audio model).
Validates that at least one sample is provided (matching the real engine’s contract) but performs no synthesis-model work, so cloning is testable without a server.
- Parameters:
name (str)
samples (list[VoiceSample])
language (str | None)
- Return type:
- async synthesize(text, *, language=None)[source]
Synthesise
textinto a deterministic sine-tone WAV.- Parameters:
- Returns:
A decodable WAV plus duration and a compute time equal to
duration * rtf(soresult.rtfreproduces the configured RTF).- Return type:
- Raises:
ValueError – If
textis empty or whitespace-only.
- class speaker_helper.OperatingPoint(engine, quality, mean_rtf, quality_source='prior', rtf_source='unknown', backend='voicebox', language=None)[source]
Bases:
objectOne engine’s position on the quality↔speed plane, with provenance.
- Parameters:
engine (str) – Engine/model id (e.g.
"kokoro").quality (float) – Quality score in
[0, 1]to maximise (measured chrF or a prior).mean_rtf (float or None) – Mean real-time factor to minimise;
Nonewhen never measured (the engine then cannot be routed for the online condition).quality_source (str) –
"measured_chrf"or"prior"— howqualitywas obtained.rtf_source (str) –
"measured","estimate", or"unknown"— howmean_rtfwas obtained.backend (str) – The backend that serves this engine (default
"voicebox").language (str or None) – Language the measurement pertains to, when language-specific.
- class speaker_helper.RouteDecision(condition, engine, backend, mode, first_chunk_sentences, stream_concurrency, quality, mean_rtf, quality_source, rtf_source, confidence, justification, candidates_considered, pareto_size)[source]
Bases:
objectA concrete, justified operating point the caller can act on.
- Parameters:
condition (str) – The condition this decision answers.
engine (str) – The chosen engine and the backend that serves it.
backend (str) – The chosen engine and the backend that serves it.
mode (str) –
"streaming"(online) or"offline".first_chunk_sentences (int) – Streaming producer/consumer knobs implied by the condition (only meaningful when
mode == "streaming").stream_concurrency (int) – Streaming producer/consumer knobs implied by the condition (only meaningful when
mode == "streaming").quality (float) – The chosen point’s quality score.
mean_rtf (float or None) – The chosen point’s mean RTF (
Noneonly in the offline, RTF-unknown fallback).quality_source (str) – Provenance of the two axes (see
OperatingPoint).rtf_source (str) – Provenance of the two axes (see
OperatingPoint).confidence (str) –
"high"(both axes measured),"medium"(one measured), or"low"(both from priors/estimates).justification (str) – A human-readable, number-citing explanation of why this point won.
candidates_considered (int) – How many candidates were weighed and how many survived to the Pareto front — for auditability.
pareto_size (int) – How many candidates were weighed and how many survived to the Pareto front — for auditability.
- apply(settings=None)[source]
Return
settings(or fresh defaults) reconfigured for this decision.- Parameters:
settings (Settings or None) – Base configuration to derive from;
Noneuses defaults.- Returns:
A copy carrying the chosen backend, engine, mode, and (for streaming) the first-chunk granularity.
stream_concurrencyis aSpeakerargument, not aSettingsfield, so read it off this decision separately (seefrom_route()).- Return type:
- class speaker_helper.RouteRequest(condition, language='fr', rtf_ceiling=0.8, rtf_budget=None, quality_floor=None, require_measured_rtf=True)[source]
Bases:
objectWhat the caller needs; the router turns it into a justified choice.
- Parameters:
condition (str) –
"online_realtime"(delay-bounded streaming) or"offline"(throughput / quality). SeeCONDITIONS.language (str) – ISO-639-1 target language (drives the default catalogue and profile).
rtf_ceiling (float) – Online only: the hard
mean_rtfbound an engine must beat to be feasible. Defaults toDEFAULT_RTF_CEILING(0.8).rtf_budget (float or None) – Offline only: optional patience cap on
mean_rtf(None= no cap, quality is all that matters).quality_floor (float or None) – Reject any candidate below this quality, in both conditions (
None= no floor).require_measured_rtf (bool) – Online only: refuse engines whose RTF was never measured (default
True— do not claim an untimed engine keeps up).
- class speaker_helper.Settings(voicebox=<factory>, backend='voicebox', engine='kokoro', voice_id='', language='fr', normalize=True, mode='offline', first_chunk_sentences=1, mock=<factory>, clone=<factory>)[source]
Bases:
objectTop-level speaker-helper configuration.
- Parameters:
voicebox (VoiceboxConfig) – Connection details for the Voicebox engine.
backend (str) – Which TTS backend to drive:
"voicebox"(the real engine, default) or"mock"(deterministic, serverless — used by tests and the evaluation layer). The backend is an implementation detail; the rest of the package talks only to theTTSEngineprotocol. Seespeaker_helper.engine.available_backends().engine (str) – Backend-specific engine/model id. For Voicebox,
kokorois fast enough for real-time on CPU.voice_id (str) – Preset voice id. Empty (default) means “auto-pick a voice whose language matches
language”.language (str) – ISO-639-1 target language (e.g.
"fr").normalize (bool) – Ask Voicebox to loudness-normalise the output.
mode (str) –
"offline"or"streaming".first_chunk_sentences (int) – Streaming only: sentences in the first emitted chunk (1 → lowest TTFA).
Notes
Precedence, lowest to highest: dataclass defaults →
settings.yaml→SPEAKER_HELPER_*environment variables.- classmethod from_mapping(mapping)[source]
Build settings from a plain mapping (unknown keys ignored).
- classmethod load(path=None)[source]
Load settings from a YAML file if present, else defaults + env.
- voicebox: VoiceboxConfig
- class speaker_helper.Speaker(settings=None, *, engine=None, stream_concurrency=1)[source]
Bases:
objectTurn text into speech via a pluggable TTS engine, offline or streaming.
The concrete engine (Voicebox, mock, …) is selected by
settings.backendand reached only through theTTSEngineprotocol, soSpeakernever depends on a specific backend.- Parameters:
settings (Settings or None) – Configuration; when
None,Settings.load()is used (reads./settings.yamlif present, thenSPEAKER_HELPER_*env vars).engine (TTSEngine or None) – Inject a ready backend instance (e.g. a mock in tests). When
None(default), one is built fromsettingsviacreate_engine().stream_concurrency (int) – Maximum number of chunks synthesised in parallel in streaming mode. The default of
1(a strict pipeline) gives the lowest time to first audio: the first chunk gets the whole engine to itself, and because kokoro synthesises faster than real time (RTF < 1) each later chunk is ready before playback of the previous one finishes. Raise it only to favour total throughput over first-audio latency.
Examples
>>> from speaker_helper import Speaker, Settings >>> spk = Speaker(Settings.from_mapping({"engine": "kokoro", "language": "fr"})) >>> spk.settings.engine 'kokoro'
- property client: TTSEngine
Backward-compatible alias for
engine.Earlier releases exposed the backend as
speaker.client(it was always a Voicebox client). It is now anyTTSEngine; this alias keeps old call sites working.
- async clone_voice(name=None, samples=None, *, language=None)[source]
Clone a voice and make this speaker synthesise with it.
- Parameters:
name (str or None) – Profile name for the clone (idempotency key). Defaults to the configured clone name, or
"ref-malo".samples (list of VoiceSample or None) – Reference recordings. When
None, they are resolved fromsettings.clone— falling back to the bundled ref-malo reference. A sample without a transcript is transcribed withvocal-helper.language (str or None) – Language of the cloned voice (defaults to the configured language).
- Returns:
The cloned voice/profile id.
- Return type:
Examples
>>> from speaker_helper import Speaker, Settings, VoiceSample >>> spk = Speaker(Settings.from_mapping({"backend": "mock"})) >>> # give only the audio; the transcript is derived automatically: >>> # await spk.clone_voice("malo", [VoiceSample("ref.wav", "")])
- classmethod from_profile(profile, settings=None, *, engine=None)[source]
Build a
Speakerfrom a per-language operating profile.Applies the profile’s language/engine/voice/producer settings and its
stream_concurrency(a consumer-parallelism argument, not aSettingsfield).- Parameters:
profile (LanguageProfile) – The profile to apply (see
speaker_helper.profiles).settings (Settings or None) – Base configuration to derive from;
Noneuses defaults.engine (TTSEngine or None) – Optional injected backend (e.g. a mock in tests).
- Returns:
A speaker configured for the profile’s language.
- Return type:
- classmethod from_route(condition, *, language='fr', settings=None, engine=None, **route_kwargs)[source]
Build a
Speakerfrom a routed operating point.Asks
speaker_helper.router.route()to choose an engine + mode from measured quality↔speed evidence for the given condition ("online_realtime"or"offline"), applies that choice, and forwards the decision’sstream_concurrency.- Parameters:
condition (str) –
"online_realtime"(delay-bounded streaming) or"offline".language (str) – Target language driving the candidate catalogue.
settings (Settings or None) – Base configuration to reconfigure;
Noneuses defaults.engine (TTSEngine or None) – Optional injected backend (e.g. a mock in tests); when given, the routing choice still sets language/mode but this engine is used.
**route_kwargs – Extra
RouteRequestfields (rtf_ceiling,rtf_budget,quality_floor,require_measured_rtf).
- Returns:
A speaker configured for the routed operating point. The chosen
RouteDecisionis attached asspeaker.routefor inspection / logging.- Return type:
- save(text, path, *, language=None)[source]
Synthesise
textand write the WAV topath(blocking).- Parameters:
- Returns:
The synthesised audio (also written to
path).- Return type:
- async say(text, *, language=None)[source]
Synthesise
textinto oneAudioResult(offline mode).- Parameters:
- Returns:
The synthesised audio and its metadata.
- Return type:
- say_sync(text, *, language=None)[source]
Blocking wrapper around
say()for non-async callers.- Parameters:
- Returns:
The synthesised audio.
- Return type:
- Raises:
RuntimeError – If called from within a running event loop (use
await say).
- async stream(text, *, language=None)[source]
Yield audio chunks as they are synthesised (streaming mode).
- Parameters:
- Yields:
StreamChunk – Chunks in order. The first carries
ttfa_s(time to first audio); the last hasis_final=True.- Return type:
Notes
Synthesis is pipelined up to
stream_concurrencychunks at a time so later chunks are produced while earlier ones are being consumed, but emission order matches the text.
- async voices(engine=None)[source]
List preset voices for an engine (defaults to the configured one).
- async warmup()[source]
Prime the engine so the first real request is not the slow one.
Synthesises a tiny throwaway utterance, which forces backend-specific one-time costs (profile bootstrap, model download / load) to happen now rather than on a user’s first call. Failures are logged and swallowed — warm-up is best-effort and must never break startup.
- Return type:
None
- class speaker_helper.StreamChunk(seq, audio, ttfa_s=None, is_final=False)[source]
Bases:
objectOne chunk of a streaming synthesis (one sentence-sized unit).
- Parameters:
seq (int) – Zero-based index of this chunk within the stream.
audio (AudioResult) – The synthesised audio for this chunk.
ttfa_s (float | None) – Time-to-first-audio in seconds, set only on the first chunk (
seq == 0);Noneafterwards.is_final (bool) –
Truefor the last chunk of the stream.
- audio: AudioResult
- class speaker_helper.TTSEngine(*args, **kwargs)[source]
Bases:
ProtocolThe minimal surface every speaker-helper backend must provide.
A backend is any object exposing these four coroutines. Everything else in the package is written against this protocol, never against a concrete engine, so the backend stays swappable.
Notes
@runtime_checkableletsisinstance(obj, TTSEngine)verify the method names are present (not their signatures) — handy in tests and factories.- async clone_voice(name, samples, *, language=None)[source]
Clone a voice from reference
samplesand return its id.Implementations should be idempotent on
name(reuse an existing clone rather than duplicating). A backend that cannot clone may raiseNotImplementedError.- Parameters:
name (str)
samples (list[VoiceSample])
language (str | None)
- Return type:
- async synthesize(text, *, language=None)[source]
Synthesise
textinto oneAudioResult.- Parameters:
- Return type:
- class speaker_helper.Voice(voice_id, name, language, gender='', engine='')[source]
Bases:
objectA preset voice offered by a Voicebox engine.
- Parameters:
voice_id (str) – Engine-specific identifier (e.g.
"ff_siwis"for kokoro French).name (str) – Human-readable display name.
language (str) – ISO-639-1 language code the voice speaks (e.g.
"fr","en").gender (str) – Reported voice gender, or
""when the engine does not expose one.engine (str) – Engine the voice belongs to (e.g.
"kokoro").
- class speaker_helper.VoiceList(engine, voices=<factory>)[source]
Bases:
objectVoices available for an engine.
- Parameters:
- class speaker_helper.VoiceSample(audio, reference_text)[source]
Bases:
objectOne reference recording used to clone a voice.
- Parameters:
Notes
Keep samples short and clean (a few seconds of clear speech). Provide several for a more robust clone.
- filename()[source]
Return a filename to send with the upload (from the path, or a default).
- Return type:
- class speaker_helper.VoiceboxClient(settings)[source]
Bases:
objectA typed async client over the Voicebox TTS REST API.
- Parameters:
settings (Settings) – Connection and voice configuration. See
speaker_helper.config.Settings.
Notes
The client owns an
httpx.AsyncClient. Use it as an async context manager (async with) or callaclose()when done. A single client caches the resolvedprofile_idso repeated syntheses skip the profile bootstrap.- async aclose()[source]
Close the underlying HTTP client and release its connections.
- Return type:
None
- async clone_voice(name, samples, *, language=None)[source]
Clone a voice from reference
samplesand use it for synthesis.- Parameters:
name (str) – Profile name for the clone (idempotency key). A matching profile is reused rather than duplicated.
samples (list of VoiceSample) – Reference recordings. Any sample without a
reference_textis transcribed withvocal-helperbefore upload.language (str or None) – Language of the cloned voice (defaults to the configured language).
- Returns:
The cloned profile id (also set as this client’s active profile).
- Return type:
- Raises:
VoiceboxError – On a Voicebox error.
- async ensure_profile()[source]
Return a usable
profile_id, creating a preset one idempotently.- Returns:
The profile id to pass to synthesis calls.
- Return type:
Notes
Reuses an existing profile for the resolved preset voice rather than creating a duplicate (Voicebox rejects duplicate names), so a fresh client never fails on the second run. Safe under concurrency via an internal lock.
- async health()[source]
Return the Voicebox
/healthpayload.- Returns:
The server health document (backend variant, gpu availability, …).
- Return type:
- Raises:
VoiceboxError – If the server is unreachable or returns a non-2xx status.
- async synthesize(text, *, language=None)[source]
Synthesise
textinto a singleAudioResult.- Parameters:
- Returns:
The synthesised WAV plus measured duration and compute time.
- Return type:
- Raises:
ValueError – If
textis empty or whitespace-only.VoiceboxError – On a Voicebox error or an undecodable response.
Notes
Uses
POST /generate/stream(synchronous WAV bytes). The first call for a not-yet-downloaded engine model transparently falls back to the async/generatepath, which triggers the download.
- class speaker_helper.VoiceboxConfig(host='127.0.0.1', port=17493, timeout_s=300.0, max_retries=2, retry_backoff_s=0.5)[source]
Bases:
objectWhere the Voicebox REST service lives.
- Parameters:
host (str) – Hostname or IP of the Voicebox server. Default
127.0.0.1.port (int) – TCP port. Voicebox’s native default is
17493; the bundleddocker-composemaps the container to17600on the host.timeout_s (float) – Per-request timeout in seconds. The first synthesis of a new engine pays a model download, so keep this generous.
max_retries (int) – How many times to retry a request that fails on a transient error (network/transport error or a 5xx from the engine).
0disables retries. Client errors (4xx) are never retried.retry_backoff_s (float) – Base delay for exponential backoff between retries: attempt
kwaitsretry_backoff_s * 2**(k-1)seconds.
- exception speaker_helper.VoiceboxError[source]
Bases:
RuntimeErrorRaised when Voicebox returns an error or an unexpected response.
- speaker_helper.chunk_for_streaming(text, first_chunk_sentences=1)[source]
Group sentences into synthesis chunks, keeping the first one small.
- Parameters:
- Returns:
Chunks of text to synthesise in order. The first chunk holds
first_chunk_sentencessentences; every remaining sentence is its own chunk so downstream audio keeps flowing steadily.- Return type:
Examples
>>> chunk_for_streaming("A. B. C.", first_chunk_sentences=1) ['A.', 'B.', 'C.'] >>> chunk_for_streaming("A. B. C.", first_chunk_sentences=2) ['A. B.', 'C.']
- speaker_helper.create_engine(settings)[source]
Instantiate the backend named by
settings.backend.- Parameters:
settings (Settings) – Configuration; its
backendfield selects the engine.- Returns:
A ready-to-use engine instance.
- Return type:
- Raises:
ValueError – If
settings.backendnames no registered backend.
- speaker_helper.default_operating_points(language='fr')[source]
Build the fallback candidate set for
languagefrom profiles + priors.The per-language profile supplies the measured kokoro operating point (RTF from native-MLX tuning; quality is the engine prior until a round-trip recalibrates it). Every other engine in the priors table contributes a quality-only candidate with an unknown RTF — enough to reason about offline quality, but deliberately not enough to claim it keeps up online.
- Parameters:
language (str) – Language whose profile seeds the measured kokoro point.
- Returns:
One candidate per known engine, provenance flagged on both axes.
- Return type:
- speaker_helper.profile_for(language)[source]
Return the profile for
language(a default profile if none is defined).- Parameters:
language (str)
- Return type:
- speaker_helper.register_backend(name, factory)[source]
Register (or override) a backend factory under
name.- Parameters:
name (str) – Backend identifier used in
settings.backend(case-insensitive).factory (callable) –
Settings -> TTSEngine. Called lazily bycreate_engine().
- Return type:
None
- speaker_helper.route(request, *, points=None, reports=None)[source]
Choose a justified engine + mode for
requestfrom the evidence.- Parameters:
request (RouteRequest) – The condition and its constraints.
points (sequence of OperatingPoint or None) – Explicit candidate operating points. When
Noneandreportsis alsoNone, the built-in catalogue forrequest.languageis used.reports (sequence of EvalReport or None) – Measured reports to derive candidates from (highest confidence). Takes precedence over
pointswhen both are given.
- Returns:
The chosen operating point, mode, streaming knobs, and a number-citing justification.
- Return type:
- Raises:
ValueError – If
request.conditionis unknown, or no candidate satisfies the condition’s constraints (e.g. no engine keeps up online).
Examples
>>> route(RouteRequest(condition="offline", language="fr")).mode 'offline'
- speaker_helper.route_settings(condition, *, language='fr', settings=None, **request_kwargs)[source]
Convenience: route for
conditionand return applied settings + decision.- Parameters:
condition (str) –
"online_realtime"or"offline".language (str) – Target language.
settings (Settings or None) – Base settings to reconfigure;
Noneuses defaults.**request_kwargs – Extra
RouteRequestfields (rtf_ceiling,rtf_budget,quality_floor,require_measured_rtf).
- Returns:
Settings reconfigured for the decision, and the decision itself (its
stream_concurrencystill needs forwarding toSpeaker).- Return type:
tuple of (Settings, RouteDecision)
- speaker_helper.split_sentences(text)[source]
Split text into sentence-sized, non-empty, stripped units.
- Parameters:
text (str) – Arbitrary text, possibly multi-sentence and multi-line.
- Returns:
Sentences in order, each stripped of surrounding whitespace, with their terminating punctuation preserved. Text without any terminator returns a single-element list (the whole stripped input); empty or whitespace-only input returns an empty list.
- Return type:
Examples
>>> split_sentences("Un. Deux. Trois.") ['Un.', 'Deux.', 'Trois.'] >>> split_sentences("no terminator here") ['no terminator here'] >>> split_sentences(" ") []
- async speaker_helper.tune_profiles(base_settings, languages, **eval_kwargs)[source]
Measure a set of languages and return profiles carrying the results.
A thin convenience over
run_multilang_eval(): it runs the evaluation per language and folds each report’s RTF/quality into the correspondingLanguageProfile.- Parameters:
- Returns:
Mapping
language -> LanguageProfilewith measured RTF/quality.- Return type: