Насколько я знаю, я могу использовать system()
функцию для использования команд терминала Linux внутри моего кода C++. Например 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
; - Программа получит переданные вами параметры;
- Наконец, программа будет выполнена.
Таким образом, пункты с 1 по 3 (а может быть, и 4) являются накладными расходами при использовании system()
, в отличие от запуска той же функциональности в исходном коде.
Если вы найдете способ вызвать ту же функциональность espeak
посредством вызова функции в своей программе, то вы получите более быстрое время отклика.
Я не разбираюсь в espeak, поэтому постараюсь ответить в общих чертах.
- Во-первых, не всегда легко иметь ту же функциональность работающей программы в исходном коде. Некоторые программы имеют свою функциональность, распределенную по множеству опций, и может быть сложно понять это и создать функцию в вашем коде, чтобы сделать то, что вы можете легко выразить им через командную строку;
- Во-вторых, вам придется оценить выгоду от преобразования. С нынешними высокопроизводительными процессорами и обилием памяти запуск оболочки, а затем вашей программы, возможно, не займет слишком много времени. Эти накладные расходы особенно незначительны, если вы будете запускать всего
espeak
несколько раз, с относительно длинным текстом для озвучивания.