Segmentation Fault が回避できなかったので C++ に移行
このコミットが含まれているのは:
+78
@@ -0,0 +1,78 @@
|
|||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
/*! @class AqKanji2Koe
|
||||||
|
|
||||||
|
@brief AquesTalk用言語処理部 (Linux)
|
||||||
|
|
||||||
|
漢字かな混じりテキスト->かな音声記号列
|
||||||
|
|
||||||
|
@author N.Yamazaki (Aquest)
|
||||||
|
|
||||||
|
@date 2022/12/07 N.Yamazaki Ver.4.1.3
|
||||||
|
*/
|
||||||
|
// COPYRIGHT (C) 2019 AQUEST CORP.
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
#if !defined(_AQ_KANJI2KOE_H_)
|
||||||
|
#define _AQ_KANJI2KOE_H_
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/////////////////////////////////////////////
|
||||||
|
//! 言語処理インスタンス生成(初期化)
|
||||||
|
//! @param pathDic[in] 辞書のディレクトリを指定(最後に/が有っても無くても良い)
|
||||||
|
//! @param pErr[out] エラー時にはエラーコードが入る 正常終了時は不定値
|
||||||
|
//! @return インスタンスハンドル エラーの時は0が返る
|
||||||
|
void * AqKanji2Koe_Create(const char *pathDic, int *pErr);
|
||||||
|
|
||||||
|
/////////////////////////////////////////////
|
||||||
|
//! 言語処理インスタンス生成 (初期化)その2
|
||||||
|
//! 呼び出し側で辞書データ(バイナリ)をメモリに読み込んでから指定
|
||||||
|
//! 初期化を高速化するためのメモリマップトファイルなどが使える
|
||||||
|
//! @param pSysDic[in] システム辞書データ先頭アドレス(必須)
|
||||||
|
//! @param pUserDic[in] ユーザ辞書データ先頭アドレス(使用しないときは0を指定)
|
||||||
|
//! @param pErr[out] エラー時にはエラーコードが入る 正常終了時は不定値
|
||||||
|
//! @return インスタンスハンドル エラーの時は0が返る
|
||||||
|
void * AqKanji2Koe_Create_Ptr(const void *pSysDic, const void *pUserDic, int *pErr);
|
||||||
|
|
||||||
|
/////////////////////////////////////////////
|
||||||
|
//! インスタンス解放
|
||||||
|
//! @param hAqKanji2Koe[in] AqKanji2Koe_Create()で返されたインスタンスハンドル
|
||||||
|
void AqKanji2Koe_Release(void *hAqKanji2Koe);
|
||||||
|
|
||||||
|
/////////////////////////////////////////////
|
||||||
|
//! 言語処理 (かな音声記号列出力)
|
||||||
|
//! @param hAqKanji2Koe[in] AqKanji2Koe_Create()で返されたインスタンスハンドル
|
||||||
|
//! @param kanji[in] 漢字かな混じり文テキスト(UTF8 BOM無)
|
||||||
|
//! @param koe[out] カナ音声記号列(UTF8 BOM無)
|
||||||
|
//! @param nBufKoe[in] koeのバッファサイズ[byte]
|
||||||
|
//! @return 0:正常終了 それ以外:エラーコード
|
||||||
|
int AqKanji2Koe_Convert(void *hAqKanji2Koe, const char *kanji, char *koe, int nBufKoe);
|
||||||
|
|
||||||
|
/////////////////////////////////////////////
|
||||||
|
//! 言語処理 (ローマ字音声記号列出力)
|
||||||
|
//! @param hAqKanji2Koe[in] AqKanji2Koe_Create()で返されたインスタンスハンドル
|
||||||
|
//! @param kanji[in] 漢字かな混じり文テキスト(UTF8 BOM無)
|
||||||
|
//! @param koe[out] ローマ字音声記号列(UTF8 BOM無)
|
||||||
|
//! @param nBufKoe[in] koeのバッファサイズ[byte]
|
||||||
|
//! @return 0:正常終了 それ以外:エラーコード
|
||||||
|
int AqKanji2Koe_ConvRoman(void *hAqKanji2Koe, const char *kanji, char *koe, int nBufKoe);
|
||||||
|
|
||||||
|
/////////////////////////////////////////////
|
||||||
|
//! 開発ライセンスキー設定
|
||||||
|
//! 音声波形を生成する前に一度呼び出す。
|
||||||
|
//! これにより評価版の制限がなくなる。
|
||||||
|
//! @param key[in] 開発ライセンスキーを指定
|
||||||
|
//! @return ライセンスキーが正しければ0、正しくなければ1が返る
|
||||||
|
//! *キーの解析を防ぐため不正なキーでも0を返す場合がある。このとき制限は解除されない。
|
||||||
|
int AqKanji2Koe_SetDevKey(const char *devKey);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif // !defined(_AQ_KANJI2KOE_H_)
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
// ! Copyright AQUEST Corp. 2006- . All Rights Reserved. !
|
||||||
|
// ! An unpublished and CONFIDENTIAL work. Reproduction, adaptation, or !
|
||||||
|
// ! translation without prior written permission is prohibited except !
|
||||||
|
// ! as allowed under the copyright laws. !
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
/*-------------------------------------------------------------
|
||||||
|
Kanji2KoeCmd - かな漢字混じりテキストを音声記号列に変換
|
||||||
|
|
||||||
|
$ Kanji2KoeCmd (dic_dir) < in.txt > out.koe
|
||||||
|
|
||||||
|
■ビルド(GCC 5.1以上の環境が必要)
|
||||||
|
$ ln -sf ../lib64/libAqKanji2Koe.so.4.0 ./libAqKanji2Koe.so.4
|
||||||
|
$ ln -sf ../lib64/libAqKanji2Koe.so.4.0 ./libAqKanji2Koe.so
|
||||||
|
$ g++ -I./lib64 -o Kanji2KoeCmd Kanji2KoeCmd.cpp -L. -lAqKanji2Koe
|
||||||
|
|
||||||
|
■実行
|
||||||
|
$ echo 音声合成テスト | LD_LIBRARY_PATH=. ./Kanji2KoeCmd ../aq_dic
|
||||||
|
|
||||||
|
■ライブラリの配置
|
||||||
|
libAqKanji2Koe.so.X.Xを他のアプリからも呼び出す場合は、
|
||||||
|
ldconfigコマンドで共有ライブラリに登録する。
|
||||||
|
詳しくは、本ライブラリのマニュアルの「ライブラリ配置」を参照
|
||||||
|
|
||||||
|
■辞書の配置(デフォルト)
|
||||||
|
|
||||||
|
|- Kanji2KoeCmd
|
||||||
|
|- aq_dic/ 辞書フォルダ(aq_dic)を同じディレクトリに配置
|
||||||
|
|- aqdic.bin
|
||||||
|
|- aq_user.dic (ユーザ辞書:任意)
|
||||||
|
|- CREDITS
|
||||||
|
|
||||||
|
|
||||||
|
2011/01/14 N.Yamazaki Creation
|
||||||
|
2019/03/05 N.Yamazaki Ver.4用に一部修正
|
||||||
|
|
||||||
|
-------------------------------------------------------------*/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <locale.h> // setlocale()
|
||||||
|
#include "AqKanji2Koe.h"
|
||||||
|
|
||||||
|
#define NSTR 4096
|
||||||
|
|
||||||
|
char * GetPathDic(const char *pathModule);
|
||||||
|
|
||||||
|
int main(int ac, char **av)
|
||||||
|
{
|
||||||
|
int iret;
|
||||||
|
char kanji[NSTR];
|
||||||
|
char koe[NSTR];
|
||||||
|
void *hAqKanji2Koe;
|
||||||
|
|
||||||
|
// 開発ライセンスキー(ライセンス証に記載)の設定
|
||||||
|
// iret = AqKanji2Koe_SetDevKey("XXX-XXX-XXX");
|
||||||
|
|
||||||
|
if(ac==1){
|
||||||
|
char *pPathDic = GetPathDic(av[0]);
|
||||||
|
hAqKanji2Koe = AqKanji2Koe_Create(pPathDic, &iret);
|
||||||
|
free(pPathDic);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
hAqKanji2Koe = AqKanji2Koe_Create(av[1], &iret);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(hAqKanji2Koe==0){
|
||||||
|
fprintf(stderr, "ERR: can not initialize Dictionary(%d)\n", iret);
|
||||||
|
fprintf(stderr, "USAGE: $ Kanji2KoeCmd (dic_dir) < in.txt > out.koe\n");
|
||||||
|
return iret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for(i=0; ; i++){
|
||||||
|
if(fgets(kanji, NSTR, stdin)==0) break;
|
||||||
|
iret = AqKanji2Koe_Convert(hAqKanji2Koe, kanji, koe, NSTR);
|
||||||
|
if(iret!=0) {
|
||||||
|
fprintf(stderr, "ERR: AqKanji2Koe_Convert()=%d\n", iret);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fprintf(stdout, "%s\n", koe);
|
||||||
|
}
|
||||||
|
|
||||||
|
AqKanji2Koe_Release(hAqKanji2Koe);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char * GetPathDic(const char *pathModule)
|
||||||
|
{
|
||||||
|
char *p = strrchr((char*)pathModule, '/');
|
||||||
|
if(p==NULL){
|
||||||
|
return strdup("./aq_dic");
|
||||||
|
}
|
||||||
|
char *path = (char*)malloc(strlen(pathModule)+strlen("/aq_dic")+1);
|
||||||
|
strncpy(path, pathModule, p-pathModule);
|
||||||
|
strcpy(path+(p-pathModule), "/aq_dic");
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
新しい課題から参照
ユーザをブロックする