/****************************************************************************** * UnitSearch.h * *--------------* * *------------------------------------------------------------------------------ * Copyright (C) 2000 Microsoft Corporation Date: 03/02/00 - 12/5/00 * All Rights Reserved * ********************************************************************* mplumpe ***/ #ifndef __UNITSEARCH_H_ #define __UNITSEARCH_H_ #include #include class CSpeakerData; struct DPLink; struct Phone; struct ChkDescript; struct WeightsBasic { float f0; float dur; float rms; float lkl; float cont; float sameSeg; }; struct Weights { float f0; float dur; float rms; float lkl; float cont; float sameSeg; float phBdr; float f0Bdr; }; struct SegInfo; struct DPCand { SegInfo* segment; double f0Weight; double durWeight; double lklWeight; double rmsWeight; double contWeight; double acumWeight; int prevPath; }; struct DPLink { std::vector m_cands; int m_iBestPath; double m_dTime; double m_dAverRms; double m_dAverDur; double m_dAverF0; double m_dTargF0; }; class CUnitSearch { public: CUnitSearch(int iDynSearch = 0, int iBlend = 0, int iUseTargetF0 = 0, int iUseGain = 0); void SetSpeakerData (CSpeakerData* pSpeakerData); int Search (Phone* pPhList, int iNumPh, ChkDescript** ppChunks, int* piNumChunks, double dStartTime); private: void ComputeDPInfo (DPLink* rLastLink, DPLink& rNewLink, double targetF0); int FindOptimalPath (std::vector& rDPList, double dStartTime, ChkDescript** ppChunks, int* piNumChunks); void Backtrack (std::vector& rDPList, int* piIndexes); int GenerateOutput (ChkDescript** chunks, int* nChunks, const char* cluster, double time, int chunkIdx, double from, double to, double rms, double targF0, double srcF0, double gain); int AddChunk (ChkDescript** ppChunks, int* piNumChunks, const char* pszName, double dTime, int iChunkIdx, double dFrom, double dTo, double targF0, double srcF0, double dGain); void FlushOutput (ChkDescript** ppChunks, int* piNumChunks); int CentralPhone ( const char *pszTriphone, char *pszPhone ); int Unvoiced (const char* pszPhone); int m_iDynSearch; int m_iBlend; int m_iUseTargetF0; int m_iUseGain; Weights m_weights; CSpeakerData* m_pSpeakerData; // Blend variables char m_pszLastPhone[20]; char m_pszUnitName[1024]; //Don't know if this is enough (We probably don't need it) int m_iChunkIdx1; double m_dTime1; double m_dFrom1; double m_dTo1; double m_dGain1; double m_dNumAcum; // f0 ratio double m_dSrcF0; double m_dTargF0; int m_iNumSrcF0; int m_iNumTargF0; // Worker variables used in Search, here so they aren't constantly deleted and re-allocated std::vector m_dpList; DPLink m_dpLink; }; #endif