据我所知,我可以使用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
我的简短回答是肯定的。
请确认我是否理解您的问题。
请考虑当您调用系统时会发生什么:
- 您的程序将开始执行 shell;
- 该 shell 将读取您传递给它的命令行;
- shell 将启动您传递给 system() 的程序——在您的情况下它是
espeak
; - 该程序将接收您传递给它的选项;
- 最后,程序将执行。
system()
因此,当您使用 时,与在源代码中启动相同功能时相比,从 1 到 3(也可能是 4)的项目都是开销。
espeak
如果您找到一种方法来通过程序中的函数调用来调用相同的功能,那么您将获得更快的响应时间。
我不了解 espeak,所以我将尝试用通用术语来回答。
- 第一,在源代码中拥有与正在运行的程序相同的功能并不总是那么容易。有些程序的功能分布在无数的选项中,可能很难理解这一点,也很难在代码中创建一个函数来完成您可以通过命令行轻松表达的功能;
- 第二,您必须评估转型的成本效益。凭借当前的高性能处理器和大量内存,启动 shell 然后启动程序可能不会花费太多时间。如果您只开始
espeak
几次,并且要朗读的文本相对较长,那么这种开销就特别可以忽略不计。