본문 바로가기

아마추어 chatgpt 활용기

음성인식 문제 해결 시도 1 -알파벳 한 개만 인식하기

반응형

음성인식 시 알파벳하나를 이야기하면 단어로 인식하는 경우가 있어 인식된 오디오를 인식 결과 문자열을 공백 기준으로 분리한 후 첫 번째 단어를 내가 지정하고자 하는 변수(ex:first_word)에 저장한다. 이후 내가 지정한 변수에서 첫 번째 알파벳만 추출하여 또 다른

변수(ex:first_letter)에 저장한다. 즉 단어로 인식 시 첫 번째 알파벳만 가져오게 한다.

 

ex)

result = r.recognize_google(audio)

first_word = result.split()[0]

first_letter = first_word[0]

 

하지만 내가 P라는 알파벳을 음성인식 시도 시

result2:

{ 'alternative': [ {'confidence': 0.72999614, 'transcript': 'key'},

{'transcript': 'Chi'},

{'transcript': 'Ki'},

{'transcript': 'Kiki'},

{'transcript': 'p'}],

'final': True}

터미널에 위와 같은 결과가 출력된다. 위의 결과를 설명하자면 Google Speech Recognition API가 인식한 결과 중에서 가장 정확도(confidence)가 높은 대안(alternative)을 보여준다.

 

여기서는 다섯 개의 대안이 제시되었으며, 그중 첫 번째 대안은 confidence 값이 0.72999614로 가장 높다. 이 대안의 transcript 필드에는 "key"라는 문자열이 포함되어 있으므로, API"key"라는 단어를 인식하였다고 볼 수 있다.

 

다른 대안들도 보면, 두 번째 대안은 "Chi"라는 문자열을, 세 번째 대안은 "Ki"라는 문자열을, 네 번째 대안은 "Kiki"라는 문자열을, 다섯 번째 대안은 "p"라는 문자열을 각각 인식한 것으로 나타난다.

 

하지만, 최종 결과(final)True로 표시되었으므로, 가장 높은 confidence 값을 가진 첫 번째 대안인 "key"가 최종 결과로 선택되었다고 볼 수 있다.

 

위 내용은 Chat GPT에게 물어본 내용이다. 나의 발음이 안 좋은 거일 수도 있어 이번에는 A라는 알파벳을 음성인식을 시도하여 보았다..

그 결과

result2:

{ 'alternative': [ {'confidence': 0.64546603, 'transcript': 'hey'},

{'transcript': 'a'}],

'final': True}

이번에는 “hey”라는 문자열을 가장 높은 값으로 매겨 인식하게 했다. 그런데 A도 인식에 같이 들어가 있다. 위에서 P도 결과값은 낮았지만 인식결과에는 들어갔다.

여기서 내가 좀 더 생각해 보니 결과값 중에 한 개 알파벳만 인식한 걸 가져오게 된다면 어느 정도 알파벳 음성인식률이 올라가게 된다. 그리고 단어로 인식하여 행맨게임에서 오류발생도 일어나지 않을 거라고 짐작이 된다.

 

그래서 Chat GPT에게 다음과 같이 질문하였다

내가 a라고 했는데 aa, 에이, 헤이로 인식하게 되는데 알파벳 한 개 a로만a 인식하도록 제한하는 방법은 없을까?

 

답변

speech_recognition 모듈에서 인식된 텍스트를 처리하여 특정 패턴과 일치하는 문자열만 추출하도록 제한하는 방법이 있습니다. 이를 위해서는 정규표현식을 사용할 수 있습니다.

예를 들어, 인식 결과에서 알파벳 한 개만 추출하도록 정규표현식을 사용하여 코드를 작성할 수 있습니다. 다음은 인식 결과에서 첫 번째 알파벳을 추출하되, 알파벳이 아닌 문자는 무시하도록 정규표현식을 사용한 예시입니다.

result = r.recognize_google(audio)

first_letter = re.findall(r"[a-zA-Z]", result)[0]

print(first_letter)

위 코드에서 re.findall() 함수를 사용하여 인식 결과 문자열에서 알파벳 대소문자만 추출한 후, 첫 번째 알파벳을 선택하여 first_letter 변수에 저장합니다. 이후 first_letter 변수를 출력하면 "a"와 같은 결과가 출력됩니다.

 

이 코드를 적용해 봤지만 heyhey결과값도 나오고, 뒤로 갈수록 단어들만 인식되는 현상을 보였다.

 

다시 first_letter = re.findall(r"[a-z]{1}", result)[0] 함수를 수정한 뒤

코드를 실행시켜 봤는데 이제는 confidence 값이 낮아도 알파벳 한 개만 결과값을 출력했다.

그런데 바로 다음단계에서 문제가 발생했다.

음성인식을 한 번만 하고 두 번째에서는 음성인식 자체가 되지 않았다.

 

결과 출력화면 

 

P는 알파벳 한 개로 인식되어 GUI화면에 나타났지만 더 이상 음성인식을 실행하지 않은 문제가 발생했다.

그리고 알파벳이 맞는지 틀렸는지에 대한 결과도 GUI상에 제대로 나타내지 않았다.

답을 좀 더 찾아봐야 할 것 같다.