I'm planning to make my own virtual singer software, like Yamaha's Vocaloid. Contrary to Vocaloid which composes voice syllable-wise, my software should compose voice phoneme-wise.
As a consequence, I have to analyze the formants of all phonemes. Though technically there are infinite numbers of phonemes because my software must be able to produce phonemes of arbitrary languages, I have a workaround; see below.
I set [ə] as the neutral position, and let the other sounds driven by the following parameters. Though this is a crude model and doesn't reflect the actual semantics of acoustics, this model should be easy to implement.
The following parameters determine the vocal quality:
Breath/Creak: Determines the glottal state. Voiceless ~ Breathy ~ Modal ~ Creaky ~ Glottal stop.
The following parameters determine the formants:
PHAryngealization: Determines the position of the tongue root. When set to maximum value, it is epiglottal stop.
NASalization: Determines the width of the velopharyngeal opening. When set to minimum value, it is an oral sound.
Front/Back: Determines the horizontal position of the tongue. When fully back, it is uvular stop.
Close/Open: Determines the vertical position of the tongue back and the jaw. When fully closed, it is dorsal stop.
CORonalization: Determines the vertical position of the tongue tip. When set to maximum value, it is coronal stop.
LATeralization: Determines the shape of the tongue. Also discriminates sibilant vs. non-sibilant.
JAW: Determines the horizontal position of the jaw. When set to maximum value, it is a labiodental consonant.
COMpression: Determines the closure of the lips. When set to maximum value, it is labial stop.
ROUnding: Determines the shape of the lips.
My plan to apply this model is, step-by-step (here only concerning vowels):
Record voiceless versions of 'extreme' vowels, such as [ḁ], [i̥], and [u̥].
Least-square-approximate their spectra with a linear combination of functions that models formants. I conjecture those functions to be the PDF of Kumaraswamy distribution.
Interpolate the result to produce 'intermediate' vowels, such as [ə̥].
Use resulting spectra as filters to produce voiced vowels.
TL;DR: But I'm unsure how many functions are needed to model formants. What is the maximum possible number of formants?