ソフトウエア

Speak interpreter( コード )

Speak interpreter モジュールのコードです。発声制御のアプリケーション・インタフェースの役割を持ちます。

◀ この記事の前に: Speak interpreter( 操作説明 )
▶ この記事の次に: Voice driver( 概要 )

概 要

Qumcum Lab.の主要機能( アプリケーション )から呼ばれる関数で構成しています。概要は以下のとおりです。

モジュールの構造

アプリーションからの指示の種類別に関数があります。その関数を統合している関数が executeSI()です。
各関数はおもにアプリケーションからの指示を受け付ける APIになります。指示は文字列( instruction )です。文字列の最初の文字が Speak interpreterへの指示(命令)になります。

関数の概要

関数は以下のとおりです。

外部関数

他のジュールやファイルの外部からアクセス可能な関数です。


引 数:

String szInput: インストラクション( ASCII文字列 )
tcX: 詳細は以下のとおり
t: 対象は音声で ‘s’
c: コマンドで以下のとおり( テキストひと文字 )
X: コマンドの引数で以下のとおり

コマンド命 令引 数
p再生発声N:フレーズ番号
i即時発声P:音声記号列
s発声速度の設定L:発音速度
・50 ~ 300の間で指定( 初期値:100% )
q発声の停止( なし )
w音声記号列の書き込みXXX%:音声記号列
・終了記号は %
e機能の開始/終了S:開始または終了
・1:開始 / 0:終了

分 類:

API( 対象はアプリケーション、他 )

機 能:

指示されたインストラクションを解析して発声する。( 各内部関数に振り分ける。)
デバッグ用の USB入力で使用している。

関係する関数:

上位関数: アプリケーション
下位関数: playSI(), speakSI(), setSpeedSI(), operateSI(), writeDataSI()
この関数のコードはこちらです。


引 数:

int nPhrase: 保存してある発声する言葉( 音声記号列 )の ID

IDは、事前に書き込み済みの音声記号列データは 0 ~ の指定、書き込み可能なデータは、書き込み時に SI_VAL_BASE を加算した値です。

分 類:

API、内部関数 

機 能:

あらかじめ保存してある発声を、IDを指定して開始する。

関係する関数:

上位関数: executeSI()、アプリケーション、他
下位関数: playVD()
この関数のコードはこちらです。


引 数:

String szSpeakData: すぐに発声する言葉( 音声記号列 )

分 類:

API、内部関数 

機 能:

あらかじめ保存してある発声を開始する。

関係する関数:

上位関数: executeSI()、アプリケーション、他
下位関数: playVD()
この関数のコードはこちらです。


引 数:

String szInput: 設定する発声速度

分 類:

API、内部関数 

機 能:

発声速度を設定(変更)する。

関係する関数:

上位関数: executeSI()、アプリケーション、他
下位関数: setSpeedVD()
この関数のコードはこちらです。


引 数:

String szData : 1文字目がIDで、2文字目が発声用の音声記号列データ
IDは 0 ~ 9 です。( playID() の指定は、SI_VAL_BASE を加算した値で指定します。 )

分 類:

API、内部関数 

機 能:

書き込み用の音声記号列データを書き込む。
保存できる音声記号列データ1つで、このインストラクションを使用すると上書き保存する。

関係する関数:

上位関数: executeSI()、アプリケーション、他
下位関数: ( なし )
この関数のコードはこちらです。


引 数:

int nSwitch : 発声・発音機能の開始と停止を設定
        ・VOICE_ON( 1 ): 発音機能の開始、DAC 増幅回路の電源 ON
        ・VOICE_OFF( 0 ): 発音機能の停止、DAC 増幅回路の電源 OFF

分 類:

API、内部関数 

機 能:

発声・発音機能の開始と停止を行う。

関係する関数:

上位関数: executeSI()、アプリケーション、他
下位関数: createDAC_VD(), releaseDAC_VD(), setPowerControVD()
この関数のコードはこちらです。


内部関数

外部から直接アクセスできずモジュール( 特定のスコープ内 )で使用する関数です。
Speak interpreter( コード )では内部関数はありません。


データの構造

データの構造は以下のとおりです。

グローバル定義

グローバル定義は以下のとおりです。

//------------------------------------------------------------------------------
// Speak interpreter
//------------------------------------------------------------------------------

//.... Argument ....
#define VOICE_ON			1
#define VOICE_OFF			0

//.... Buffer parameter....
#define LEN_SI_PHRASE		255		// siPhrase[] Buffer element maximum length
#define	SI_VAL_BASE			100		// base index of writable data
#define	SI_VAL_MAX			10		// siPhraseBuf[] Buffer element limit
名 称説 明
VOICE_ONdefine1発音機能の開始、DAC 増幅回路の電源 ON
VOICE_OFFdefine0発音機能の停止、DAC 増幅回路の電源 OFF
LEN_SI_PHRASEdefine255あらかじめ設定した音声記号列データ(配列)の要素当たりのデータ長(バイト数)
SI_VAL_MAXdefine10書き込み可能な音声記号列データ(配列)の最大要素数
SI_VAL_BASEdefine100書き込み可能な音声記号列データ(配列)の要素識別のための境界(オフセット値)
SI_FIX_MAX( enum )あらかじめ設定した音声記号列データ(配列)の要素数(成り行き)

