Извините, если название вопроса не очень хорошее, но я пытаюсь объяснить, что я имею в виду:
Как я знаю, я могу использовать 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;
}
Какой из них быстрее?
Вообще говоря, я бы предложил использовать библиотечные функции или написать код, обеспечивающий необходимые функциональные возможности, прежде чем рассматривать возможность вызова system()
выполнить другую программу.
Если существует соответствующий API (он же набор библиотечных функций), который напрямую обеспечивает требуемую функциональность, ваша программа, вероятно, будет более надежной, если будет использовать этот API. Очевидно, это предполагает, что библиотечные функции работают правильно, и имеется достаточно документации для их правильного использования. Здесь риски связаны с ошибками или плохо документированными библиотечными функциями, а также с отзывчивостью авторов этих библиотек в решении проблем.
Если подходящего API нет в наличии, то следующий вариант — реализовать необходимые функции самостоятельно (используя код и библиотеки, к которым у вас есть доступ), а затем — при условии, что вы выполняете разумную работу — тогда ваша программа работает достаточно хорошо. Риски здесь находятся под вашим контролем — насколько хорошо вы понимаете, что вы пытаетесь сделать, насколько вы способны разрабатывать и реализовывать необходимые функции (например, насколько далеко за пределами вашего понимания находится работа?) И усилия, которые вы вкладываете в делай вещи хорошо
В крайнем случае, вы можете использовать system()
вызов. Проблема здесь в поведении system()
формально определяется реализацией, поэтому может варьироваться между хост-системами, компиляторами и их стандартными библиотеками. Вторая часть заключается в том, что вам приходится иметь дело с поведением программы (или оболочки), которая выполняется с использованием system()
вызов — например, если автор сторонней программы вводит новые функциональные возможности, он может фактически изменить способ выполнения этой программы — например, добавление графического интерфейса пользователя, изменение параметров командной строки и т. д. Хотя функции библиотеки МОГУТ изменяться таким образом, что сломать вашу программу, сторонние программы, выполняемые с использованием system()
вызов НАМНОГО более вероятно изменится со временем таким образом, что это нарушит вашу программу.
Я не предлагаю вам никогда не использовать system()
, Но рассматривайте это как вариант, если другие подходы запрещают, а не первый инструмент, к которому вы обращаетесь.
Других решений пока нет …