ご存知のとおり、system()
C++ コード内で Linux ターミナルのコマンドを使用するには関数を使用できます。たとえばsystem("aplay sound.wav");
、すべての Linux コマンドをこのように記述できるかどうかはわかりませんが、aplay
動作します。
espeak
C++ プログラムで使用したいです。espeak は、渡される各文字列を読み取ります (aplay
上記のコードで行われることと似ていますが、「文字列」に関するものです)。system()
関数で呼び出す方がよいですか、それとも C++ コード内に次のようなコードを記述して、char* text
新しい文字列を読み取りたいときに変更する方がよいですか。
#include <string.h>
#include <malloc.h>
#include <espeak-ng/speak_lib.h>
espeak_POSITION_TYPE position_type;
espeak_AUDIO_OUTPUT output;
char *path=NULL;
int Buflength = 500, Options=0;
void* user_data;
t_espeak_callback *SynthCallback;
espeak_PARAMETER Parm;
char Voice[] = {"English"};
char *text = {"this is a english test"};
unsigned int Size,position=0, end_position=0, flags=espeakCHARS_AUTO, *unique_identifier;
int main(int argc, char* argv[] )
{
output = AUDIO_OUTPUT_PLAYBACK;
int I, Run = 1, L;
espeak_Initialize(output, Buflength, path, Options );
espeak_SetVoiceByName(Voice);
const char *langNativeString = "en"; //Default to US English
espeak_VOICE voice;
memset(&voice, 0, sizeof(espeak_VOICE)); // Zero out the voice first
voice.languages = langNativeString;
voice.name = "US";
voice.variant = 2;
voice.gender = 1;
espeak_SetVoiceByProperties(&voice);
Size = strlen(text)+1;
espeak_Synth( text, Size, position, position_type, end_position, flags,
unique_identifier, user_data );
espeak_Synchronize( );
return 0;
}
どちらが速いですか?
答え1
私の短い答えは「はい」です。
ご質問の内容を私が理解したかどうか確認してください。
システムを呼び出すと何が起こるか考えてみましょう:
- プログラムはシェルの実行を開始します。
- このシェルは渡されたコマンドラインを読み取ります。
- シェルは、system() に渡されたプログラムを起動します。あなたの場合は、次のようになります
espeak
。 - プログラムは渡されたオプションを受け取ります。
- 最後に、プログラムが実行されます。
system()
したがって、 を使用する場合、ソース コード内で同じ機能を開始する場合と比較して、 の項目 1 から 3 (およびおそらく 4) はすべてオーバーヘッドになります。
espeak
プログラム内で関数呼び出しを介して同じ機能を呼び出す方法を見つけると、応答時間が短縮されます。
espeak についてはよくわからないので、一般的な言葉で答えようと思います。
- まず、実行中のプログラムと同じ機能をソース コードに組み込むのは必ずしも簡単ではありません。プログラムによっては、機能が無数のオプションに分散しているため、それを理解して、コマンド ライン経由で簡単に表現できる機能を実行する関数をコード内に作成することが難しい場合があります。
- 2 番目に、変換のコストメリットを評価する必要があります。現在の高性能プロセッサと大量のメモリがあれば、シェルを起動してからプログラムを起動するのにそれほど時間はかからないでしょう。起動を
espeak
数回だけ行い、比較的長いテキストを読み上げるだけであれば、そのオーバーヘッドは特に無視できるほど小さいものです。