[개발이야기#023] 내가 해보고 싶은 것 - 나만의 AI 비서 / 2. 텍스트를음성으로(TTS)[postingcuration]

in #kr20 hours ago


안녕하세요 가야태자 @talkit 입니다.

오늘은 지난 번 STT주제에 이어서 TTS의 이론을 조금 알아 보겠습니다.

그전에 이글은 #postingcuration 프로젝트의 지원을 받으면서 글을 쓰고 있습니다.

관심 있는 분은 태그를 누르셔서 다른 분들의 글도 많은 응원 부탁 드립니다.

다음으로 이전 글의 소개 입니다.

오늘은 지난 번 글에 이어서 TTS를 실제로 구동해보고 테스트 해보겠습니다.

인공지능과 자율주행에 관하여 - https://steemit.com/kr/@talkit/019-ai-postingcuration

STT의 이론적인 이야기 - https://steemit.com/kr/@talkit/019-ai-1-sttpostingcuration

STT를 실제로 구동 - https://steemit.com/kr/@talkit/021-ai-1-sttpostingcuration

TTS를 이론적 배경 - https://steemit.com/kr/@talkit/022-ai-2-ttspostingcuration

이 글로 처음 들어 오신 분들은 위의 글도 한번 봐주시면 감사하겠습니다.

자 이제 본 격적으로 TTS를 시작 하겠습니다.

테스트를 시작 하겠습니다.

Google Cloud API를 이용한 방법

비용이 들긴 하지만 가장 확실하고 강력한 방법입니다.

저희가 학습시킬필요도 없고, API를 이용해서 사용하기만 하면 됩니다.

Google 클라우드 콘솔에서 API 등록하기

Google 클라우드 콘솔에서 text to speech API를 사용할 수 있도록 자신의 프로젝트에 추가하고 프로젝트가 없을 경우는 API키를 새로 만드셔야 합니다.

API키가 있을 경우는 해당 API키를 사용하시면 됩니다.

API를 위한 파이썬 라이버래리 설치

pip install google-cloud-texttospeech
pip install request

항상 느끼는 거지만 내가 만들 것인가 돈을 들일 것인가가 딜레마이네요 ^^

일단 패키지는 위 두개만 설치 하시면 됩니다.

코드 작성하기

import google.auth
from google.cloud import texttospeech_v1
from google.auth.transport.requests import Request
import requests
import base64

# API 키 설정
API_KEY = "여기에 발급받은 API 키를 입력하세요."  # 여기에 발급받은 API 키를 입력하세요.

# Google Cloud TTS 요청을 위한 함수
def google_tts_korean_with_api_key(text, output_file):
    url = "https://texttospeech.googleapis.com/v1/text:synthesize"
    
    # 요청 본문 설정 (한국어 TTS 요청)
    body = {
        "input": {"text": text},
        "voice": {"languageCode": "ko-KR", "ssmlGender": "NEUTRAL"},
        "audioConfig": {"audioEncoding": "MP3"}
    }

    # API 키를 포함한 요청 헤더 설정
    headers = {
        "X-Goog-Api-Key": API_KEY,
        "Content-Type": "application/json"
    }

    # 요청 보내기
    response = requests.post(url, json=body, headers=headers)

    # 응답 처리
    if response.status_code == 200:
        audio_content = response.json()['audioContent']
        # 오디오 내용을 Base64 디코딩 후 파일로 저장
        with open(output_file, "wb") as out:
            out.write(base64.b64decode(audio_content))
        print(f"Audio content written to file {output_file}")
    else:
        print(f"Error: {response.status_code} - {response.text}")

# 예시 사용
text = "안녕하세요, 저는 홍길순 입니다. 오늘은 날씨가 맑습니다."
output_file = "output_korean_google_api_key.mp3"
google_tts_korean_with_api_key(text, output_file)

처음에 base64 인코딩 관련 처리를 안해줘서 ^^ mp3가 정상적으로 출력이 안되었었는데 위 코드로 출력이 가능 합니다.

위 코드에서 API키를 config파일에 넣고 하는 작업은 다음에 해보겠습니다.^^

mp3를 첨부해 드리고 싶은데 ^^

방법을 모르겠네요 ㅎㅎㅎ

실행 방법

아나콘다는 잘 설치 되어 있으리 라고 믿고 그 다음 부터 설명 드리겠습니다.

가상환경 생성: python3 -m venv myenv
가상환경 활성화:
Windows: myenv\Scripts\activate
macOS/Linux: source myenv/bin/activate
필요한 패키지 설치: pip install requests
프로그램 실행: python main.py

프로그램 실행은 main.py로 파일명을 저장하셨을때이고 ^^ 다른 이름으로 저장하시면 myenv하고, main.py는 변경하셔야 합니다.

정말 목소리가 괜찮은 여자분 목소리로 제가 원하는 텍스트를 한글로 잘 읽어 줍니다. ^^

Google TTS는 여기까지 하겠습니다.

직접 TTS 인공지능을 이용하여 구현 하기

직접 실행하는 방법은

여기서는 Mozilla TTS 라이브러리를 사용하여 CPU에서 한국어 TTS를 구현하는 방법을 설명하겠습니다.

라고 참고하고있는 ChatGPT가 이야기를 하네요 ^^

일단 GPU가 없는 관계로 CPU로 해보고 지난 번 처럼 구글 음질이나 이런걸 비교 해보겠습니다. ^^

사전 설치

pip install TTS

저는 설치한게 TTS만 설치했는데 엄청 많은 라이버래리가 설치 되고 있습니다.

앞에서 만든 가상환경에서 실행하시면 됩니다.

중간중간에 보니 pandas torch 등이 설치되고 있네요 ^^

일단 여기 까지의 시도는 모두 실패 입니다. ^^

그래서 다른 방법으로 시도 했습니다.

ESPNET 프로젝트를 이용한 TTS 실행해보기

음 설정 과정이 조금 험난합니다.

일단 윈도우즈에서는 실행이 안됩니다. T.T

리눅스나 맥에서 하셔야 할 것 같습니다.

저 엔진을 이용해서 웹에다가 글자를 넣으면 처리하고 처리된 wave파일을 링크해주는 그런 UI를 하나 만들면 어떨까하는 생각이 듭니다.

상당히 음성도 괜찮습니다. ^^

우선 여기서도 환경설정이 중요 합니다.

일단 아나콘다 설치는 제외 합니다.

그리고, pytorch나 사용하고 있는 여러가지 기술들이 CPU의 특정한 계산 모듈을 사용하기를 원하기 때문에 우분투에 가상화 해둔 아이는 안되는 것 같습니다.

가상화 할때 CPU 관련 기술을 가상화된 서버에 넘길 수 있으면 될 것 같은데요 T.T

여는 그래서 저는 지난 번에 WSL 즉 Windows Sub Linux 시스템을 이용했습니다.

Ubuntu여서 한번 설명을 해보겠습니다.

우분투 개발 도구 설치

sudo apt install build-essential git wget python3-dev python3-pip python3-venv cmake

제가 참고한 챗GPT는 위와 같이 넣어 줬지만

sudo apt install build-essential git wget cmake

저는 아나콘다는 사용할꺼라서 python 관련 개발툴은 빼고 진행 했습니다.

cmake는 원래 없었는데 환경설정하다가 T.T 저게 등장합니다.

까시는게 도움이 되실 겁니다. ^^

설치 끝났고, 아나콘다가 깔려 있다면
적당한 위치로 이동을 합니다.

git clone https://github.com/espnet/espnet
cd espnet

해서 espnet을 클론해 옵니다.

python3 -m venv espnet_env
source espnet_env/bin/activate

위와 같이 가상환경을 만듭니다.

저는 GPU가 없어서 CPU버전으로 진행 했습니다.

pip install torch torchvision torchaudio

토치 관련 모듈을 실행해 줍니다.

pip install -e .
pip install -e ".[all]"

여기서 오류가 많이 발생 했습니다.

아마 저위에 리눅스 관련 모듈 설치 하셨으면은 잘 되실껍니다.

잘 안되시면 오류를 캡쳐 하셔서 댓글로 또는 chatGPT에게 문의를 ^^

그리고, espnet 루트 폴더에서 tools 라는 폴더로 이동 합니다.

setup_anaconda.sh

위 명령어를 수행해 주십시오.

그러면 뭔가 중간에 오류나 워닝이 조금 있지만, activate_python.sh

위 파일이 만들어지면 성공한 것입니다.

이것은 순수 테스트여서 여기까지 하셨으면 espnet 환경이 정상적으로 설정 되었는지 테스트 합니다.

espnet을 clone 한곳으로 이동해서

cd egs2/librispeech/asr1
./run.sh

위에서 뭔가 막지나가고 오류가 없으면 성공한 것입니다.

저는 한국어로 하고 싶었기 때문에 kss라는 학습 파일이 필요하다고 합니다.

cd egs2/kss/tts1
#여기에 kss 관련 파일을 다운로드해야 합니다. 

https://www.kaggle.com/datasets/bryanpark/korean-single-speaker-speech-dataset

데이터 셋은 위에서 다운로드 합니다.

wget으로 잘안되서 저는 파일을 윈도우에서 받아서 업로드 했습니다.

WSL을 사용하셨을 경우
윈도우즈의 c:\에 저당한 폴더를 만드시고 다음과 같이 하시면 됩니다.

cd espnet디렉토리
mkdir downloads
cp /mnt/c/폴더명/archive.zip espnet디렉토리/downloads/ 
unzip archive.zip

우와 같이 하면 transcript.v.1.4.txt 파일과 kss 폴더가 downloads 폴더에 풀립니다.

저희는 kss 기반의 tts를 수행 할꺼라서

cd egs2/kss/tts1
vi db.sh

위와 같이 db.sh를 열어서
KSS= 이라는 항목을 찾아서 espnet디렉토리/downloads/ 을 넣어 줍니다.

2줄 있습니다.

KSS=/home/계정명/espnet/downloads

위와 같이 해주시면 됩니다.
저 변수가 두개가 있으니 둘다 동일하게 변경해주십시오.

제가 삽질한 부분입니다. ^^ 저게 이해가 안되서 ㅋㅋㅋ

그리고, kss로 선행학습한 파일을 다운로드 하겠습니다.

./run.sh --skip_data_prep false --skip_train true --download_model imdanboy/kss_tts_train_jets_raw_phn_korean_cleaner_korean_jaso_train.total_count.ave

위 명령어를 수행하면 kss기반의 학습이 진행되고 조금 시간이 걸립니다. 저는 CPU라서 T.T
GPU는 빠르려나요?

이제 마지막으로

import soundfile as sf
from espnet_model_zoo.downloader import ModelDownloader
from espnet2.bin.tts_inference import Text2Speech

# 모델 다운로드 및 설정
d = ModelDownloader()
model_tag = "imdanboy/kss_tts_train_jets_raw_phn_korean_cleaner_korean_jaso_train.total_count.ave"
model = d.download_and_unpack(model_tag)

# Text2Speech 인스턴스 생성
text2speech = Text2Speech.from_pretrained(**model)

# 변환할 텍스트
text = "안녕하세요, 이것은 한국어 음성 합성 예제입니다."

# 음성 합성 수행
speech = text2speech(text)["wav"]

# 결과를 파일로 저장
sf.write("output_korean_tts.wav", speech.numpy(), 24000)
print("TTS 변환 완료, output_korean_tts.wav 파일에 저장되었습니다.")

위코드를 적당한 파일로 저장하고

실행 하면됩니다.

python3 tts_test.py

저는 위와 같이 실행했습니다.

음 품질은 STT와 달리 상당히 좋습니다.

오 진짜로 이걸로 제품화 해도 되겠다라는 생각이 듭니다.

감사합니다.



Posted through the ECblog app (https://blog.etain.club)

Sort:  

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

와~ 고생하셨습니다!
TTS 방법을 (1) 구글 API (2) TTS (3) ESPNET 의 세 가지 알려주신 것 같은데요~

(1)은 유료인 것 같아서... 저는 시간될 때 (3)번 ESPNET 방법으로 TTS를 한 번 해보도록 할께요~! 그런데, 윈도우는 안된다고하시고, virtual box의 우분투도 잘 안되는 것 같으니, 윈도우 WSL 혹은 맥을 이용해봐야 할 것 같네요~ ^^

친절하고 상세한 설명 감사합니다! ^^

구글도 해보셔도 됩니다. ^^ 백만자까지 무료 입니다. ^^