{
  "source_file": "0930",
  "source_platform": "Dev.to",
  "author": "Panagiotis Gkilis",
  "title_listed": "Speaker embeddings can mistake a 0.7-semitone change for something else",
  "keywords": "",
  "domain": "文本处理",
  "content_type": "工程实践",
  "is_paid_flag": "否",
  "url": "https://dev.to/bedvibe_studios/speaker-embeddings-can-mistake-a-07-semitone-change-for-something-else-4f02",
  "publish_date": "2026-08-17",
  "corpus_stage": "",
  "notes": "",
  "id": "5063c0409899",
  "collected_at": "2026-10-02T13:52:23",
  "title": "Speaker embeddings can mistake a 0.7-semitone change for something else - DEV Community",
  "body_markdown": "Voice biometrics are deployed in telephone banking, device unlock, and assistant personalisation. All of it rests on one assumption: your voice is stable enough that a machine can keep recognising it. I ran a controlled experiment to find out how much of that assumption survives contact with a person who has a cold, is tired, or is just speaking a little differently than usual.\nFour speakers, identical sentences, controlled changes in pitch, phonation and articulation, fixed microphone position and gain. Every utterance projected through three different encoder architectures — ECAPA-TDNN, a ResNet speaker encoder, and WavLM-base-plus-sv.\nThe result\nOne speaker sat 0.7 semitones below his normal pitch. That is below the threshold where a listener reliably hears any change at all. His verification score dropped 0.238 across all eight sentences.\nPitch was not what moved him. His harmonics-to-noise ratio fell from 10.63 to 8.39 dB over the same block. The encoder was reacting to phonation — how the vocal folds were vibrating — and the pitch number was just the thing that happened to be easy to measure.\nAcross the whole run, all 30 speaker × condition × encoder cells were negative, 28 of them unanimous across every utterance.\nThese systems are not mainly disturbed by shouting or disguise. They are disturbed by someone speaking slightly differently in a way nobody would notice.\nCredit where it belongs\nThe displacement effect itself is not my finding. I had it as my headline until an adversarial prior-art audit — an audit I designed specifically to try to kill my own claim — turned up Hughes et al. (Interspeech 2023), who had established it with six trained phoneticians across seventeen conditions.\nI withdrew the claim and reframed the paper as a replication and extension across encoder architectures. The audit is published in full, including the claim it killed.\nTwo things I could not find in prior work\nJitter beats HNR.\nPitch deviation and jitter are independently associated with displacement in all three encoders. Harmonics-to-noise ratio adds nothing once jitter is in the model — it correlates 0.55 with jitter and loses all independent power beside it. HNR is the measure most practitioners reach for, and on its own it will attribute the effect to the wrong thing.\nRough phonation breaks F0 trackers in one direction.\n10 of 145 utterances carried impossible pitch values, up to 32.1 semitones — a 6.4× frequency ratio no human produces. All 10 sat in rough phonation, none in modal (Fisher exact p = 2.4e-11). Octave errors push estimates upward and essentially never downward, so this is not noise. It is differential measurement error: a variable that is in the model, mismeasured, in one direction, in one identifiable subset of the data. Those observations carried 2.7× the leverage of the rest and up to 13× the Cook's distance, so the contamination loaded onto one specific regression coefficient.\nThe fix is cheap: validate your F0 tracker per phonation condition, and publish the validation. A pitch coefficient estimated over pooled phonation is not interpretable without it.\nThe number I deleted\nMy pre-registered prediction about pitch direction could be reported at p = 0.013. I am not reporting it. Two defensible ways of correcting the same measurement error give opposite answers:\nall data, contaminated            up 0.0408   down 0.0416   p = 0.947\ndrop impossible F0 values only    up 0.0846   down 0.0565   p = 0.099\nrestrict to the clean corpus      up 0.0556   down 0.0845   p = 0.013\nEnter fullscreen mode\nExit fullscreen mode\nThe third correction also removes an entire corpus, so I cannot separate \"cleaned the data\" from \"changed the sample.\" I published the instability instead of the significant number.\nEverything is open\nManuscript, the pre-registration, the full prior-art audit, per-utterance measurement tables for all three encoders (233 rows each), every analysis script including the influence diagnostics, and the 137 source recordings. There is a provenance manifest mapping all 233 rows back to source recording and time offsets, verified by re-running the segmentation with no encoder loaded.\nEvery number in the paper reproduces from the CSVs without touching the audio.\nPaper and data:\n10.5281/zenodo.21921958\nFull write-up:\nHow little your voice has to change before a machine stops recognising it\nAudio licence: research, benchmarking, evaluation and teaching are permitted; use as machine-learning training data and use for voice cloning are not. The speakers are identifiable adults, three under separate commercial voice contract.\nThe voice model and the recorded corpus behind this study are documented at\ntts.bedvibe.studio/portfolio/bedvibe-tts\n, and the licensed datasets are at\ntts.bedvibe.studio/datasets\n.",
  "metadata": {
    "title": "Speaker embeddings can mistake a 0.7-semitone change for something else - DEV Community",
    "description": "A matched-content replication across three speaker encoders, and the measurement error that nearly gave me the wrong headline. Tagged with machinelearning, ai, research, datascience.",
    "keywords": "machinelearning, ai, research, datascience, software, coding, development, engineering, inclusive, community",
    "author": null,
    "og:type": "article",
    "og:url": "https://dev.to/bedvibe_studios/speaker-embeddings-can-mistake-a-07-semitone-change-for-something-else-4f02",
    "og:title": "Speaker embeddings can mistake a 0.7-semitone change for something else",
    "og:description": "A matched-content replication across three speaker encoders, and the measurement error that nearly gave me the wrong headline.",
    "og:site_name": "DEV Community",
    "og:image": "https://media2.dev.to/dynamic/image/width=1200,height=627,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdcwlpkl2qjr6ulknew5h.png",
    "twitter:site": "@thepracticaldev",
    "twitter:creator": "@",
    "twitter:title": "Speaker embeddings can mistake a 0.7-semitone change for something else",
    "twitter:description": "A matched-content replication across three speaker encoders, and the measurement error that nearly gave me the wrong headline.",
    "twitter:card": "summary_large_image",
    "twitter:widgets:new-embed-design": "on",
    "twitter:image:src": "https://media2.dev.to/dynamic/image/width=1200,height=627,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdcwlpkl2qjr6ulknew5h.png"
  },
  "paywall": {
    "listed_paid": false,
    "detected": false,
    "marker": "",
    "public_only": false,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": ""
  },
  "code_blocks": [
    {
      "file": "attachments/5063c0409899/code/body-000.txt",
      "chars": 210,
      "language": "text"
    }
  ],
  "images": [],
  "audio": [],
  "videos": [],
  "links": [
    {
      "href": "https://doi.org/10.5281/zenodo.21921958",
      "label": "10.5281/zenodo.21921958",
      "type": "a"
    },
    {
      "href": "https://ai.bedvibe.studio/speaker-drift/",
      "label": "How little your voice has to change before a machine stops recognising it",
      "type": "a"
    },
    {
      "href": "https://tts.bedvibe.studio/portfolio/bedvibe-tts/",
      "label": "tts.bedvibe.studio/portfolio/bedvibe-tts",
      "type": "a"
    },
    {
      "href": "https://tts.bedvibe.studio/datasets/",
      "label": "tts.bedvibe.studio/datasets",
      "type": "a"
    }
  ],
  "repair_version": 2,
  "repaired_at": "2026-10-14T10:48:45Z",
  "source_url": "https://dev.to/bedvibe_studios/speaker-embeddings-can-mistake-a-07-semitone-change-for-something-else-4f02",
  "papers": [],
  "actual_video_files": [],
  "body_chars": 4794,
  "expected_body_images": 0,
  "discovery_status": "ok",
  "delivery_status": "ok",
  "missing_reason": "",
  "raw_html": "attachments/5063c0409899/pages/source.html",
  "local_html": "attachments/5063c0409899/pages/article.html",
  "body_base_path": "attachments/5063c0409899/pages/",
  "body_markdown_path": "attachments/5063c0409899/pages/article.md"
}