SPEAKSEE LAB · POC

Corpus

The audio this POC measures against. Download real human voices from FLEURS and splice them into code-switching clips — you choose how long each clip stays in one language before it switches. Nothing here needs a terminal, an API key, or a decoder.

Fetch

done en, nl (dev) · 14.3s
fetching 2 language(s) into /app/fixtures/corpus/fleurs the index for each language is fetched first — a wrong locale fails there, in a second, instead of after the audio archive en (en_us): index … en (en_us): audio archive (this is the big one) … en (en_us): unpacking … en (en_us): 394 file(s) nl (nl_nl): index … nl (nl_nl): audio archive (this is the big one) … nl (nl_nl): unpacking … nl (nl_nl): 171 file(s) done — 2/2 language(s), 565 recording(s) on disk

What exists now

Read off disk — this calls nobody and downloads nothing.

0 clips in the manifest 0 tts 0 fleurs 0 human 0.0s of audio 2/12 languages downloaded

6 clips (112.0s of speech) are buildable right now from the pairs you have both halves of: en/nl, nl/en.

LanguageFLEURS configRecordingsAudio
English en en_us 394 3765.2s
Dutch nl nl_nl 171 1623.7s
Spanish es es_419
French fr fr_fr
German de de_de
Portuguese pt pt_br
Italian it it_it
Thai th th_th
Chinese zh cmn_hans_cn
Japanese ja ja_jp
Arabic ar ar_eg
Hindi hi hi_in

corpus /app/fixtures/corpus · FLEURS /app/fixtures/corpus/fleurs
decoder: no ffmpeg on PATH — 16000 Hz mono WAV is still ingested whatever its sample format (float and 24-bit are converted here); install ffmpeg for MP3, other sample rates and stereo

1 · Download recordings

FLEURS is CC-BY: ~2000 read sentences per language, real speakers, already 16 kHz mono WAV — nothing is ever resampled on the way in, and the sample format (this copy of the dataset is 32-bit float) is converted here, so no decoder is needed for this source. The index for each language is fetched first, so a wrong locale fails in a second instead of after the audio archive.

hundreds of MB per language — start with the pair you care about

2 · Build the clips

FLEURS is monolingual, so the POC makes the switch itself: it pulls sentences from a language until they cover the turn you asked for, cuts the assembled turn to exactly that length, inserts a short gap, and moves to the next language. Because it does the splicing it knows every boundary to the millisecond — which is the only thing that makes a switch latency mean anything.

Seconds per language is the knob worth playing with. A comma separates clips, a colon separates the turns inside one: 4 is one clip holding every language four seconds; 2,4,8 (the default) is three clips sweeping the length, because how short a turn a provider can still follow is a curve, not a number; 2:6 is one clip holding the first language two seconds against the second's six, which is what an uneven real conversation sounds like; and 2:6,4 is both. Seed picks which sentences are drawn; the same seed rebuilds the same corpus.

What these clips are, and are not. Real human voices, but a spliced switch: FLEURS recordings are monolingual, so the speaker changes at every language boundary. A real bilingual switch keeps one voice, and a provider doing speaker diarization can ride the speaker change to a decision it would not otherwise have made — so treat a switch latency measured here as an upper bound on speed, the way a TTS-built number is an upper bound on accuracy. Every clip carries that caveat in its provenance, so it travels with the numbers. For a real voice making a real switch, drop a recording into the human directory instead. FLEURS is CC-BY — credit the dataset in anything published from it.