본문 바로가기

Linux

인공지능 전기차 충전 플랫폼 Project 1 : 인공지능 스피커 만들기

반응형

https://www.youtube.com/watch?v=WTul6LIjIBA 

가상환경을 만든 뒤 가상환경에서 작업

python -m venv myenv

가상환경 ' myenv ' 파일 생성 

경로 이동 후 activate

/myenv/bin/activate

참고로 해당 경로는 우분투 리눅스 기반입니다. 

윈도우는 다를 수 있습니다. 

<TEXT TO SPEECH>

pip install gTTS
pip install playsound==1.2.2
# 네비게이션에 접목하기 위한 ai


# --------------------------------


from gtts import gTTS

txt = 'Can I help you ??'

file_name = 'sample.mp3'
tts_en = gTTS(text=txt, lang='en')

tts_en.save(file_name)

mps 파일 생깁니다. 

sample.mp3
0.00MB

에러가 하나 발생했다

ModuleNotFoundError: No module named 'gi'

-> 찾아보자 이게 왜 생기는지 

아래 코드를 입력해주면 해결된다. 

두번째 이야기하지만 리눅스에서 생기는 에러라고 생각되니까 걱정 안하셔도 된다. 

sudo apt install libcairo2-dev libxt-dev libgirepository1.0-dev

pip install pycairo PyGObject

https://stackoverflow.com/questions/71369726/no-module-named-gi

 

No module named gi

i have try all the possible command given below: pip install pgi , pip install PyGObject , pip install python-gi Still not able to install the module in python . Installed python 3.7 also try t...

stackoverflow.com

해결하고 나니 

또 다른 에러 발생

에러 메시지를 보면 "NoneType" 객체는 'props' 속성이 없다는 것을 알려주고 있습니다. 이 오류는 playbin이라는 GStreamer 구성 요소에서 발생합니다. playbin은 GStreamer에서 오디오 재생을 처리하는 데 사용되며, "props"는 해당 재생기의 속성을 나타내는 변수입니다.

이 오류는 주로 playsound 라이브러리가 사용하는 GStreamer와 관련이 있습니다. 이러한 문제는 보통 GStreamer 라이브러리를 설치하지 않았거나 이전 버전을 사용하는 경우에 발생할 수 있습니다.

해결 방법으로는, 먼저 GStreamer 라이브러리가 설치되어 있는지 확인해야합니다. 아래와 같이 터미널에서 명령어를 입력하여 확인할 수 있습니다.

 
dpkg -l | grep gstreamer

만약 설치되어 있지 않다면, 아래 명령어를 사용하여 설치할 수 있습니다.

 
sudo apt-get install -y gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly

만약 이 방법이 도움이 되지 않는다면, playsound 라이브러리를 업그레이드 해보는 것도 고려해볼 수 있습니다.

또 다른 해결 방법으로는 playsound 대신 Pygame 라이브러리를 사용하는 것입니다. Pygame은 사운드와 믹싱에 대한 더 많은 제어를 제공하며, playsound에서 발생할 수 있는 일부 문제를 해결할 수 있습니다. Pygame을 사용하려면 먼저 설치해야 합니다. 다음 명령어를 사용하여 설치할 수 있습니다.

 
pip install pygame

그리고 나서 코드를 아래와 같이 수정하여 Pygame을 사용하도록 변경해보세요.

import pygame 
file_name = 'sample.mp3' 
text = "파이썬을 배우면 이런 것도 할 수 있당" 
tts_ko = gTTS(text=text, lang='ko') 
tts_ko.save(file_name) 

pygame.mixer.init() 
pygame.mixer.music.load(file_name) 
pygame.mixer.music.play() 

while pygame.mixer.music.get_busy(): 
	pygame.time.Clock().tick(10)

이 코드에서는 Pygame의 mixer 모듈을 사용하여 오디오 파일을 로드하고 재생합니다. while 루프는 재생이 완료될 때까지 프로그램을 유지합니다. 이 방법은 playsound와 달리 Pygame 라이브러리가 제대로 설치되어 있다면 문제없이 재생될 것입니다.

