Speak interpreter モジュールのコードです。発声制御のアプリケーション・インタフェースの役割を持ちます。
◀ この記事の前に: Speak interpreter( 操作説明 )
▶ この記事の次に: Voice driver( 概要 )
概 要
Qumcum Lab.の主要機能( アプリケーション )から呼ばれる関数で構成しています。概要は以下のとおりです。
モジュールの構造
アプリーションからの指示の種類別に関数があります。その関数を統合している関数が executeSI()です。
各関数はおもにアプリケーションからの指示を受け付ける APIになります。指示は文字列( instruction )です。文字列の最初の文字が Speak interpreterへの指示(命令)になります。
関数の概要
関数は以下のとおりです。
外部関数
他のジュールやファイルの外部からアクセス可能な関数です。
executeSI( String szInput )
引 数:
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()
この関数のコードはこちらです。
playSI( int nPhrase )
引 数:
int nPhrase: 保存してある発声する言葉( 音声記号列 )の ID
IDは、事前に書き込み済みの音声記号列データは 0 ~ の指定、書き込み可能なデータは、書き込み時に SI_VAL_BASE を加算した値です。
分 類:
API、内部関数
機 能:
あらかじめ保存してある発声を、IDを指定して開始する。
関係する関数:
上位関数: executeSI()、アプリケーション、他
下位関数: playVD()
この関数のコードはこちらです。
speakSI( String szSpeakData )
引 数:
String szSpeakData: すぐに発声する言葉( 音声記号列 )
分 類:
API、内部関数
機 能:
あらかじめ保存してある発声を開始する。
関係する関数:
上位関数: executeSI()、アプリケーション、他
下位関数: playVD()
この関数のコードはこちらです。
setSpeedSI( int nSpeed )
引 数:
String szInput: 設定する発声速度
分 類:
API、内部関数
機 能:
発声速度を設定(変更)する。
関係する関数:
上位関数: executeSI()、アプリケーション、他
下位関数: setSpeedVD()
この関数のコードはこちらです。
writeDataSI( String szData )
引 数:
String szData : 1文字目がIDで、2文字目が発声用の音声記号列データ
IDは 0 ~ 9 です。( playID() の指定は、SI_VAL_BASE を加算した値で指定します。 )
分 類:
API、内部関数
機 能:
書き込み用の音声記号列データを書き込む。
保存できる音声記号列データ1つで、このインストラクションを使用すると上書き保存する。
関係する関数:
上位関数: executeSI()、アプリケーション、他
下位関数: ( なし )
この関数のコードはこちらです。
operateSI( int nSwitch )
引 数:
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_ON | define | 1 | 発音機能の開始、DAC 増幅回路の電源 ON |
VOICE_OFF | define | 0 | 発音機能の停止、DAC 増幅回路の電源 OFF |
LEN_SI_PHRASE | define | 255 | あらかじめ設定した音声記号列データ(配列)の要素当たりのデータ長(バイト数) |
SI_VAL_MAX | define | 10 | 書き込み可能な音声記号列データ(配列)の最大要素数 |
SI_VAL_BASE | define | 100 | 書き込み可能な音声記号列データ(配列)の要素識別のための境界(オフセット値) |
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[] | なし | 書き込み可能な音声記号列データ(配列) |
コード
コードは以下のとおりです。
関数間の関係
処理ごとの関数の関係は以下のとおりです。
関数の関係は以下のとおりです。
外部関数
executeSI( String szInput )
指定した保存してある音声記号列の発声を開始する。
/*----------------------------------------------------------------------------*/
/* 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;
}
}
playSI( int nPhraseNo )
指定した音声記号列の発声を開始する。
/*----------------------------------------------------------------------------*/
/* 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 ~となります。
引数は発声するデータ( 音声記号列 )を保存している配列の番号で文字列として受け取ります。
speakSI( String szSpeakData )
引数で指定した音声記号列の発声を開始する。
/*----------------------------------------------------------------------------*/
/* 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 );
}
引数は発声するデータ( 音声記号列 )で文字列として受け取ります。
setSpeedSI( int nSpeed )
発声速度を設定(変更)する。
/*----------------------------------------------------------------------------*/
/* Set speed speaking / "ssN"
/* param : int nSpeed / speaking speed
/* return : -
/*----------------------------------------------------------------------------*/
void setSpeedSI( int nSpeed )
{
setSpeedVD( nSpeed );
}
writeDataSI( String szData )
書き込み用シーケンスデータを書き込む。
/*----------------------------------------------------------------------------*/
/* 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 ~となります。
operateSI( int nSwitch )
発音機能の開始/停止を制御します。併せて 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 );
}
}
参考情報
参考になる情報は以下のとおりです。
このホームページ内
- 発音・発声( DAC出力 / ハードウエア ): MCUの DACを使用して発音や発声を行うハードウエアを説明します。
- Speak interpreter ( 概要 ): 発声処理の最上位、Speak interrupter の概要です。
- Speak interpreter( 操作説明 ): アプリケーションからの操作方法です。( API )
- Speak interpreter( コード ): コードの詳細を説明します。
- Voice driver( 概要 ): 発音そのものの処理です。( API )
- Voice driver( 操作説明 ): 個々のサーボモータを制御する方法です。
- Voice driver( コード ): コードの詳細を説明します。
- 音声合成ライブラリ: ライブラリの概要や導入方法を説明します。