Hi,
Javi Palenzuela wrote:
After reading the papers, the mailing list and looking at the code, I
still don't understand at 100% how the voiced/unvoiced decision is
practically trained using MSD.
I see that the decision is made using the weight of the mixture of the
first stream. In the data, LZERO is used to flag the unvoiced regions.
But how is the weight updated accordingly with this?
Frames containing LZERO as their F0 values are unvoiced. Other frames
are voiced. By running the Forward-Backward algorithm, you can get the
state occupancy probability for each frame. Using state occupancy
probability, you can get the following information:
#UV -> total occupancy counts of unvoiced frames assigned to this state
#V -> total occupancy counts of voiced frames assigned to this state
Then, you can estimate weights for V/UV as follows:
weight_uv = #UV / (#UV + #V)
weight_v = #V / (#UV + #V)
At the synthesis stage, if weight_v>=0.5, this state is treated as
voiced, otherwise unvoiced.
Regards,
Heiga ZEN (Byung Ha CHUN)