{
  "createdAt": "2026-10-26T16:46:29.514960+00:00",
  "selection": {
    "start": "2026-10-12T16:42:47.757Z",
    "end": "2026-10-26T16:42:47.757Z",
    "method": "Top 20 per gender by distinct real registered callers in positive-duration private call transcripts over last 14 days; public non-retired characters with active Fish voice. Tie-break by call count then character id.",
    "eligible": 603
  },
  "characterCount": 40,
  "genderBalance": {
    "Male": 20,
    "Female": 20
  },
  "uniqueVoiceReferences": 40,
  "language": "English",
  "scripts": [
    {
      "id": "conversation",
      "label": "Everyday conversation",
      "direction": "Natural conversation; no performance tags",
      "text": "Hey, I saved you a seat by the window. The rain finally stopped, and the whole street smells like summer. Tell me how your day really went. We can start with the good part, or the part you wish you could do over.",
      "spokenText": "Hey, I saved you a seat by the window. The rain finally stopped, and the whole street smells like summer. Tell me how your day really went. We can start with the good part, or the part you wish you could do over.",
      "wordCount": 43
    },
    {
      "id": "emotion",
      "label": "Reassurance and playful relief",
      "direction": "Quiet concern → warm relief → gentle teasing",
      "text": "[worried, speaking softly] You got quiet, and I thought I had upset you. [relieved, warm] Oh, you were just looking for your keys. Come here. Take a breath. [gently teasing] Next time, give me a hint before I invent an entire disaster in my head.",
      "spokenText": "You got quiet, and I thought I had upset you. Oh, you were just looking for your keys. Come here. Take a breath. Next time, give me a hint before I invent an entire disaster in my head.",
      "wordCount": 38
    },
    {
      "id": "precision",
      "label": "Pacing and pronunciation",
      "direction": "Clear conversational instructions; names, time, numbers and a brief question",
      "text": "Maya and Julian are meeting us at Café Aurora at 7:45 on Friday, July 24. Our table is B-12, and the tickets cost $28.50 each. Wait, did you say fifteen or fifty? Let me write that down so we get it right.",
      "spokenText": "Maya and Julian are meeting us at Café Aurora at 7:45 on Friday, July 24. Our table is B-12, and the tickets cost $28.50 each. Wait, did you say fifteen or fifty? Let me write that down so we get it right.",
      "wordCount": 42
    }
  ],
  "models": [
    "s2-pro",
    "s2.1-pro"
  ],
  "samples": 240,
  "mainPairs": 120,
  "orderReversedReviewsPerPair": 2,
  "identicalAudioControlPairs": 8,
  "judgeModel": "gemini-3.1-pro-preview",
  "masking": "Judge receives opaque pair code, task directions, exact text and two audio files; no model/character names, portrait, gender, popularity, timings or file paths. Same audio reviewed in reverse order in separate requests. Orchestrator knows mapping; not independent human double-blind.",
  "primary": "Naturalness 1-5, candidate minus control, mean across two orders and three scripts per character, equal weight across 40 characters. Stratified-by-gender character bootstrap 5000 resamples for descriptive 95% interval.",
  "secondary": [
    "Intelligibility",
    "Expressiveness/direction fit",
    "Audio quality",
    "Text fidelity",
    "Stable pair preference: same semantic preference both orders. Differing preferences, including tie vs winner, are inconclusive.",
    "Eight identical-audio pairs (16 reviews) should prefer tie; report failures without discarding judgments.",
    "Cold direct-WebSocket TTFA is descriptive, includes connection/request time, is not production call latency."
  ],
  "limitations": [
    "One generation per model/voice/script; stochastic synthesis is not replicated.",
    "Three fixed English scripts do not establish multilingual quality.",
    "40 popular characters represent 40 voice references, not the full catalog.",
    "One AI judge; reversed order does not create independent judges or subjects.",
    "No pronunciation/voice identity ground-truth reference; do not claim voice-clone fidelity."
  ],
  "pairsSha256": "1d9147d40e0eb91356aa0c31fd8870d8342d66b165ba4a9c990c956d3d8235d6",
  "generationJobsSha256": "1154cbcb300b25ab39610aaa78ef681c7ad8fffb52bdc688c4f4d58bcbe83906",
  "synthesisSettings": {
    "text": "",
    "chunk_length": 100,
    "format": "pcm",
    "sample_rate": 24000,
    "mp3_bitrate": 64,
    "opus_bitrate": 64000,
    "references": [],
    "normalize": true,
    "latency": "balanced",
    "prosody": {
      "speed": 1.0,
      "volume": 0
    },
    "top_p": 0.7,
    "temperature": 0.7,
    "features": [
      "quality-guard"
    ]
  },
  "streaming": "Direct Fish WebSocket; fixed sentence splitting with flush events, all text supplied immediately. Fresh socket per sample, at most two concurrent. Requested model header, provider does not expose independently verifiable executed-engine identity.",
  "boundedRetries": "At most three attempts for transport/output failure. First successful complete output retained; no quality-based regeneration.",
  "protocolNotes": "Selection, scripts, masking, controls and aggregation rules were written before synthesis. Exact transport settings and retry details were appended during generation after the pilot; scoring criteria and samples were not changed."
}
