Como sei, posso usar system()
a função para usar comandos do terminal Linux dentro do meu código C++. Por exemplo system("aplay sound.wav");
. Não sei, posso escrever todos os comandos do Linux assim ou não, mas aplay
funciona.
Eu quero usar espeak
no meu programa C++. Gosto que o espeak leia cada string que passo por ele (algo parecido com o que aplay
faz no código acima, mas respeitando as "strings"). É melhor chamá-lo por system()
função ou é melhor escrever um código como este dentro do meu código C++ e alterar char* text
sempre que eu quiser ler uma nova string?:
#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;
}
Qual deles é mais rápido?
Responder1
Minha resposta curta é sim.
Por favor, confirme se entendi o que você perguntou.
Por favor, considere o que acontece quando você chama o sistema:
- Seu programa iniciará a execução de um shell;
- Este shell lerá a linha de comando que você passou para ele;
- O shell iniciará o programa que você passou para system() - no seu caso é
espeak
; - O programa receberá as opções que você passou;
- Finalmente, o programa será executado.
Portanto, os itens de 1 a 3 (e talvez 4) ficam todos sobrecarregados quando você usa system()
, versus quando você inicia a mesma funcionalidade em seu código-fonte.
Se você encontrar uma maneira de chamar a mesma funcionalidade por espeak
meio de uma chamada de função em seu programa, terá tempos de resposta mais rápidos.
Não sei falar, então tentarei responder em termos genéricos.
- Primeiro, nem sempre é fácil ter a mesma funcionalidade de um programa em execução no seu código-fonte. Alguns programas têm suas funcionalidades espalhadas por uma infinidade de opções, e pode ser difícil entender isso e criar uma função em seu código para fazer o que você pode expressar facilmente por meio da linha de comando;
- 2º, você terá que avaliar o custo benefício da transformação. Com os atuais processadores de alto desempenho e a abundância de memória, iniciar um shell e depois seu programa possivelmente não levará muito tempo. Essa sobrecarga é particularmente insignificante se você começar apenas
espeak
algumas vezes, com um texto relativamente longo para ser falado.