Soweit ich weiß, kann ich system()
Funktionen verwenden, um Befehle des Linux-Terminals in meinem C++-Code zu verwenden. Beispiel system("aplay sound.wav");
: Ich weiß nicht, ob ich alle Linux-Befehle so schreiben kann oder nicht, aber aplay
es funktioniert.
Ich möchte es in meinem C++-Programm verwenden. Ich espeak
möchte, dass espeak jeden String liest, den ich durchlaufe (so ähnlich wie aplay
im obigen Code, aber mit Bezug auf „Strings“). Ist es besser, es per Funktion aufzurufen system()
, oder ist es besser, einen Code wie diesen in meinen C++-Code zu schreiben und ihn jedes char* text
Mal zu ändern, wenn ich einen neuen String lesen möchte?:
#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;
}
Welches ist schneller?
Antwort1
Meine kurze Antwort lautet: Ja.
Bitte bestätigen Sie, ob ich Ihre Frage verstanden habe.
Bitte bedenken Sie, was passiert, wenn Sie das System aufrufen:
- Ihr Programm startet die Ausführung einer Shell.
- Diese Shell liest die Befehlszeile, die Sie ihr übergeben haben.
- Die Shell startet das Programm, das Sie an system() übergeben haben – in Ihrem Fall ist es
espeak
; - Das Programm erhält die Optionen, die Sie ihm übergeben haben.
- Schließlich wird das Programm ausgeführt.
Daher sind die Elemente 1 bis 3 (und möglicherweise 4) alle Overhead, wenn Sie verwenden system()
, im Vergleich dazu, wenn Sie dieselbe Funktionalität in Ihrem Quellcode starten.
Wenn Sie eine Möglichkeit finden, die gleiche Funktionalität über einen Funktionsaufruf in Ihrem Programm aufzurufen espeak
, erzielen Sie schnellere Reaktionszeiten.
Da ich keine Ahnung von Espeak habe, werde ich versuchen, allgemein zu antworten.
- 1. Es ist nicht immer einfach, die gleiche Funktionalität wie bei einem laufenden Programm in Ihrem Quellcode zu haben. Bei manchen Programmen ist die Funktionalität auf eine Unzahl von Optionen verteilt, und es kann schwierig sein, das zu verstehen und eine Funktion in Ihrem Code zu erstellen, die das tut, was Sie ihnen einfach über die Befehlszeile mitteilen können.
- Zweitens müssen Sie den Kosten-Nutzen-Faktor der Umwandlung abwägen. Bei den aktuellen Hochleistungsprozessoren und der Fülle an Speicher wird das Starten einer Shell und dann Ihres Programms wahrscheinlich nicht allzu viel Zeit in Anspruch nehmen. Dieser Aufwand ist insbesondere dann vernachlässigbar, wenn Sie nur
espeak
wenige Male starten und relativ lange Texte vorgelesen werden müssen.