private Pool <ISenone> CreateTiedSenonePool(float distFloor, float varianceFloor) { var pool = new Pool <ISenone>("senones"); var numMeans = MeansPool.Size; var numVariances = VariancePool.Size; var numGaussiansPerState = MixtureWeightsPool.GauPerState; var numSenones = MixtureWeightsPool.StatesNum; var numStreams = MixtureWeightsPool.StreamsNum; this.LogInfo("Senones " + numSenones); this.LogInfo("Gaussians Per State " + numGaussiansPerState); this.LogInfo("Means " + numMeans); this.LogInfo("Variances " + numVariances); Debug.Assert(numGaussiansPerState > 0); Debug.Assert(numVariances == _numBase * numGaussiansPerState * numStreams); Debug.Assert(numMeans == _numBase * numGaussiansPerState * numStreams); var meansTransformationMatrix = MeansTransformationMatrixPool == null ? null : MeansTransformationMatrixPool.Get(0); var meansTransformationVector = MeansTransformationVectorPool == null ? null : MeansTransformationVectorPool.Get(0); var varianceTransformationMatrix = VarianceTransformationMatrixPool == null ? null : VarianceTransformationMatrixPool.Get(0); var varianceTransformationVector = VarianceTransformationVectorPool == null ? null : VarianceTransformationVectorPool.Get(0); _phoneticTiedMixtures = new MixtureComponentSet[_numBase]; for (var i = 0; i < _numBase; i++) { var mixtureComponents = new List <PrunableMixtureComponent[]>(); for (var j = 0; j < numStreams; j++) { var featMixtureComponents = new PrunableMixtureComponent[numGaussiansPerState]; for (var k = 0; k < numGaussiansPerState; k++) { var whichGaussian = i * numGaussiansPerState * numStreams + j * numGaussiansPerState + k; featMixtureComponents[k] = new PrunableMixtureComponent( MeansPool.Get(whichGaussian), meansTransformationMatrix, meansTransformationVector, VariancePool.Get(whichGaussian), varianceTransformationMatrix, varianceTransformationVector, distFloor, varianceFloor, k); } mixtureComponents.Add(featMixtureComponents); } _phoneticTiedMixtures[i] = new MixtureComponentSet(mixtureComponents, _topGauNum); } for (var i = 0; i < numSenones; i++) { ISenone senone = new SetBasedGaussianMixture(MixtureWeightsPool, _phoneticTiedMixtures[Senone2Ci[i]], i); pool.Put(i, senone); } return(pool); }
/** * /// Creates the senone pool from the rest of the pools. * /// * /// @param distFloor * /// the lowest allowed score * /// @param varianceFloor * /// the lowest allowed variance * /// @return the senone pool */ public Pool <ISenone> CreateSenonePool(float distFloor, float varianceFloor) { var pool = new Pool <ISenone>("senones"); var numMeans = MeansPool.Size; var numVariances = VariancePool.Size; var numGaussiansPerSenone = MixtureWeightsPool.GauPerState; var numSenones = MixtureWeightsPool.StatesNum; var numStreams = MixtureWeightsPool.StreamsNum; var whichGaussian = 0; this.LogInfo("Senones " + numSenones); this.LogInfo("Gaussians Per Senone " + numGaussiansPerSenone); this.LogInfo("Means " + numMeans); this.LogInfo("Variances " + numVariances); Debug.Assert(numGaussiansPerSenone > 0); Debug.Assert(numVariances == numSenones * numGaussiansPerSenone); Debug.Assert(numMeans == numSenones * numGaussiansPerSenone); var meansTransformationMatrix = MeansTransformationMatrixPool == null ? null : MeansTransformationMatrixPool.Get(0); var meansTransformationVector = MeansTransformationVectorPool == null ? null : MeansTransformationVectorPool.Get(0); var varianceTransformationMatrix = VarianceTransformationMatrixPool == null ? null : VarianceTransformationMatrixPool.Get(0); var varianceTransformationVector = VarianceTransformationVectorPool == null ? null : VarianceTransformationVectorPool.Get(0); for (var i = 0; i < numSenones; i++) { var mixtureComponents = new MixtureComponent[numGaussiansPerSenone * numStreams]; for (var j = 0; j < numGaussiansPerSenone; j++) { mixtureComponents[j] = new MixtureComponent( MeansPool.Get(whichGaussian), meansTransformationMatrix, meansTransformationVector, VariancePool.Get(whichGaussian), varianceTransformationMatrix, varianceTransformationVector, distFloor, varianceFloor); whichGaussian++; } ISenone senone = new GaussianMixture(MixtureWeightsPool, mixtureComponents, i); pool.Put(i, senone); } return(pool); }