내가 아는 한, 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;
}
어느 것이 더 빠르나요?
답변1
나의 짧은 대답은 '그렇다'이다.
귀하의 질문을 이해했는지 확인해주세요.
시스템을 호출하면 어떤 일이 발생하는지 생각해 보세요.
- 프로그램이 셸 실행을 시작합니다.
- 쉘은 전달한 명령줄을 읽습니다.
- 쉘은 system()에 전달한 프로그램을 시작합니다. 귀하의 경우에는
espeak
; - 프로그램은 귀하가 전달한 옵션을 받게 됩니다.
- 마지막으로 프로그램이 실행됩니다.
system()
따라서 사용 시 1~3(아마도 4) 항목은 소스 코드에서 동일한 기능을 실행할 때와 비교하여 오버헤드가 됩니다.
espeak
프로그램에서 함수 호출을 통해 동일한 기능을 호출하는 방법을 찾으면 응답 시간이 더 빨라질 것입니다.
저는 영어를 잘 모르기 때문에 일반적인 용어로 답변해 드리겠습니다.
- 첫째, 실행 중인 프로그램과 동일한 기능을 소스 코드에 포함하는 것이 항상 쉬운 것은 아닙니다. 일부 프로그램에는 수많은 옵션에 걸쳐 기능이 분산되어 있으므로 이를 이해하고 명령줄을 통해 쉽게 표현할 수 있는 작업을 수행하는 함수를 코드에서 생성하는 것이 어려울 수 있습니다.
- 둘째, 전환의 비용-혜택을 평가해야 합니다. 오늘날의 고성능 프로세서와 대용량 메모리를 사용하면 셸을 시작한 다음 프로그램을 시작하는 데 그리 오랜 시간이 걸리지 않을 것입니다.
espeak
이 오버헤드는 몇 번만 시작하고 읽고 있는 텍스트가 비교적 긴 경우에는 특히 무시할 수 있습니다.