Browse Source

Segmentation Fault が回避できなかったので C++ に移行

btc-sounds
Gitea 1 year ago
parent
commit
da59975cba
3 changed files with 171 additions and 0 deletions
  1. +78
    -0
      AqKanji2Koe.h
  2. BIN
      aques
  3. +93
    -0
      aques.cpp

+ 78
- 0
AqKanji2Koe.h View File

@@ -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. !
// ----------------------------------------------------------------------

BIN
aques View File


+ 93
- 0
aques.cpp View File

@@ -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;
}


Loading…
Cancel
Save