遇见数据集

dramabox-edge-top3-voice

收藏
魔搭社区2026-08-09 更新2026-08-09 收录
官方服务:

资源简介:

<!-- data/audio/*.tar is deliberately NOT declared as a config: the member keys contain a dot (`<group>.s<seed>.mp3`) because the requirement is that the audio key be byte-identical to the metadata join key, and every WebDataset-style loader (including the one behind the HF viewer) splits the key at the FIRST dot. Declaring it would make the viewer fold the three seeds of a prompt group into one malformed sample. Load the audio with the tarfile recipe below instead. --> # DramaBox edge-case reward-Top-3 — voice annotations 1,494,503 synthetic expressive-speech utterances (the reward-Top-3 selection of the DramaBox edge-case corpus), annotated with: 1. a **CrisperWhisper-format transcript with corrected vocal bursts** — each surviving burst carries a class name from [`laion/vocal-burst-detector-v2`](https://huggingface.co/laion/vocal-burst-detector-v2) at its original timestamp; 2. **raw voice scores at two granularities** — whole utterance and per sentence — from [`laion/Empathic-Insight-Voice-Plus`](https://huggingface.co/laion/Empathic-Insight-Voice-Plus) (all **40** emotions), the 57 VoiceNet dimensions, genuineness, vocal-burst blend and 4 quality scores; 3. a **procedural `<GENERAL>` + `<SCRIPT>` caption** derived from those scores, with per-sentence delivery cues in `(round brackets)`, burst class names in `(round brackets)` inline, and pauses in `[square brackets]`. 4. the **source audio**, byte-for-byte, in WebDataset tar shards aligned to the metadata parts. **If you are here for ASR:** much of this audio is deliberately hard to understand, and the verbatim CrisperWhisper large-v2 transcripts plus corrected burst labels are what make that useful rather than useless. See [Use as an ASR training set](#use-as-an-asr-training-set). The MP3 payload is the original generation output — **48 kHz mono MP3, 160 kbps, copied unchanged**, never decoded or re-encoded. The scores are a **first-class artefact**, not an intermediate: the caption step ([`derive_captions.py`](derive_captions.py)) reads only `data/scores` and runs on CPU in minutes. Swap the baseline, re-run, get a different caption set — no audio, no GPU, no re-scoring. --- ## Layout ``` data/audio/audio-{000..127}.tar # the audio, ~6.2 GiB per shard data/transcripts/transcripts-{000..127}.parquet # corrected CrisperWhisper transcripts data/scores/scores-{000..127}.parquet # raw scores, global + per sentence data/bursts/bursts-{000..127}.parquet # every original span, kept and dropped data/captions/captions-{000..127}.parquet # the derived captions captioner/ # caption.py + both baselines + schema.json derive_captions.py # regenerates data/captions from data/scores schema.json # column orders and model↔column bindings provenance.json # models, settings, captioner commit, baseline hash stats.json # the numbers quoted below ``` Total size **802G** (796 GiB of it audio), 128 shards per family. All five families join on `id` (`"{group_key}.s{seed}"`), and `audio-007.tar` holds exactly the utterances in `scores-007.parquet` — the shards are aligned, so a consumer never needs a global index. ```python from datasets import load_dataset ds = load_dataset("REPO_ID", "captions", split="train") # metadata only ``` ### Joining audio to metadata The audio member name is the join key plus `.mp3` — nothing else. One sequential pass over a shard, no index, no random access: ```python import io, tarfile, soundfile as sf import pyarrow.parquet as pq meta = {r["id"]: r for r in pq.read_table("data/scores/scores-007.parquet").to_pylist()} with tarfile.open("data/audio/audio-007.tar", "r|") as tf: # streaming for m in tf: key = m.name[:-len(".mp3")] # == the metadata id row = meta[key] wav, sr = sf.read(io.BytesIO(tf.extractfile(m).read())) # row["global_emonet"], row["sentences"], ... line up with this waveform ``` There is deliberately **no `audio` entry under `configs:`** in the card header, for the same reason described next: an automatic WebDataset loader would mis-group these keys. Load the audio with the recipe above. **One caveat if you use the `webdataset` library.** Its default key splitter takes everything before the *first* dot, and these keys contain one (`..._0000.s1.mp3`), so the three seeds of a prompt group would be folded into a single sample with extensions `s1.mp3`, `s2.mp3`, `s3.mp3`. Pass a key function that splits at the *last* dot instead — `lambda p: p.rpartition(".")[::2]` — through `webdataset.tariterators.group_by_keys(keys=...)`. *(Stated from the library's documented `base_plus_ext` behaviour; `webdataset` was not installed in the environment used to build this dataset, so this particular snippet is untested. The plain-`tarfile` recipe above is tested.)* --- ## Fields ### `transcripts` — artefact (a) | column | type | meaning | |---|---|---| | `id` | string | `{group_key}.s{seed}`, the join key | | `group_key`, `seed` | string, int32 | prompt group and generation seed in the source corpus | | `source_tar`, `member` | string | where the audio lives, relative to the DramaBox `outputs/` root | | `duration` | float32 | decoded clip length in seconds | | `reward`, `rank_in_group` | float32, int32 | the reward-model score that put this take in the Top-3 | | `text` | string | transcript, burst tokens rendered as `[Class Name]` | | `words` | list<struct> | `w` (token), `start`, `end` (seconds), `is_burst`, `sent` (sentence index) | | `bursts` | list<struct> | `start`, `end`, `type` — **`type` is the v2 class name**, at the original CrisperWhisper timestamp | The old CrisperWhisper tags (`UH`, `laughter`, …) are **not** in this family. They are preserved in `bursts` for comparison, and nowhere else. ### `scores` — the re-derivation input | column | type | meaning | |---|---|---| | `id`, `duration` | string, float32 | | | `global_voicenet` | list<float32>[57] | VoiceNet regression, 0–6, in `schema.json:voicenet_dims` order | | `global_emonet` | list<float32>[40] | Empathic-Insight emotions, in `schema.json:emonet` order | | `global_quality` | list<float32>[4] | `content_enjoyment`, `overall_quality`, `speech_quality`, `background_quality` | | `global_genuineness` | float32 | 0–6 | | `global_blend` | float32 | vocal-burst blend, 0–10 | | `global_ei_gender` | float32 | Empathic-Insight Gender expert, −2 masculine … +2 feminine (gate only) | | `words` | list<struct> | same as in `transcripts` — pauses and inline burst placement come from here | | `sentences` | list<struct> | one entry per sentence, see below | `sentences[]`: `idx`, `text`, `start`, `end`, `n_words`, `scored`, then `voicenet` (57), `emonet` (40), `quality` (4), `genuineness`, `blend`, plus `bursts` (class names falling in this sentence) and `burst_starts`. **`scored` is false for sentences under 8 words**, and their score lists are null. That threshold is inherited from the previous run and kept: below ~8 words a sentence is often under a second of audio, and both scorers are 30 s-window models whose per-dimension agreement degrades sharply on very short segments. 4,588,699 of 6,284,328 sentences (73.0 %) are scored. ### `bursts` — every original span, including the dropped ones | column | meaning | |---|---| | `id`, `burst_idx` | join key + index into the original span list | | `start`, `end`, `duration` | the CrisperWhisper span, unmodified | | `crisperwhisper_type` | the original coarse ASR tag — kept **only** here | | `class_v2`, `prob` | the v2 classifier's top-1 over the recognised burst classes, and its probability | | `p_no_burst` | P(no_burst) — the gate value | | `top5`, `top5_prob` | the top-5 of the masked softmax | | `kept` | whether the span survived into `transcripts` / `captions` | | `drop_reason` | `""` (kept), `under_200ms`, `no_burst`, `bad_timestamp` | | `sentence_idx` | which sentence the span was assigned to | Storing the full top-5 and `p_no_burst` for dropped spans means a **different duration floor or a different `no_burst` gate can be applied without re-running anything** — except for spans under 200 ms, which were never embedded (see below). ### `captions` — artefact (b) `id`, `general`, `script`, `caption` (the assembled `<GENERAL>…</GENERAL><SCRIPT>…</SCRIPT>` block), `n_sentences`, `n_sentences_cued`, `synonym_seed`. The parquet key-value metadata carries `caption_provenance`: baseline file + SHA-256, captioner commit, templates and k values. Example: ``` <GENERAL> A voice that is very thin in head resonance; very organic and soft; notably thin in throat resonance; very decelerating in pace; adult; strongly masculine, deep and low-pitched; low and bassy in register; notably carrying exhaustion; only slightly genuine, somewhat performed. </GENERAL> <SCRIPT> (very soft-onset, very organic, very flat, very detachment) "I must these packets of everything up" [pause 1.6s] (Ahem) [pause 0.5s] "I'm lacked." (very chesty, very formal, very throaty, detachment) [pause 1.5s] "The Alton sympathisants is here" </SCRIPT> ``` Round brackets carry two different things and are distinguishable by position: the **first** bracket on a line is the sentence's delivery cue; brackets **inside** the quoted run are burst class names. Square brackets are pauses, in seconds, computed from consecutive word timestamps (threshold 0.35 s). --- ## How it was built CrisperWhisper-large-v2 had already produced the transcript, the word timestamps and the burst spans for this corpus. **Neither ASR nor a burst locator was re-run here.** What this pipeline did: 1. **Duration floor.** Every span shorter than **200 ms** is dropped. This is a property of the span, not of the classifier, so it is applied first — a sub-200 ms span is discarded whatever it would have been called. 2. **Revalidation.** Each surviving span is cut (± 50 ms of context), embedded with `laion/voiceclap-commercial` and classified by `laion/vocal-burst-detector-v2`. The five **folded** classes (`Blowing a Kiss`, `Finger Snaps`, `Hand Scratching Head`, `Hand Slaps`, `Slap Face`) are masked to −∞ **before** the softmax, matching the model repo's own `inference.py`. Masking after argmax instead — remapping a folded win to `no_burst` — throws the burst away rather than falling back to the next-best real class. A span with `p(no_burst) ≥ 0.5` is vetoed. 3. **Rescoring.** Every utterance and every sentence of ≥ 8 words is scored on its own audio with `laion/Empathic-Insight-Voice-Plus` — **not** the distilled VoiceCLAP attribute heads, which were measured at a median Spearman ρ of 0.38 (utterance) / 0.32 (sentence) against it on 72,809 matched pairs from this same corpus. A caption only uses the top-k dimensions by |z|, so rank agreement is exactly the question that matters, and at ρ ≈ 0.35 the two scorers do not pick the same dimensions. 4. **Captioning.** `caption.py` at commit `4064baf10704` of [LAION-AI/procedural-voice-captions](https://github.com/LAION-AI/procedural-voice-captions), with the **in-domain** `baseline_stats.json` and reliability weighting. ### Models | role | model | |---|---| | transcript, word timestamps, burst spans (upstream, not re-run) | CrisperWhisper-large-v2 | | burst classifier | [`laion/vocal-burst-detector-v2`](https://huggingface.co/laion/vocal-burst-detector-v2) — `vocal_burst_mlp_v2.pt`, 82 classes + `no_burst` | | embedder | [`laion/voiceclap-commercial`](https://huggingface.co/laion/voiceclap-commercial) | | 57 voice dimensions | [`laion/voicenet-dimension-predictors-commercial`](https://huggingface.co/laion/voicenet-dimension-predictors-commercial) | | genuineness (0–6) | [`laion/voiceclap-commercial-genuineness`](https://huggingface.co/laion/voiceclap-commercial-genuineness) | | vocal-burst blend (0–10) | [`laion/voiceclap-commercial-vocalburst-blend`](https://huggingface.co/laion/voiceclap-commercial-vocalburst-blend) | | 40 emotions + 4 quality + gender gate | [`laion/Empathic-Insight-Voice-Plus`](https://huggingface.co/laion/Empathic-Insight-Voice-Plus) on [`laion/BUD-E-Whisper`](https://huggingface.co/laion/BUD-E-Whisper) | | captioner | `LAION-AI/procedural-voice-captions@4064baf10704`, `baseline_stats.json` (sha256 `b35c8ea74e2157fd…`) | **All 40 emotions are present.** A previous annotation of this corpus stored only 39 — the `Jealousy_&_Envy` head was missing from the scorer's emotion list and therefore never loaded. Heads are keyed by checkpoint name, not by index, so the other 39 were correctly labelled; the 40th was simply never predicted. Everything here was recomputed rather than reused. --- ## Re-deriving the captions The captions are a pure function of `data/scores` + a baseline + a template. Nothing else. ```bash # reproduce the shipped captions exactly python derive_captions.py --scores data/scores --out /tmp/again # the same clips against the previously published (out-of-domain) baseline python derive_captions.py --scores data/scores --out /tmp/emolia \ --baseline captioner/baseline_stats_emolia.json ``` CPU only, stdlib + pyarrow, no audio, no model download. `provenance.json` and each caption parquet's `caption_provenance` metadata record the baseline hash and captioner commit, so a regenerated set is always distinguishable from the shipped one. To vary the *wording* instead of the baseline — 11 surface templates, synonym rotation, dim shuffling, all from the same stored scores — see `augment.py` in the captioner repo. That is the intended use for training-time text augmentation: score once, caption many times. --- ## Numbers | | | |---|---| | utterances | 1,494,503 | | audio | 796 GiB, 11,840 h, 48 kHz mono MP3 @ 160 kbps | | mean clip length | 28.5 s | | sentences | 6,284,328 (scored: 4,588,699, 73.0 %) | | burst spans in | 5,401,483 | | dropped, under 200 ms | 3,347,356 (62.0 %) | | dropped, unusable timestamp | 0 | | **revalidated by the classifier** | **2,054,127** | | vetoed, `p(no_burst) ≥ 0.5` | 1,019 (0.05 % of revalidated) | | **kept** | **2,053,108** (38.0 % of the input spans) | Burst duration (all input spans): p10 0.02 s · p25 0.08 s · **p50 0.16 s** · p75 0.26 s · p90 0.36 s. **Say this plainly: the 200 ms floor removed 3,347,356 of 5,401,483 spans, and the median input span is 0.16 s — shorter than the floor.** The cut therefore does not trim a tail, it goes through the middle of the distribution, and the shipped burst set is **biased towards longer bursts**. Short events — clicks, lip smacks, quick breaths, single-frame hesitations — are systematically absent from `transcripts` and `captions`. They are all still in `data/bursts` with `drop_reason = "under_200ms"` if you want them back, but they were never classified, so recovering them means re-running the classifier on those spans. ### Class distribution of the kept bursts (top 25 of 82) | class | n | share | |---|---:|---:| | Low Mumble | 537,298 | 26.2 % | | Ahem | 511,277 | 24.9 % | | Contented Sigh | 439,481 | 21.4 % | | Surprised Gasp | 110,991 | 5.4 % | | Breathy Giggle | 105,813 | 5.2 % | | Wistful Sigh | 94,737 | 4.6 % | | Chuckle | 80,273 | 3.9 % | | Exhausted Groan | 62,849 | 3.1 % | | Childlike Giggle | 54,094 | 2.6 % | | Sharp Inhale | 32,500 | 1.6 % | | Resonant Hum | 10,325 | 0.5 % | | Scream | 2,653 | 0.1 % | | Soft Hum | 2,341 | 0.1 % | | Exasperated Sigh | 1,562 | 0.1 % | | Tsk | 1,276 | 0.1 % | | Yawn | 1,075 | 0.1 % | | Cackle | 703 | 0.0 % | | Sniff | 615 | 0.0 % | | Cough | 614 | 0.0 % | | Deep Breath | 569 | 0.0 % | | Effort Grunt | 469 | 0.0 % | | Whispered Mumble | 437 | 0.0 % | | Coughing | 415 | 0.0 % | | Snort | 185 | 0.0 % | | Purr | 107 | 0.0 % | ### CrisperWhisper tag vs. v2 class CrisperWhisper emits ~11 coarse tags; the classifier emits 82 fine ones. There is no ground truth here, so "agreement" is measured against a **hand-written, deliberately generous** mapping from each coarse tag to the set of taxonomy classes that would count as the same event (e.g. `laughter` → all 8 laughter classes, `breath` → the 7 breathing + 3 gasp/inhale classes). `UH`, `UM` and `noise` have **no counterpart in the taxonomy at all** — the first two are filled pauses, which are speech, not vocal bursts — so for those spans agreement is undefined, not zero. They are the majority of the input. | CrisperWhisper tag | kept spans | agreement | most common v2 classes | |---|---:|---:|---| | `laughter` | 374,342 | **38.3 %** | Contented Sigh (27.1 %), Breathy Giggle (17.1 %), Chuckle (15.1 %) | | `yawn` | 202,689 | **0.2 %** | Contented Sigh (73.3 %), Surprised Gasp (10.0 %), Wistful Sigh (7.4 %) | | `breath` | 59,106 | **5.0 %** | Contented Sigh (75.1 %), Ahem (7.4 %), Wistful Sigh (4.2 %) | | `sigh` | 35,389 | **93.6 %** | Contented Sigh (89.3 %), Wistful Sigh (4.3 %), Surprised Gasp (2.0 %) | | `lipsmack` | 12,155 | **1.9 %** | Ahem (32.2 %), Contented Sigh (26.5 %), Low Mumble (12.8 %) | | `throatclearing` | 37,655 | **39.3 %** | Ahem (39.3 %), Contented Sigh (12.0 %), Surprised Gasp (10.1 %) | | `sniff` | 28,016 | **0.6 %** | Contented Sigh (39.9 %), Sharp Inhale (36.3 %), Ahem (8.3 %) | | `cough` | 37,175 | **1.8 %** | Breathy Giggle (20.3 %), Surprised Gasp (16.3 %), Ahem (14.5 %) | | `UH` | 996,293 | n/a | Low Mumble (37.2 %), Ahem (33.7 %), Contented Sigh (8.6 %) | | `UM` | 265,013 | n/a | Low Mumble (52.3 %), Ahem (34.7 %), Wistful Sigh (3.1 %) | | `noise` | 3,971 | n/a | Ahem (38.5 %), Low Mumble (26.9 %), Surprised Gasp (7.4 %) | Over the mappable tags only: **24.9 %** (195,864 / 786,527). That is low, and it is not uniform: `sigh` agrees 93.6 %, but `yawn` 0.2 %, `sniff` 0.6 % and `cough` 1.8 %. **Which of the two labellers is wrong on those spans cannot be determined from this data** — there are no human labels here. Read the number as "the two models disagree", not as "the classifier is 25 % accurate". --- ## Known limitations Stated plainly, because they change what these annotations can be used for. - **Burst timestamps come from an ASR model, not from human annotation.** Every `start`/`end` in this dataset is CrisperWhisper-large-v2's, carried over unchanged. They were never verified against a human. A boundary that is 100 ms off is invisible here. - **Burst class labels are a classifier's top-1.** `laion/vocal-burst-detector-v2` reports **58.1 % argmax accuracy on its own held-out validation set** (1,940 clips, 83 classes). Roughly two in five labels are wrong at the class level, and the model's own held-out set is easier than in-the-wild ASR-cut spans. Use `prob`, `top5` and the group-level taxonomy in `schema.json` if you need something more robust than the top-1 string. - **The class distribution collapses onto a handful of labels.** Only 56 of the 82 classes are ever predicted, and the top three — `Low Mumble` (26.2 %), `Ahem` (24.9 %) and `Contented Sigh` (21.4 %) — cover **72.5 %** of all kept bursts. Much of that is the input distribution — 64.6 % of the spans CrisperWhisper found are filled pauses with no taxonomy counterpart, and they land mostly on `Low Mumble` and `Ahem` — but it means the fine-grained tail of the taxonomy is not usefully populated here. Treat the labels as a coarse event type, not as 82-way ground truth. - **The `no_burst` gate is effectively inert on this corpus.** It vetoed 1,019 of 2,054,127 classified spans (0.05 %). Whether that means the ASR-located spans really are almost all vocal events, or the classifier is simply reluctant to emit `no_burst` on speech-adjacent audio, is **not established here.** `p_no_burst` is stored per span so a stricter gate can be applied without recomputation. - **The caption baseline is in-domain for expressive acted speech.** `baseline_stats.json` was measured on 256,000 clips of *this* corpus. "Average" therefore means average *for a dramatic synthetic performance*. Applied to calm read speech the same captioner will overstate deviations — a neutral audiobook voice will be described as extremely flat, extremely low-arousal and so on, because it sits far from this baseline's centre. Regenerate against a broader baseline for such material; that is what `derive_captions.py --baseline` is for. - **11 of the 40 emotion baselines, and the blend baseline, are not in-domain.** They were carried over from the older 722-clip Emolia measurement because the run that built the in-domain baseline produced no values for them. `Jealousy & Envy` is one of them — the very emotion recovered here — and its carried-over spread (0.19) is narrower than the in-domain emotion spreads, so its z-scores run large and it will be selected for captions more often than it should be. The affected keys are listed in `captioner/baseline_stats.json` under `_meta.imported_from.carried_over`, and each carries `"source": "carried_over_from_emolia_baseline"`. - **Scores cover the first 30 seconds.** Both scorers are 30 s-window models; longer clips are truncated, not chunked. A small number of clips in this corpus run past 30 s, and their global scores describe only the beginning. Per-sentence scores are unaffected in practice (no sentence is that long). - **Sub-200 ms spans were never embedded.** They are in `data/bursts` with `drop_reason = "under_200ms"` and null classifier fields. Lowering the floor later requires re-running the classifier on those spans; every other threshold can be changed from the stored data alone. - **`<GENERAL>` can say "clean of non-verbal vocal bursts" on a clip that has bursts.** That clause comes from the vocal-burst *blend* regression head, which scores how burst-inflected the delivery sounds overall — it is a different measurement from the located spans and the two can disagree. - **The transcripts are of synthetic speech, and much of it is deliberately degenerate.** This is the *edge-case* selection: prompts were chosen to stress the TTS model, so transcripts contain disfluencies, invented words and broken syntax. That is the corpus, not an annotation error. See *Use as an ASR training set* below — this property is why the transcripts are interesting, not a reason to discard them. - **`id` is unique, but only after a repair.** Six of the 128 source annotation shards (17, 52, 74, 75, 77, 79) contained 7,657 duplicated records - the same `(group_key, seed)` written twice, pointing at the same source audio, with identical duration and reward. The scoring pipeline carried them through, so the first build of this package had 1,502,160 rows for 1,494,503 distinct ids and 7,657 tar members with a duplicated name. They were byte-identical, so the extra copy was removed from all five families; nothing was lost. **`id` is now a primary key in every family and every audio tar** - verified, 0 duplicates, 0 orphans in either direction. If you also consume the raw `top3_ann` jsonl, be aware the duplication is still there. - **5,362 utterances of the 1,507,522 in the source annotations are absent.** Their CrisperWhisper word list was empty (no speech transcribed), so there was nothing to segment, place bursts in or caption. That is 0.36 % of the corpus, and it is the only source of row loss — no utterance was dropped for a decode or read error. - **`source_tar` / `member` point at paths that are not public.** They record where each utterance came from in the DramaBox generation output (`edgecases_audio/**/*.tar`). The audio itself *is* included here, byte-for-byte, under `data/audio/` — those two columns are provenance, not a retrieval path. ## Use as an ASR training set A large share of these utterances is hard to understand — slurred, shouted, whispered, sobbed, strained, cut off mid-word. That is by construction: this is the edge-case selection, generated from prompts written to push the TTS model past clean read speech, and kept by a reward that favours expressive delivery rather than intelligibility. Judged as a text-to-speech corpus, a lot of it would be rejected. **Judged as an ASR corpus, that is exactly what makes it valuable.** Clean read speech is abundant; speech that is expressive to the point of breaking down is not, and it is where recognisers fail. The transcripts hold up under that stress. They come from **CrisperWhisper large-v2**, which is built for verbatim transcription — it keeps disfluencies, repetitions and false starts instead of tidying them away, and gives word-level timestamps. On top of that, every vocal burst carries a **corrected class label**: the original burst annotations were re-classified with [`laion/vocal-burst-detector-v2`](https://huggingface.co/laion/vocal-burst-detector-v2) at their original timestamps, so a laugh, gasp or sigh in the middle of a line is named rather than transcribed as a word or dropped. So the intended reading is: **degraded, expressive audio paired with accurate verbatim text and labelled non-verbal events.** Useful for training or evaluating recognisers on expressive and disfluent speech, for verbatim-vs-clean transcription styles, and for models that must handle vocal bursts inside an utterance instead of ignoring them. Two honest caveats. The audio is **synthetic**, so acoustic conditions are those of the generator, not of a microphone in a room — expect it to complement real-world ASR data rather than replace it. And CrisperWhisper is a model, not a human annotator: on the most degraded utterances its output is a strong transcript, not ground truth. `data/bursts` carries `prob` and `p_no_burst` per span if you want to filter on classifier confidence. ## License The annotations were produced with LAION models from public repositories; the audio is synthetic DramaBox output. The license field is `other` — the usage terms for the synthetic audio have not been settled, so treat this as a research release and check with LAION before redistributing. ## Citation Models: see the table above. Captioner: [LAION-AI/procedural-voice-captions](https://github.com/LAION-AI/procedural-voice-captions). Burst taxonomy: [LAION-AI/voice-taxonomies](https://github.com/LAION-AI/voice-taxonomies).

提供机构:
maas
创建时间:
2026-08-05
二维码
社区交流群
二维码
科研交流群
商业服务