[최종 코드]

# 네비게이션에 접목하기 위한 ai


# --------------------------------

import pygame
from gtts import gTTS

file_name = 'sample.mp3'
#
# 긴문장 (파일에서 불러와서 처리)

with open('sample.txt', 'r', encoding='utf8') as f:

    text = f.read()
    tts_ko = gTTS(text=text, lang='ko')
    tts_ko.save(file_name)

    pygame.mixer.init()
    pygame.mixer.music.load(file_name)
    pygame.mixer.music.play()
    while pygame.mixer.music.get_busy():
        pygame.time.Clock().tick(10)

<SPEECH TO TEXT>

pip install SpeechRecognition
pip install PyAudio

리눅스에서는 이것도 문제가 있다.

우분투에서 PyAudio를 설치하는 방법은 다음과 같습니다:


우분투 패키지 매니저에서 필요한 패키지 설치

sudo apt-get install python3-dev python3-pip portaudio19-dev



pip를 사용하여 PyAudio 설치

pip3 install pyaudio

위와 같이 추가로 진행해주시면 됩니다 .

[최종 코드] 

# 네비게이션에 접목하기 위한 ai


# --------------------------------

import speech_recognition as sr
r = sr.Recognizer()
with sr.Microphone() as source:
    print("말씀을 하세요")
    audio = r.listen(source)

try:
    # 구글 API 인식 (하루 50 회 제한)
    text = r.recognize_google(audio, language='en-US')
    print(text)

except sr.UnknownValueError:
    print("음성 인식 실패")
except sr.RequestError as e:
    print(f"요청 실패 : {e}")

 

[TEST ]

ALSA lib pcm.c:2664:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2664:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2664:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm_route.c:877:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_route.c:877:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_route.c:877:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_route.c:877:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_oss.c:397:(_snd_pcm_oss_open) Cannot open device /dev/dsp
ALSA lib pcm_oss.c:397:(_snd_pcm_oss_open) Cannot open device /dev/dsp
ALSA lib confmisc.c:160:(snd_config_get_card) Invalid field card
ALSA lib pcm_usb_stream.c:482:(_snd_pcm_usb_stream_open) Invalid card 'card'
ALSA lib confmisc.c:160:(snd_config_get_card) Invalid field card
ALSA lib pcm_usb_stream.c:482:(_snd_pcm_usb_stream_open) Invalid card 'card'
ALSA lib pcm.c:2664:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2664:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2664:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm_route.c:877:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_route.c:877:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_route.c:877:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_route.c:877:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_oss.c:397:(_snd_pcm_oss_open) Cannot open device /dev/dsp
ALSA lib pcm_oss.c:397:(_snd_pcm_oss_open) Cannot open device /dev/dsp
ALSA lib confmisc.c:160:(snd_config_get_card) Invalid field card
ALSA lib pcm_usb_stream.c:482:(_snd_pcm_usb_stream_open) Invalid card 'card'
ALSA lib confmisc.c:160:(snd_config_get_card) Invalid field card
ALSA lib pcm_usb_stream.c:482:(_snd_pcm_usb_stream_open) Invalid card 'card'
말씀을 하세요
hello
(myenv) centumjoonho@centumjoonho:~/joonho/ai_speech$ /home/centumjoonho/joonho/ai_speech/myenv/bin/python /home/centumjoonho/joonho/ai_speech/ai_gtts_speech_to_text.py
ALSA lib pcm.c:2664:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2664:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2664:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm_route.c:877:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_route.c:877:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_route.c:877:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_route.c:877:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_oss.c:397:(_snd_pcm_oss_open) Cannot open device /dev/dsp
ALSA lib pcm_oss.c:397:(_snd_pcm_oss_open) Cannot open device /dev/dsp
ALSA lib confmisc.c:160:(snd_config_get_card) Invalid field card
ALSA lib pcm_usb_stream.c:482:(_snd_pcm_usb_stream_open) Invalid card 'card'
ALSA lib confmisc.c:160:(snd_config_get_card) Invalid field card
ALSA lib pcm_usb_stream.c:482:(_snd_pcm_usb_stream_open) Invalid card 'card'
ALSA lib pcm.c:2664:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2664:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2664:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm_route.c:877:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_route.c:877:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_route.c:877:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_route.c:877:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_oss.c:397:(_snd_pcm_oss_open) Cannot open device /dev/dsp
ALSA lib pcm_oss.c:397:(_snd_pcm_oss_open) Cannot open device /dev/dsp
ALSA lib confmisc.c:160:(snd_config_get_card) Invalid field card
ALSA lib pcm_usb_stream.c:482:(_snd_pcm_usb_stream_open) Invalid card 'card'
ALSA lib confmisc.c:160:(snd_config_get_card) Invalid field card
ALSA lib pcm_usb_stream.c:482:(_snd_pcm_usb_stream_open) Invalid card 'card'
말씀을 하세요
Hi how are you I'm fine thank you

