Home | History | Annotate | Download | only in cfront
      1 /*---------------------------------------------------------------------------*
      2  *  ca_cms.c                                                                 *
      3  *                                                                           *
      4  *  Copyright 2007, 2008 Nuance Communciations, Inc.                         *
      5  *                                                                           *
      6  *  Licensed under the Apache License, Version 2.0 (the 'License');          *
      7  *  you may not use this file except in compliance with the License.         *
      8  *                                                                           *
      9  *  You may obtain a copy of the License at                                  *
     10  *      http://www.apache.org/licenses/LICENSE-2.0                           *
     11  *                                                                           *
     12  *  Unless required by applicable law or agreed to in writing, software      *
     13  *  distributed under the License is distributed on an 'AS IS' BASIS,        *
     14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
     15  *  See the License for the specific language governing permissions and      *
     16  *  limitations under the License.                                           *
     17  *                                                                           *
     18  *---------------------------------------------------------------------------*/
     19 
     20 /************************************************************************
     21  * CA_Wave Methods
     22  ************************************************************************/
     23 
     24 #ifndef _RTT
     25 #include <stdio.h>
     26 #endif
     27 #include <stdlib.h>
     28 #include <string.h>
     29 #include <limits.h>
     30 
     31 #ifdef unix
     32 #include <unistd.h>
     33 #endif
     34 #include <assert.h>
     35 
     36 
     37 #include "frontapi.h"
     38 #include "portable.h"
     39 #include "swicms.h"
     40 
     41 #ifdef SET_RCSID
     42 static const char *rcsid = 0 ? (const char *) &rcsid :
     43                            "$Id: ca_cms.c,v 1.7.6.11 2008/05/27 16:08:28 dahan Exp $";
     44 #endif
     45 
     46 
     47 ESR_ReturnCode CA_SetCMSParameters ( CA_Wave *hWave, const LCHAR *param_string )
     48 {
     49   ESR_ReturnCode set_status;
     50 
     51   if ( hWave != NULL )
     52     set_status = swicms_set_cmn ( hWave->data.channel->swicms, param_string );
     53   else
     54     set_status = ESR_INVALID_STATE;
     55   return ( set_status );
     56 }
     57 
     58 
     59 ESR_ReturnCode CA_GetCMSParameters ( CA_Wave *hWave, LCHAR *param_string, size_t* len )
     60 {
     61   ESR_ReturnCode get_status;
     62 
     63   if ( hWave != NULL )
     64     get_status = swicms_get_cmn ( hWave->data.channel->swicms, param_string, len );
     65   else
     66     get_status = ESR_INVALID_STATE;
     67   return ( get_status );
     68 }
     69 
     70 
     71 void CA_ReLoadCMSParameters(CA_Wave *hWave, const char *basename)
     72 {
     73   ASSERT(hWave);
     74   if (hWave->is_configuredForAgc == False)
     75     SERVICE_ERROR(UNCONFIGURED_CMS_AND_AGC);
     76   if (!basename) {
     77     if( swicms_init(hWave->data.channel->swicms) )
     78       SERVICE_ERROR(UNEXPECTED_DATA_ERROR);
     79   }
     80   else
     81     SERVICE_ERROR(FEATURE_NOT_SUPPORTED);
     82 }
     83 
     84 
     85 void CA_SaveCMSParameters(CA_Wave *hWave, const char *basename)
     86 {
     87 	SERVICE_ERROR(FEATURE_NOT_SUPPORTED);
     88 }
     89 
     90 
     91 void CA_LoadCMSParameters(CA_Wave *hWave, const char *basename,
     92                           CA_FrontendInputParams *hFrontArgs)
     93 {
     94   TRY_CA_EXCEPT
     95 #if !defined(_RTT)
     96   ASSERT(hWave);
     97   /* ASSERT (basename); */
     98   ASSERT(hFrontArgs);
     99 
    100   if (hWave->is_configuredForAgc == True)
    101     SERVICE_ERROR(CONFIGURED_CMS_AND_AGC);
    102   if (hWave->is_attached == True)
    103     SERVICE_ERROR(ATTACHED_CMS_AND_AGC);
    104 
    105   hWave->data.channel->channorm = create_channel_normalization();
    106   /* load_channel_parameters (basename, hWave->data.channel->channorm);
    107      not used anymore, rather we spec this is the parfile directly */
    108   hWave->data.channel->channorm->dim = MAX_CHAN_DIM;
    109   setup_channel_normalization(hWave->data.channel->channorm,
    110                               hWave->data.channel->spchchan,
    111 #if NORM_IN_IMELDA
    112                               hFrontArgs->mel_dim * 3, /* TODO: find appropriate number */
    113 #else
    114                               hFrontArgs->mel_dim,
    115 #endif
    116                               hFrontArgs->forget_factor);
    117   hWave->data.channel->mel_dim = hFrontArgs->mel_dim; /* TODO: more checks */
    118 
    119   hWave->data.channel->swicms = (swicms_norm_info*)CALLOC(1, sizeof(swicms_norm_info), "cfront.swicms");
    120   if( swicms_init(hWave->data.channel->swicms) )
    121     SERVICE_ERROR(UNEXPECTED_DATA_ERROR);
    122   hWave->is_configuredForAgc = True;
    123 #else
    124   log_report("Channel normalization or RTT not in module\n");
    125   SERVICE_ERROR(FEATURE_NOT_SUPPORTED);
    126 #endif
    127   BEG_CATCH_CA_EXCEPT;
    128   END_CATCH_CA_EXCEPT(hFrontend);
    129 }
    130 
    131 void CA_ClearCMSParameters(CA_Wave *hWave)
    132 {
    133   TRY_CA_EXCEPT
    134 #if NORM_IN_IMELDA
    135   int dim = hWave->data.channel->mel_dim * 3;
    136 #else
    137   int dim = hWave->data.channel->mel_dim;
    138 #endif
    139 
    140   ASSERT(hWave);
    141   if (hWave->is_configuredForAgc == False)
    142     SERVICE_ERROR(UNCONFIGURED_CMS_AND_AGC);
    143   if (hWave->is_attached == True)
    144     SERVICE_ERROR(ATTACHED_CMS_AND_AGC);
    145 
    146   clear_channel_normalization(hWave->data.channel->spchchan, dim);
    147   destroy_channel_normalization(hWave->data.channel->channorm);
    148   hWave->data.channel->channorm = NULL;
    149   hWave->is_configuredForAgc = False;
    150 
    151   FREE(hWave->data.channel->swicms);
    152   BEG_CATCH_CA_EXCEPT;
    153   END_CATCH_CA_EXCEPT(hWave);
    154 }
    155 
    156 void CA_AttachCMStoUtterance(CA_Wave *hWave, CA_Utterance *hUtt)
    157 {
    158   /* Link the utt's spchchan to the wave object's. This is checked in AGC fn
    159       to ensure that the correct Utt & Wave objects have been supplied.
    160   */
    161 
    162   TRY_CA_EXCEPT
    163   ASSERT(hUtt);
    164   ASSERT(hWave);
    165   if (hWave->is_configuredForAgc == False)
    166     SERVICE_ERROR(UNCONFIGURED_CMS_AND_AGC);
    167   if (hWave->is_attached == True)
    168     SERVICE_ERROR(ATTACHED_CMS_AND_AGC);
    169 
    170   ASSERT(hWave->data.channel->channorm);
    171   hUtt->data.gen_utt.spchchan = hWave->data.channel->spchchan;
    172   hUtt->data.gen_utt.channorm = hWave->data.channel->channorm;
    173   hUtt->data.gen_utt.swicms  = hWave->data.channel->swicms;
    174   hUtt->data.gen_utt.do_channorm = True;
    175 #if NORM_IN_IMELDA       /* TODO: find appropriate number */
    176   hUtt->data.gen_utt.num_chan = 3 * hWave->data.channel->mel_dim;
    177 #else
    178   hUtt->data.gen_utt.num_chan = hWave->data.channel->mel_dim;
    179 #endif
    180   hWave->is_configuredForAgc = True;
    181   hWave->is_attached = True;
    182   return;
    183   BEG_CATCH_CA_EXCEPT;
    184   END_CATCH_CA_EXCEPT(hFrontend);
    185 }
    186 
    187 ESR_ReturnCode CA_IsCMSAttachedtoUtterance(CA_Wave* hWave, ESR_BOOL* isAttached)
    188 {
    189   if (hWave == NULL || isAttached == NULL)
    190     return ESR_INVALID_ARGUMENT;
    191   *isAttached = hWave->is_attached;
    192   return ESR_SUCCESS;
    193 }
    194 
    195 ESR_ReturnCode CA_IsConfiguredForAgc(CA_Wave* hWave, ESR_BOOL* isConfigured)
    196 {
    197   if (hWave == NULL || isConfigured == NULL)
    198     return ESR_INVALID_ARGUMENT;
    199   *isConfigured = hWave->is_configuredForAgc;
    200   return ESR_SUCCESS;
    201 }
    202 
    203 void CA_DetachCMSfromUtterance(CA_Wave *hWave, CA_Utterance *hUtt)
    204 {
    205   TRY_CA_EXCEPT
    206   ASSERT(hWave);
    207 
    208   if (hWave->is_configuredForAgc == False)
    209     SERVICE_ERROR(UNCONFIGURED_CMS_AND_AGC);
    210   if (hUtt && hUtt->data.gen_utt.do_channorm == False)
    211     SERVICE_ERROR(UTTERANCE_INVALID);
    212   if (hWave->is_attached == False)
    213     SERVICE_ERROR(UNATTACHED_CMS_AND_AGC);
    214   if (hWave->data.channel->spchchan && hUtt->data.gen_utt.spchchan
    215       && hWave->data.channel->spchchan != hUtt->data.gen_utt.spchchan)
    216   {
    217     log_report("Mismatched channel and utterance\n");
    218     SERVICE_ERROR(BAD_CHANNEL);
    219   } /* TODO: find a better code */
    220 
    221   hUtt->data.gen_utt.channorm = NULL;
    222   hUtt->data.gen_utt.spchchan = NULL;
    223   hUtt->data.gen_utt.do_channorm = False;
    224   hWave->is_attached = False;
    225 
    226   return;
    227   BEG_CATCH_CA_EXCEPT;
    228   END_CATCH_CA_EXCEPT(hWave)
    229 }
    230 
    231 void CA_CalculateCMSParameters(CA_Wave *hWave)
    232 {
    233   TRY_CA_EXCEPT
    234 
    235   if (hWave->is_configuredForAgc == False)
    236     SERVICE_ERROR(UNCONFIGURED_CMS_AND_AGC);
    237   if (hWave->is_attached == False)
    238     SERVICE_ERROR(UNATTACHED_CMS_AND_AGC);
    239 
    240   estimate_normalization_parameters(hWave->data.channel->channorm,
    241                                     hWave->data.channel->spchchan,
    242 #if NORM_IN_IMELDA       /* TODO: find appropriate number */
    243                                     hWave->data.channel->mel_dim * 3);
    244 #else
    245                                     hWave->data.channel->mel_dim);
    246 #endif
    247   return;
    248   BEG_CATCH_CA_EXCEPT;
    249   END_CATCH_CA_EXCEPT(hWave);
    250 }
    251