據我所知,我可以使用system()
函數在我的 C++ 程式碼中使用 Linux 終端機的命令。例如system("aplay sound.wav");
。我不知道我是否可以像這樣編寫所有 Linux 命令,但aplay
可以。
我想espeak
在我的 C++ 程式中使用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
我的簡短回答是肯定的。
請確認我是否理解您的問題。
請考慮當您呼叫系統時會發生什麼:
- 您的程式將開始執行 shell;
- 該 shell 將讀取您傳遞給它的命令列;
- shell 將啟動您傳遞給 system() 的程式——在您的情況下它是
espeak
; - 該程式將接收您傳遞給它的選項;
- 最後,程序將執行。
system()
因此,當您使用 時,與在原始程式碼中啟動相同功能時相比,從 1 到 3(也可能是 4)的專案都是開銷。
espeak
如果您找到一種方法來透過程式中的函數呼叫來呼叫相同的功能,那麼您將獲得更快的回應時間。
我不了解espeak,所以我會嘗試用通用術語回答。
- 第一,在原始程式碼中擁有與正在運行的程式相同的功能並不總是那麼容易。有些程式的功能分佈在無數的選項中,可能很難理解這一點,也很難在程式碼中建立一個函數來完成您可以透過命令列輕鬆表達的功能;
- 第二,您必須評估轉型的成本效益。憑藉當前的高效能處理器和大量內存,啟動 shell 然後啟動您的程式可能不會花費太多時間。如果您只開始
espeak
幾次,並且要朗讀的文字相對較長,那麼這種開銷就特別可以忽略不計。