私が知っている限り、system()
関数を使用してC ++コードでLinux端末のコマンドを使用できます。たとえばsystem("aplay sound.wav");
。このようなすべてのLinuxコマンドを書くことができるかどうかはわかりませんが、aplay
そうです。
espeak
私のC ++プログラムで使用したいです。私はspeakを介して渡されるすべての文字列を読むのが好きです(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
このオーバーヘッドは、数回だけ開始し、読んでいるテキストが比較的長い場合には特に無視できます。