[RaspberryPi] gTTS와 음악 재생 예제

Sireal·2021년 11월 8일
0

Raspberry Pi

목록 보기
10/14
post-thumbnail
post-custom-banner

설치

  • gTTS : 구글 TTS 패키지
pip install gTTS
  • Pydub : 소리 관련 패키지
pip install pydub
  • simpleaudio : 소리를 재생시키려면 필요한 패키지
pip install simpleaudio

예제

  • gTTS에는 소리를 재생시켜주는 함수가 없다
    • pydub으로 gTTS의 소리를 재생시켜준다.
  • gTTS 문제점
    • 남자목소리를 바꾸지 못한다.
    • 말하는 속도가 마음에 들지 않는다.
  • 해결방안
  • 사실상 pydub 예제나 다름없다
import os
from glob import glob
from io import BytesIO

from gtts import gTTS
from pydub import AudioSegment
from pydub.playback import play
from pydub import effects

# 사운드 컨트롤 클래스
class SoundController:
    # 음악 재생 함수
    def playMp3(self, songPath):
        self.music = AudioSegment.from_file(songPath, format="mp3")
        play(self.music)

    # 음악 배속 재생 함수
    def playMp3_speed(self, songPath, speed):
        self.music = AudioSegment.from_file(songPath, format="mp3")
        song_speed = self.music.speedup(
            playback_speed=speed, chunk_size=150, crossfade=25)
        play(song_speed)

    # TTS 함수
    def ttsKR(self, word):
        # gTTS로 글자 받아오기
        tts = gTTS(text=word, lang="ko", tld="co.kr", slow="False")
        # 파일포인터 지정, 바이트 정보로 encoding
        self.fp = BytesIO()
        tts.write_to_fp(self.fp)
        # 시작 바이트로 이동
        self.fp.seek(0)

        # pydub, simpleAudio
        self.say = AudioSegment.from_file(self.fp, format="mp3")
        play(self.say)

        # ffcache 파일이 생성돼서 glob wild card로 전부 삭제
        self.fileList = glob("./ffcache*")
        for self.filePath in self.fileList:
            os.remove(self.filePath)

    # TTS 배속 함수
    def ttsKR_speed(self, word, speed):
        # gTTS로 글자 받아오기
        tts = gTTS(text=word, lang="ko", tld="co.kr", slow="False")
        # 파일포인터 지정, 바이트 정보로 encoding
        self.fp = BytesIO()
        tts.write_to_fp(self.fp)
        # 시작 바이트로 이동
        self.fp.seek(0)

        # pydub, simpleAudio
        self.say = AudioSegment.from_file(self.fp, format="mp3")
        # 전부 배속
        # song = self.say._spawn(self.say.raw_data, overrides={
        #     "frame_rate": int(self.say.frame_rate * 2.0)
        # })
        # 단순 프레임을 끊어서 배속(목소리변함없음)
        song_speed = self.say.speedup(
            playback_speed=speed, chunk_size=150, crossfade=25)

        play(song_speed)
        # ffcache 파일이 생성돼서 glob wild card로 전부 삭제
        self.fileList = glob("./ffcache*")
        for self.filePath in self.fileList:
            os.remove(self.filePath)

if __name__ == "__main__":
    soundCtrl = SoundController()
    soundCtrl.playMp3("./sounds/pass.mp3")
    soundCtrl.ttsKR("통과입니다.")
    soundCtrl.playMp3_speed("./sounds/pass.mp3", 1.25)
    soundCtrl.ttsKR_speed("통과입니다!", 1.25)
    soundCtrl.playMp3_speed("./sounds/failed.mp3", 1.25)
    soundCtrl.ttsKR_speed("마스크를 써주세요!", 1.25)
    soundCtrl.playMp3_speed("./sounds/failed.mp3", 1.25)
    soundCtrl.ttsKR_speed("발열감지! 다시 측정해주세요", 1.5)

gTTS 장단점

장점

  • 아무런 절차없이 무료로 사용할 수 있음
    • 네이버TTS는 API 신청을 통해 사용 가능
  • 텍스쳐를 읽어줌으로써 활용도가 굉장히 높다

단점

  • 인터넷 연결이 필수
    • 순간적인 딜레이가 발생할 수 밖에 없음
  • 목소리가 하나밖에 없으며 속도제어를 하려면 다른 라이브러리를 활용해야함
profile
🚄계속 앞으로🚄
post-custom-banner

0개의 댓글