본문 바로가기

번역글

[번역] 파이썬으로 음성인식 봇 만들기

 이제 뭔가를 알게 되셨을겁니다.

 아마존 알렉사같은 음성인식 제품의 엄청난 성공은 가까운 미래에 음성 기능의 지원이 가정에 필수적인 기술이 될 가능성을 보여줬습니다. 달리 말하면, 음성 기능을 지원하는 제품은 다른 기술들이 제공할 수 없는 상호작용과 쉬운 사용성을 제공하여 게임 체인져가 될 것입니다.

  GUI가 필요 없습니다.

 문자가 필요 없습니다.

이모지가 필요 없습니다.

 속도가 전부입니다.

 속도는 음성이 차세대 사용자 인터페이스가 될 주된 요인입니다. 10년마다 상호작용 기술이 새롭게 나왔습니다. 문자 모드에서 그래픽 사용자 인터페이스, 웹 그리고 모바일까지 발전해 왔습니다.

 음성은 이제 모바일 앱보다 보다 빠르고 쉬운 방식으로 커뮤니케이션하고 일을 처리할 수 있는 방법을 제공합니다.

 우리는 우리가 필요한 것 (등을 끄고, 온도를 맞추고, 알람을 세팅합니다 - "알렉사, 잘 자"라는 말 한마디로 이런 일을 모두 처리합니다)을 알렉사에 말하거나 스마트폰을 들어 켜고 앱을 열어서 업무를 처리할 수 있습니다.

 시간이 지나면 고객을 계속 돌아오게 하는 일과 같은 반복되는 일을 고려한다면 음성을 통해 얻는 효율은 시간이 지날수록 커집니다.

"문자는 알렉사때문에 미래에는 쇠퇴할 것입니다" - Gary Vaynerchuk

 

 그래서 파이썬으로 간단한 음성인식을 만드는 새로운 프로젝트를 시작하는 것은 매우 흥미롭습니다. 물론 제대로 된 방법으로 대용량 훈련 데이터와 컴퓨터 시스템을 가지고 바닥부터 새로 만드는 일을 하지는 않았습니다.

 대신 파이썬으로 음성을 텍스트로 변환해 주는 구글의 음성 인식 API를 사용했습니다. (음성 인식이 어떻게 동작하는지 보여주는 데모를 확인해 보십시오)

 이 글을 읽고나면 음성인식이 일반적으로 동작하는 방식과 더 중요하게 파이썬으로 구글 음성 인식 API를 사용하여 구현하는 방법을 좀 더 잘 이해하게 될 것입니다. 저를 믿어보십시오. 간단합니다. 관심이 있다면 여기서 소스 코드를 확인해 보십시오. 시작하겠습니다.


 왜 구글 음성인식 API를 사용하는가?

 "음성인식의 증가하는 수요와 인기를 고려할 때 구글 음성인식 API가 유일한가?"라고 궁금해 하실 수 있습니다. 물론 아래와 같이 무료나 유료로 사용할 수 있는 다른 API들도 있습니다.

 SpeechRecognition 라이브러리는 내부에 구글 Web Speech API의 API 키 값이 기본으로 하드 코딩되어 들어있어 구글을 선택했습니다. API 키 값이나 아이디/비밀번호를 가지고 인증을 할 필요가 없이 바로 사용할 수 있습니다. 그러나 구글 Web Speech API가 편리하지만 제한이 있습니다: 하루에 API를 50회 호출할 수 있으며 이 횟수를 늘릴 방법은 현재 없습니다.

 구글 음성인식 API를 사용하여 파이썬으로 음성인식 만들기 

