वाक् अन्वेषणम् — about this project

Does Sanskrit phonetics describe something a microphone can measure?

The question

Pāṇini classifies the stop consonants क च ट त प by sthāna — the place in the mouth where the closure is made: velar, palatal, retroflex, dental, labial. That is a claim about articulation, made two and a half millennia before anyone could record a sound.

If the classification tracks something physical, the five places should leave distinguishable traces in the acoustic signal — in the burst released at the moment of opening, in the formant transitions into the following vowel, perhaps in pitch. This project records those five stops across vowels, measures those cues, and asks whether the five places separate.

How it is tested

Each speaker reads a fixed list: the pure vowels, then each of the five stops with each vowel. Every utterance is measured the same way regardless of where it came from — synthesised speech, a recording added by hand, or a volunteer upload. Provenance is recorded as metadata, never as a separate pipeline.

Measurements go into a CSV, and a classifier is asked the direct question: given these features, can you recover which consonant was spoken? Three feature sets are compared — burst and formant cues without pitch, pitch alone, and both together — with TTS and human voices scored separately.

Where it stands

204 utterances are indexed, 204 of them carried into the measurements, across 7 human recordings and one synthetic voice.

Vowels separate cleanly on formants. The five consonant places do not separate well on any feature set tried so far, and pitch adds essentially nothing to place over burst and formant cues alone.

These are presented as observations. The interpretation — whether this reflects a limit of the features, of the corpus size, of synthetic speech, or something about the classification itself — is deliberately left open.

Two collections, different axes

The site holds two bodies of analysis, and they answer different questions rather than one superseding the other:

The sthāna studyVoice & language survey
variesreal speakers4 TTS voices, 3 languages
covers5 stopsthe whole varṇamālā
vowelsअ इ उ ए ओअ इ उ
human audioyesnone, by construction

The sparśa grid in the sidebar navigates the survey. That is why picking ए or ओ there greys out the consonants — those per-varṇa pages were only ever built for अ, इ and उ.

How the data moves

Utterances reach one corpus three ways, and everything downstream treats them identically.

vak-anveshanam data flow: stores, just verbs, deploy targets Utterances reach one corpus from three provenances: TTS synth (straight in, already one file per utterance), hand-dropped recordings, and volunteer uploads pulled from Netlify Blobs. Both recording provenances share one raw store and one split step. When a split's segment count misses the protocol, a conditional branch sends it through just review (a human sets verdicts) and just promote (validates and writes); most recordings skip that and go straight to the corpus. Portrait, ml and kit all write into results/acoustics, which the deploy verbs publish. One raw store, mp3~/recordings/, holds every recording regardless of provenance; the sidecar beside each file says where it came from. just synth03_generate_syntheticcosts TTS spend manual dropfile added by handno script volunteerrecords + uploadsvia deployed page just pull98_ingest_submissionsfrom Netlify Blobs raw recordingsmp3~/recordings/raw/{recording_id}/audio + sidecar (protocol, provenance) just splitsplitter.py · VAD → utterances on count mismatch just reviewmanual stepnotes.txtrecordings/review/ just promotevalidates utterance corpus — the unit of analysisresults/…/utterances/synth-*/ · mp3~/recordings/split/{recording_id}/one utterance per file · provenance is metadataaddressed by corpus_index.csv (below) just portrait95_pitch_portrait.pyreads whole corpus just kit97_collection_kit.py→ collection.html data/*.csvresults/…/pitch_portrait/data/ just indexcorpus_index.py just ml96_acoustic_ml.pyreads the CSV corpus_index.csv(source, utterance) → pathone namespace, nothing moved just portal90_portal.py · index.html + corpus_overview.html — counts the CSVs results/acoustics/index · pitch_portrait · acoustic_ml · collection.html just devdeploy.sh --dev just stagedeploy.sh --stage just deploydeploy.sh --prod localhost:8920 preview url vagartha.netlify.app guide audio data store just verb live target
built 2757962+dirty · 2026-07-30 19:50:18 UTC · control · built 2757962+dirty · 2026-07-30 19:50:18 UTC · index · built 2c29dca+dirty · 2026-07-30 04:50:51 UTC · kit · built 2757962+dirty · 2026-07-30 19:50:18 UTC · ml · built 2757962+dirty · 2026-07-30 19:50:18 UTC · portal · built 2757962+dirty · 2026-07-30 19:50:08 UTC · portrait