galat****@lists*****
galat****@lists*****
2007年 7月 12日 (木) 15:10:45 JST
Index: gtalk/main.c diff -u gtalk/main.c:1.29 gtalk/main.c:1.30 --- gtalk/main.c:1.29 Thu Oct 19 12:26:33 2006 +++ gtalk/main.c Thu Jul 12 15:10:45 2007 @@ -4,7 +4,7 @@ /* */ /* The code is developed by Yamashita-lab, Ritsumeikan University */ /* */ -/* $Id: main.c,v 1.29 2006/10/19 03:26:33 sako Exp $ */ +/* $Id: main.c,v 1.30 2007/07/12 06:10:45 sako Exp $ */ #include <stdio.h> #include <stdlib.h> @@ -204,6 +204,7 @@ void read_speech_file(char *); int read_pros_file(char *); int set_f0_and_power(char *); +void update_duration(); void abort_output(); void text_analysis_file(); void reset_output(); @@ -678,6 +679,7 @@ } } +/* 韻律情報の書き出し */ void setSpeechFile( char *rel, char *filename ) { strcpy( slot_Speak_stat, "PROCESSING" ); @@ -701,6 +703,7 @@ if( prop_Speak_stat == AutoOutput ) inqSpeakStat(); } +/* 韻律情報の読み込み */ void setProsFile( char *rel, char *filename ) { int error; @@ -713,6 +716,7 @@ if( prop_ProsFile == AutoOutput ) inqProsFile(); refresh(); + /* prosBuf に各種パラメータを読み込む */ error = read_pros_file( filename ); if( ! error ) { @@ -722,27 +726,32 @@ /* parameter_generation(); */ - init_parameter(); - make_duration(); - modify_duration(); - + init_parameter(); /* パラメータ生成の準備 */ + make_duration(); /* 素のテキストから状態継続長を生成 */ + modify_duration(); /* 継続長の修正(タグ処理) */ + + /* 音素継続長が修正されている場合は、状態継続長を + 計算しなおす */ + update_duration(); + /* ここで、prosBuf のデータで音素時間長を設定する。 */ - make_cumul_time(); - modify_voice(); + make_cumul_time(); /* 音素時間長の累積を計算 */ + modify_voice(); /* 話者のスイッチ、αパラメータの変更(タグ処理) */ if( prop_Text_pho == AutoOutput ) inqTextPho(); if( prop_Speak_pho == AutoOutput ) inqSpeakPho(); if( prop_Text_dur == AutoOutput ) inqTextDur(); if( prop_Speak_dur == AutoOutput ) inqSpeakDur(); - make_parameter(); + make_parameter(); /* パラメータ生成を実行 */ - modify_f0(); - modify_power(); + modify_f0(); /* F0の修正(タグ処理) */ + modify_power(); /* パワーの修正(タグ処理) */ /* parameter_generation(); ここまで */ + /* 生成されたパラメータに対してF0とc0を更新 */ error = set_f0_and_power( filename ); if( ! error ) { do_synthesis(); /* 合成波形の生成 */ Index: gtalk/make_duration.c diff -u gtalk/make_duration.c:1.7 gtalk/make_duration.c:1.8 --- gtalk/make_duration.c:1.7 Thu Oct 19 12:27:08 2006 +++ gtalk/make_duration.c Thu Jul 12 15:10:45 2007 @@ -5,7 +5,7 @@ /* (Nagoya Institute of Technology) */ /* All rights reserved */ /* */ -/* $Id: make_duration.c,v 1.7 2006/10/19 03:27:08 sako Exp $ */ +/* $Id: make_duration.c,v 1.8 2007/07/12 06:10:45 sako Exp $ */ #include <stdio.h> #include <string.h> @@ -37,4 +37,3 @@ m = m->next; } } - Index: gtalk/modify_parameter.c diff -u gtalk/modify_parameter.c:1.19 gtalk/modify_parameter.c:1.20 --- gtalk/modify_parameter.c:1.19 Tue Nov 14 10:01:43 2006 +++ gtalk/modify_parameter.c Thu Jul 12 15:10:45 2007 @@ -6,7 +6,7 @@ /* Keiichi Tokuda, Takayoshi Yoshimura, Heiga Zen */ /* (Nagoya Institute of Technology) */ /* All rights reserved */ -/* $Id: modify_parameter.c,v 1.19 2006/11/14 01:01:43 sako Exp $ */ +/* $Id: modify_parameter.c,v 1.20 2007/07/12 06:10:45 sako Exp $ */ #include <stdio.h> #include <stdlib.h> @@ -416,3 +416,42 @@ } } +/* prosBufの音素時間長にあわせて状態継続長を決定する */ +void update_duration(){ + Model *m; + int state, p_index; + double rho,x,diffdur,data; + + m = mhead; + p_index = 0; + + while(1){ + rho = 0; + x = 0; + /* 音素時間長をチェック(同じなら修正なし) */ + if( m->phoneme->time != prosBuf.ph_dur[p_index]){ + rho = prosBuf.ph_dur[p_index] / FRAME_RATE; + + for(state=2;state <= nstate+1; state++){ + rho -= m->durmean[state]; + x += m->durvariance[state]; + } + rho /= x; + diffdur = 0; + m->totalduration = 0; /* 0にもどす */ + for(state=2;state <= nstate +1; state++) { + data = m->durmean[state] + rho * m->durvariance[state]; + m->duration[state] = (int)(data + diffdur + 0.5); + if( m->duration[state] < 0) m->duration[state] = 0; + m->totalduration += m->duration[state]; + diffdur += data - (float) m->duration[state]; + } + m->phoneme->time = m->totalduration * FRAME_RATE; + } + + if( m == mtail) break; /* 最後まで繰り返す */ + + m = m->next; + p_index +=1; + } +}