[소스: https://unsplash.com/photos/npxXWgQ33ZQ]

 음성인식의 동작 원리에 대한 자세한 기술적인 이야기를 알기 원하시는 분들은 일반적인 메카니즘과 API 구현방식을 다룬 이 글을 읽으십시오. 아래의 글에서 이 API를 구현하는 방법을 하나씩 설명하겠습니다. 

 먼저 SpeechRecognition 라이브러리를 'pip install SpeechRecognition'으로 설치하십시오. 그러면 이 라이브러리에서 제공하는 구글 Web Speech API를 사용할 수 있습니다.

 이 구현에서 저의 목소리를 마이크로 녹음한 후 저의 목소리를 인식하였습니다. 마이크에 접근하기 위해서는 PyAudio 패키지를 설치하시고 SpeechRecognizer를 사용하시면 됩니다. 아래의 코드를 보시면 설명이 필요없이 전체 구현을 이해하실 수 있습니다.

def recognize_speech_from_mic(recognizer, microphone):
    """Transcribe speech from recorded from `microphone`.
    Returns a dictionary with three keys:
    "success": a boolean indicating whether or not the API request was
               successful
    "error":   `None` if no error occured, otherwise a string containing
               an error message if the API could not be reached or
               speech was unrecognizable
    "transcription": `None` if speech could not be transcribed,
               otherwise a string containing the transcribed text
    """
    # check that recognizer and microphone arguments are appropriate type
    if not isinstance(recognizer, sr.Recognizer):
        raise TypeError("`recognizer` must be `Recognizer` instance")

    if not isinstance(microphone, sr.Microphone):
        raise TypeError("`microphone` must be `Microphone` instance")

    # adjust the recognizer sensitivity to ambient noise and record audio
    # from the microphone
    with microphone as source:
        recognizer.adjust_for_ambient_noise(source) # #  analyze the audio source for 1 second
        audio = recognizer.listen(source)

    # set up the response object
    response = {
        "success": True,
        "error": None,
        "transcription": None
    }

    # try recognizing the speech in the recording
    # if a RequestError or UnknownValueError exception is caught,
    #   update the response object accordingly
    try:
        response["transcription"] = recognizer.recognize_google(audio)
    except sr.RequestError:
        # API was unreachable or unresponsive
        response["success"] = False
        response["error"] = "API unavailable/unresponsive"
    except sr.UnknownValueError:
        # speech was unintelligible
        response["error"] = "Unable to recognize speech"

    return response

[view raw]

 주변 소음을 처리하기 위해 Recognizer 클래스의 adjust_for_ambient_noise() 메쏘드를 사용해서 음성인식을 하십시오. adjust_for_ambient_noise() 메쏘드를 실행한 후 주변 소음과 정확한 음성을 인식하기 위해 오디오 입력을 분석하도록 잠시 기다려 주십시오.

 마지막으로 요청을 보낸 후 API에서 응답이 없거나 우리의 음성이 인식되지 않는 오류 상황을 제어하기 위해 'try and except'를 구현해야 합니다. 위에 있는 코드를 사용하시고 아래와 같은 코드를 추가해 주시면 제대로 실행됩니다!

if __name__ == "__main__":
    recognizer = sr.Recognizer()
    mic = sr.Microphone(device_index=1)
    response = recognize_speech_from_mic(recognizer, mic)
    print('\nSuccess : {}\nError   : {}\n\nText from Speech\n{}\n\n{}' \
          .format(response['success'],
                  response['error'],
                  '-'*17,
                  response['transcription']))

[view raw]

구글 음성인식 API를 사용한 간단한 데모

이제 전체 코드를 만들었으니 어떻게 동작하는지 볼 시간입니다. 녹음된 제 음성에서 API가 텍스 형태로 반환하는 모습을 짧은 동영상으로 만들었습니다. 이 동영상이 기대한 것만큼 정확하지 않은 것처럼 보일 수 있지만 API를 가지고 간단히 만들어 볼 만합니다.


 아직까지 비즈니스와 우리의 일상에 음성을 지원하는 제품들이 널리 사용되고 있지는 않지만 이 기술이 많은 비즈니스를 바꾸고 소비자들도 조만간 음성인식 기능을 가진 제품들을 사용하게 되리라 믿습니다.

[원문] https://towardsdatascience.com/how-to-build-a-speech-recognition-bot-with-python-81d0fe3cea9a

 

How To Build A Speech Recognition Bot With Python

Even if you know nothing about speech recognition

towardsdatascience.com