SI_FIX_MAX は音声記号列データ(配列)の番号を決めている SI_PHRASE( enum配列 )の最終要素としています。最終要素はそのまま配列の最大要素数になります。この位置(最終要素の位置)に留め置くことにより音声記号列の数が変わっても自動的に最大要素数を表します。この位置に該当する配列 siPhrase[] の要素にはデータは入りません。

あらかじめ設定した音声記号列データ

あらかじめ設定した音声記号列データの配列は以下のとおりです。

//.... Phrase data ....
enum	SI_PHRASE {	
		SI_WRITABLE,										// 0: 
		SI_KONICHIWA,										// 1: KONNICHIWA
		SI_LRAFONY,											// 2: Leafony
		SI_QUMCUM,											// 3: Qumcum
		SI_QUMVER3,											// 4: Qumcum Laboratory ver.q3a
		SI_PRESENTED,										// 5: Presented by CRETARIA
		SI_DAIWA,											// 6: DAIWA MUSEN Kabushikigaisya
		SI_IT_READY,										// 7: It's ready.
		SI_FIX_MAX											// ( Number of dimension )
};	

const String siPhrase[SI_FIX_MAX] = {
	"",														// 0: 
	"konnnichiwa.",											// 1: SI_KONICHIWA
	"ri'i-/fo'ni/-.",										// 2: SI_LRAFONY
	"ku'mu/ku/mu.",											// 3: SI_QUMCUM
	"ku'mu/ku/mu ra'bora'tori  ba-jo/nn kyu'-/suri-/e'-/.",	// 4: SI_QUMVER3
	"pu'rese'nteddo bai kureta'ria.",						// 5: SI_PRESENTED
	"daiwamusenndenn/_ki/ kabu_shikiga'isha.",				// 6: SI_DAIWA
	"i'ttttsu/re'di-i/"										// 7: SI_IT_READY
};

音声記号列データの本体は siPhrase[]に保存して、その要素に対応する表記は enum型により SI_PHRASEで定義しています。siPhrase[] と SI_PHRASE は対応付けられている必要があります。SI_FIX_MAX この配列の要素数を示す値として使用しています。( 前項 )

グローバル変数

グローバル変数は以下のとおりです。

//------------------------------------------------------------------------------
// Speak interpreter
//------------------------------------------------------------------------------

//.... buffer ...
String		siPhraseBuf[SI_VAL_MAX];				// phrese buffer
変数名初期値説 明
siPhraseBuf [ SI_VAL_MAX ]String[]なし書き込み可能な音声記号列データ(配列)

コード

コードは以下のとおりです。

関数間の関係

処理ごとの関数の関係は以下のとおりです。

関数の関係は以下のとおりです。

外部関数


指定した保存してある音声記号列の発声を開始する。

/*----------------------------------------------------------------------------*/
/* Execute instruction SI
/* param     : String szInput / instruction
/* return    : -
/*----------------------------------------------------------------------------*/
void executeSI( String szInput )
{

	//.... local ....
	String	szArg1;
	int		nArg2;


	int		lenBuf		= szInput.length();
	char	nCommand	= szInput.charAt(1);

	switch ( nCommand ) {

		//.... Playback / "spN" ....
	  case 'p':
		szArg1	= szInput.substring(2, lenBuf);		// phrase numbern
		nArg2	= szArg1.toInt();
	    playSI( nArg2 );
	    break;
	
		//.... Speak immediately / "siX". ....
	  case 'i':
		szArg1	= szInput.substring(2, lenBuf);		// phonetic symbol data
	    speakSI( szArg1 );
	    break;
	
		//.... Set speaking speed / "ssN" ....
	  case 's':
		szArg1	= szInput.substring(2, lenBuf);		// speed
		nArg2	= szArg1.toInt();
	    setSpeedSI( nArg2 );
	    break;
	
		//.... Quit instruction / "sq" ....
	  case 'q':
	//    quitSI();
	    break;
	
		//.... Write data / "swX" ....
	  case 'w':
		szArg1	= szInput.substring(2, lenBuf);		// phonetic symbol data
	    writeDataSI( szArg1 );
	    break;
	
		//.... Enabble function / "seN" ....
	  case 'e':
		szArg1	= szInput.substring(2, lenBuf);	
		nArg2	= szArg1.toInt();					// enable or disable
	    operateSI( nArg2 );
	    break;

	}

}

指定した音声記号列の発声を開始する。

