-1

对不起,如果问题标题不好,但我试图解释我的意思:

据我所知,我可以使用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;
}

哪个更快?

4

1 回答 1

1

system()一般来说,我建议在考虑使用调用来执行另一个程序之前,更喜欢使用库函数,或者编写提供所需功能的代码。

如果有适当的 API(也就是一组库函数)直接提供所需的功能,那么如果使用该 API,您的程序可能会更可靠。显然,这是假设库函数正常工作,并且有足够的文档来正确使用它们。这里的风险与错误或记录不充分的库函数以及这些库的作者在解决问题时的响应能力有关。

如果没有合适的 API 可用,那么下一个选项是自己实现所需的功能(使用您可以访问的代码和库)然后 - 假设您做了合理的工作 - 然后,您的程序再次运行得相当好。这里的风险在你的控制之下——你对你想要做什么的理解程度,你设计和实现所需功能的能力(例如,工作超出你的理解范围有多远?),以及你付出的努力把事情做好。

作为最后的手段,您可以使用system()呼叫。这里的问题是其行为system()是正式实现定义的,因此主机系统、编译器及其标准库之间可能会有所不同。第二部分是您必须处理使用system()调用执行的程序(或外壳)的行为 - 例如,如果第三方程序的作者引入了新功能,它实际上可以改变该程序的运行方式- 例如,添加 GUI、更改命令行选项等。虽然库函数的更改方式可能会破坏您的程序,但使用调用执行的第三方程序system()更有可能随着时间的推移而改变,从而破坏您的程序。程序。

我并不是建议你永远不要使用system(). 但是,如果其他方法令人望而却步,则将其视为一种选择,而不是您使用的第一个工具。

于 2017-11-26T12:49:19.103 回答