뭔 에러가 많이 딸려 오는데 일단은 성공

한글도 코드만 바꿔주면 된다. 

text = r.recognize_google(audio, language='ko')
    print(text)
말씀을 하세요
내가 지금부터 말을 하는데 이렇게 빨리 말해도 네가 잘 알아들을 수 있을까 나는 걱정이 돼

[녹음된 파일 가져오는 방법]

# --------------------------------
m = sr.Recognizer()
with sr.AudioFile('sample.wav') as source:
    audio_m = m.record(source)
# --------------------------------

[SPEAKER]

import speech_recognition as sr
from gtts import gTTS
import pygame
import time
import os


# 음성 인식 (듣기, STT)

def listen(recognizer, audio):
    try:
        #
        text = recognizer.recognize_google(audio, language='ko')
        print('[나] ' + text)
        # 답변
        answer(text)
    except sr.UnknownValueError:
        print("인식 실패")
    except sr.RequestError as e:
        print(f"요청실패 : {e}")

# 대답


def answer(input_text):
    answer_text = ''
    if '안녕' in input_text:
        answer_text = '반갑습니다. 이준호님!'

    elif '날씨' in input_text:
        answer_text = '오늘은 당신의 마음 만큼 따뜻하겠군요'

    elif '환율' in input_text:
        answer_text = '오늘의 원 달러는 1,380원 입니다.'

    elif '고마워' in input_text:
        answer_text = '저도 당신에게 항상 감사합니다.'

    elif '종료' in input_text:
        answer_text = '아쉽지만 다음에 또 만나요 !'

        stop_listening(wait_for_stop=False)
    else:
        answer_text = '다시 말씀 해주시겠어요 ?'

    speak(answer_text)


# 소리내어 읽기 (TTS)
def speak(text):
    print('[인공지능] : ' + text)
    file_name = 'voice.mp3'
    tts = gTTS(text=text, lang='ko')
    tts.save(file_name)

    pygame.mixer.init()
    pygame.mixer.music.load(file_name)
    pygame.mixer.music.play()

    while pygame.mixer.music.get_busy():
        pygame.time.Clock().tick(10)
      # 녹음 파일 삭제
    if os.path.exists(file_name):
        os.remove(file_name)


r = sr.Recognizer()
m = sr.Microphone()

speak("무엇을 도와드릴까요?")

# 백그라운드에서 듣고 있음

stop_listening = r.listen_in_background(m, listen)


# 더이상 듣기 싫을 때
# stop_listening(wait_for_stop=False)
while True:
    time.sleep(1)

위에 코드들을 잘 적용하면 

이렇게 간단한 speaker를 만들 수 있다. 

근데 ai 기술은 google API 정도라는 점이 아쉽다 .

나도 코딩 너무 유투브 용으로 영상 만들었네 

이건 AI는 아닌데..... 좀 어그로 심하네 

이 코드들을 활용해서 발전 시킬 수는 있겠다 . TTS STT 정도 잘 학습했다. 

반응형