/*----------------------------------------------------------------------------*/
/* Playback the data for speech synthesis
/* param     : int nPhraseNo / Number of data for speech synthesis
/*				> SI_VAL_BASE : writable data siPhrasebuf[]
/*				< SI_VAL_BASE : stored data siPhrase[]
/* return    : -
/*----------------------------------------------------------------------------*/
void playSI( int nPhraseNo )
{

	//.... local ....
	String	speakData;


	//.... writable data ....
	if( nPhraseNo > SI_VAL_BASE ){
		nPhraseNo	-= SI_VAL_BASE;
		speakData	 = siPhraseBuf [ nPhraseNo ];

	//.... stored data ....
	} else {
		speakData = siPhrase [ nPhraseNo ];
	}

	playVD( speakData );

}

音声記号列データは siPhrase[] と siPhraseBuf[] に保存しています。siPhrase[] は保存済みのデータで、 siPhraseBuf[] は書き込み可能なデータです。配列は別々ですが対外的にはリニアな配列になっています。音声記号列データの指定は、保存済みか書き込み可能データにかかわらず指定できます。

siPhraseBuf[] のデータ数( 要素数 )は SI_VAL_MAX です。配列の添字で 0 から SI_VAL_MAX – 1 までです。外部からの指定は、SI_VAL_BASE を加算します。例えば、SI_VAL_BASEが 100の場合は、書き込み済みのデータを指定する場合は 0 ~となり、書き込み可能なデータは 100 ~となります。

引数は発声するデータ( 音声記号列 )を保存している配列の番号で文字列として受け取ります。


引数で指定した音声記号列の発声を開始する。

/*----------------------------------------------------------------------------*/
/* Speak immediately / "siX"
/* param     : String szInput / AquesTalk phonetic symbol data
/* return    : -
/*----------------------------------------------------------------------------*/
void speakSI( String szSpeakData )
{

	int		lenBuf		= szSpeakData.length();
	String	speakData	= szSpeakData.substring(1, lenBuf);		// sequence numbern

	playVD( speakData );

}

引数は発声するデータ( 音声記号列 )で文字列として受け取ります。


発声速度を設定(変更)する。

/*----------------------------------------------------------------------------*/
/* Set speed speaking / "ssN"
/* param     : int nSpeed / speaking speed
/* return    : -
/*----------------------------------------------------------------------------*/
void setSpeedSI( int nSpeed )
{

	setSpeedVD( nSpeed );

}

書き込み用シーケンスデータを書き込む。

/*----------------------------------------------------------------------------*/
/* Write phonetic symbol data / "swX"
/* param     : 
/* return    : -
/*----------------------------------------------------------------------------*/
int writeDataSI( String szData )
{

	int		lenBuf	= szData.length();
	int		nIndex	= szData.charAt(0);
	String	szArg1	= szData.substring(1, lenBuf);

	if(( nIndex < SI_VAL_MAX )&&( lenBuf < LEN_SI_PHRASE ) {
		siPhraseBuf[nIndex] = szArg1;
	}

}

音声記号列データは siPhrase[] と siPhraseBuf[] に保存しています。siPhrase[] は書き込み済みのデータで、 siPhraseBuf[] は書き込み可能なデータです。配列は別々ですが対外的にはリニアな配列になっています。データの書き込み時は、書き込みができる配列の範囲であることとデータ長であるこを確認して、範囲内である場合に書き込みを行います。

siPhraseBuf[] のデータ数( 要素数 )は SI_VAL_MAX です。配列の添字で 0 から SI_VAL_MAX – 1 までです。外部からの指定は、SI_VAL_BASE を加算します。例えば、SI_VAL_BASEが 100の場合は、書き込み済みのデータを指定する場合は 0 ~となり、書き込み可能なデータは 100 ~となります。


発音機能の開始/停止を制御します。併せて DAC 増幅回路の電源を ON / OFF します。

引 数:

・発声の操作( switchVoice ):
 VOICE_ON : 発音機能の開始、DAC 増幅回路の電源 ON
 VOICE_OFF: 発音機能の停止、DAC 増幅回路の電源 OFF

/*----------------------------------------------------------------------------*/
/* Start or stop speak
/* param     : int nSwitch / VOICE_ON or VOICE_OFF
/* return    : -
/*----------------------------------------------------------------------------*/
operateSI( int nSwitch )  {

	if( nSwitch == VOICE_ON ){
		DAC_Create();
		setPowerControVD( SOUND_POWER_ON );

	} else {
		DAC_Release();
		setPowerControVD( SOUND_POWER_OFF );
	}		
}	

参考情報

参考になる情報は以下のとおりです。

このホームページ内

他のWebサイト

カテゴリー
最近の記事 おすすめ記事

記事一覧を表示するには、カスタム投稿「ブログ」にて、4つ以上記事を作成してください。

記事一覧を表示するには、カスタム投稿「ブログ」にて、4つ以上記事を作成してください。

TOP