이우의 개발일지
C++ 에서 Google STT, TTS 이용하기 with Python 본문
C++에서 TTS/ STT 기능 구현하기
현재 연구하는 모듈 중 C++ 환경에서 코드의 유기성을 위해 파이썬을 사용하지 않고 STT(Speech to Text)와 TTS(Text to Speech) 기능을 구현할려 했다.
방법은 오디오 데이터를 Base 64로 인코딩을 한 후 libcurl 라이브러리를 이용해서 Google Cloud API에 HTTP 요청을 할려했다. 하지만, 이 과정에서 파이썬은 간단하게 라이브러리 함수를 사용하면 모든게 편하지만 C++에서 할려면 인증, 데이터 인코딩, 요청 형식 등의 세부 설정을 해줘야했다...
json 파일을 만들어서 Google Cloud에 인증을 Key와 ID 등을 다 입력하고, curl을 통해 HTTP 요청을 했지만..... 실패...!
결론적으로는 403에러가 뜨면서 Permission denied라고 떴는데, API 키는 정상적이였으니 내 생각에는 요청 형식에 문제가 있었던 것 같다. 그래서 다른 방법으로 구현하기로 했다.
C++ 중간에 STT 기능을 가진 파이썬 파일을 열어서 프로그램을 실행하고, 원하는 결과를 얻으면 프로그램 종료. TTS 기능도 똑같은 시퀀스로 진행하였다.
이 방법을 이용하니깐 놀라우리만치 빠르게 기능을 구현하기 성공.. ㅋㅋ 다시 한번 파이썬의 편함을 느껴버렸다
google-cloud-speech 라이브러리라고 google이 python 코드로 직접 제공하는 클라이언트 라이브러리다. 이 라이브러리를 사용하면 google cloud api와의 상호작용을 간소화할 수 있다. 설정한 부분이 최소화되어 있어 개발자가 별도의 복잡한 설정 없이 API호출을 할 수 있다. (python 라이브러리는 인증 파일을 자동으로 로드하고 처리해주며, 요청 포맷이나 인코딩도 라이브러리가 알아서 맞춰주는 엄청 간편한 기능이...)
https://cloud.google.com/cpp/docs/reference/speech/latest
혹시나 C++로 기능을 구현하고 싶은 부분은 구글 클라우드에서 제공하는 API 예제를 참고하길 바란다.
(구현 성공했으면 어떻게 했는지 댓글 달아주시면 감사하겠습니다 ㅎㅎ)
Python Text to Speech (TTS) 기능 구현 코드
import os
from google.cloud import texttospeech
def synthesize_text_to_speech(text, output_file):
client = texttospeech.TextToSpeechClient()
input_text = texttospeech.SynthesisInput(text=text)
# 남성 목소리로 변경
voice = texttospeech.VoiceSelectionParams(
language_code="ko-KR",
ssml_gender=texttospeech.SsmlVoiceGender.MALE
)
audio_config = texttospeech.AudioConfig(
audio_encoding=texttospeech.AudioEncoding.LINEAR16
)
response = client.synthesize_speech(
input=input_text, voice=voice, audio_config=audio_config
)
with open(output_file, "wb") as out:
out.write(response.audio_content)
print(f"TTS generated audio saved to: {output_file}")
if __name__ == "__main__":
import sys
if len(sys.argv) < 3:
print("Usage: python tts_script.py <text> <output_file>")
sys.exit(1)
text = sys.argv[1]
output_file = sys.argv[2]
synthesize_text_to_speech(text, output_file)
C++ Text to Speech 구현 코드
std::string execTtsPythonScript(const std::string& text, const std::string& output_file) {
std::string command = "python3 tts_script.py \"" + text + "\" " + output_file;
std::array<char, 128> buffer;
std::string result;
std::shared_ptr<FILE> pipe(popen(command.c_str(), "r"), pclose);
if (!pipe) throw std::runtime_error("popen() failed!");
while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
result += buffer.data();
}
return result;
}
int main() {
std::string tts_output_file = "response_audio.wav";
execTtsPythonScript(gpt_response, tts_output_file);
std::cout << "TTS Audio saved to " << tts_output_file << std::endl;
return 0;
}
결론은, C++에서 STT와 TTS가 필요한 시점에 파이썬 파일을 실행하는 C++ 함수를 불러와서 원하는 기능을 파이썬에서 실행시킨 뒤 그 결과를 C++로 받아 결과를 자유롭게 코드 안에서 쓸 수 있게 만든 것이다.
이렇게 하면, 코드의 유기성을 지킬 수 있으면서 다양한 API 를 편하게 사용할 수 있다는 장점이 있다. 다만, 파이썬 프로그램을 실행시키는데 0.5초 정도의 딜레이 타임은 존재한다.
'Coding' 카테고리의 다른 글
C++에서 Chat GPT API 이용하기 with Python (0) | 2024.11.08 |
---|---|
[C/C++] 징검다리 /소프티어/ DP / LIS (0) | 2024.10.31 |
[C/C++] Carry 피하기 /백트래킹/ 코드트리 (0) | 2024.10.30 |
[C/C++] 화면에 출력 / BFS / 코드트리 / 실버1 (0) | 2024.10.29 |
[C/C++] 백준 1654번 랜선 자르기 / 이분 탐색 알고리즘 - (1) (0) | 2024.10.20 |