SampleTalk.c
Go to the documentation of this file.
1 /**********************************************************************
2  SampleTalk.c - AquesTalk2 Linux 規則音声合成 サンプルプログラム
3 
4  標準入力から音声記号列を1行読み込み、
5  標準出力に音声波形(.wavフォーマット)を出力
6 
7  COPYRIGHT (C) 2010 AQUEST CORP.
8 
9  使用方法は、readme.txt を参照ください。
10 
11  2010/01/23 N.Yamazaki Creation
12  2010/07/07 K.Okada Modified
13 **********************************************************************/
14 #include <stdio.h>
15 #include <memory.h>
16 #include <unistd.h>
17 #include <stdlib.h>
18 #include <sys/types.h>
19 #include <sys/stat.h>
20 #include <AquesTalk2.h>
21 
22 // AquestTalk クラスのヘッダ
23 void * file_load(const char * file, int * psize);
24 
25 int main(int ac, char **av)
26 {
27  char speak_str[65536];
28  char phont_fname[1024]={"phont/aq_f3a.phont"},
29  input_fname[1024]={""}, output_fname[1024]={"output.wav"};
30  int opt;
31 
32  while ((opt = getopt(ac, av, "p:o:")) != -1) {
33  switch (opt) {
34  case 'p':
35  strncpy(phont_fname,optarg,1024);
36  break;
37  case 'o':
38  strncpy(output_fname,optarg,1024);
39  break;
40  default:
41  fprintf(stderr, "Usage : %s [-p phont_file] [-o output_file] [intput_file]\n", av[0]);
42  exit(EXIT_FAILURE);
43  }
44  }
45  if (optind < ac ) {
46  strncpy(input_fname,av[optind],1024);
47  }
48  fprintf(stderr, "Phont file : %s\n", phont_fname);
49  fprintf(stderr, "Input file : %s\n", input_fname);
50  fprintf(stderr, "Output file : %s\n", output_fname);
51 
52  // Phont ファイルの読み込み
53  int size;
54  void *pPhont = file_load(phont_fname, &size); // Phont ファイルをここで指定
55  if(pPhont ==0) {
56  fprintf(stderr, "could not found phont file %s\n", phont_fname);
57  return-2;
58  }
59 
60  FILE *input_fp = stdin;
61  if ((strlen(input_fname)>0)&&((input_fp = fopen(input_fname, "r"))==NULL)) {
62  fprintf(stderr, "could not found input file %s\n", input_fname);
63  return -2;
64  }
65  if(fgets(speak_str,65536-1,input_fp)==0) {
66  fprintf(stderr, "could not get input string");
67  }
68  if ( input_fp != stdin ) fclose(input_fp);
69 
70  // メモリ上に音声データを生成
71  unsigned char *wav = AquesTalk2_Synthe_Utf8(speak_str, 100, &size, pPhont);
72  if(wav==0) {
73  fprintf(stderr, "ERR %d\n", size); // エラー時は size にエラーコードが返る
74  switch (size) {
75  case 100: fprintf(stderr, "その他のエラー\n"); break;
76  case 101: fprintf(stderr, "メモリ不足\n"); break;
77  case 102: fprintf(stderr, "音声記号列に未定義の読み記号が指定された\n"); break;
78  case 103: fprintf(stderr, "韻律データの時間長がマイナスなっている\n"); break;
79  case 104: fprintf(stderr, "内部エラー(未定義の区切りコード検出)\n"); break;
80  case 105: fprintf(stderr, "音声記号列に未定義の読み記号が指定された\n"); break;
81  case 106: fprintf(stderr, "音声記号列のタグの指定が正しくない\n"); break;
82  case 107: fprintf(stderr, "タグの長さが制限を越えている(または[>]がみつからない)\n"); break;
83  case 108: fprintf(stderr, "タグ内の値の指定が正しくない\n"); break;
84  case 109: fprintf(stderr, "WAVE 再生ができない(サウンドドライバ関連の問題)\n"); break;
85  case 110: fprintf(stderr, "WAVE 再生ができない(サウンドドライバ関連の問題 非同期再生)\n"); break;
86  case 111: fprintf(stderr, "発声すべきデータがない\n"); break;
87  case 200: fprintf(stderr, "音声記号列が長すぎる\n"); break;
88  case 201: fprintf(stderr, "1つのフレーズ中の読み記号が多すぎる\n"); break;
89  case 202: fprintf(stderr, "音声記号列が長い(内部バッファオーバー1)\n"); break;
90  case 203: fprintf(stderr, "ヒープメモリ不足\n"); break;
91  case 204: fprintf(stderr, "音声記号列が長い(内部バッファオーバー1)\n"); break;
92  }
93  fprintf(stderr, "Please refer to https://www.a-quest.com/archive/manual/aqtk2_lnx_man.pdf for more info.\n");
94  return -1;
95  }
96  // Phont データの開放(音声合成が終わったら開放できる)
97  free(pPhont);
98 
99  // 音声データ(wavフォーマット)の出力
100  FILE *fp = fopen(output_fname, "wb");
101  fwrite(wav, 1, size, fp);
102  fclose(fp);
103  // Synthe()で生成した音声データは、使用後に呼び出し側で解放する
104  AquesTalk2_FreeWave (wav);
105  return 0;
106  }
107 
108 // ファイルの読み込み
109 void * file_load(const char * file, int * psize)
110 {
111  FILE *fp;
112  char *data;
113  struct stat st;
114  *psize = 0;
115  if( stat(file, &st)!=0) return NULL;
116  if((data=(char *)malloc(st.st_size))==NULL){
117  fprintf(stderr,"can not alloc memory(file_load)¥n");
118  return NULL;
119  }
120  if((fp=fopen(file,"rb"))==NULL) {
121  free(data);
122  perror(file);
123  return NULL;
124  }
125  if(fread(data, 1, st.st_size, fp)<(unsigned)st.st_size) {
126  fprintf(stderr,"can not read data (file_load)¥n");
127  free(data);
128  fclose(fp);
129  return NULL;
130  }
131  fclose(fp);
132  *psize = st.st_size;
133  return data;
134 }
int main(int ac, char **av)
Definition: SampleTalk.c:25
void * file_load(const char *file, int *psize)
Definition: SampleTalk.c:109


aques_talk
Author(s): AQUEST Corp, ROS package maintained by Kei Okada
autogenerated on Tue May 11 2021 02:55:26