음성을 인식해 문자로 변환하는 예제 (MS Azure Speech)

흔히, 클라우드라고 하면 온라인에 사진이나, 문서 등 파일을 저장하는 공간으로 인식하는 경우가 많습니다.

물론 이런 단순 파일저장도 클라우드 컴퓨팅 서비스의 일부이긴 하지만, MS, 아마존, IBM, 구글 등의 기업들은 좀 더 다양한 기술을 클라우드에서 제공해 주고 있습니다.

예를 들면, MS는 Azure(애져)라는 이름의 클라우드 컴퓨팅 플랫폼에 음성인식, 얼굴인식, 가상머신, 머신러닝 등의 플랫폼을 제공해주고 있습니다.

요즘 많이 사용되는 클라우드 컴퓨팅 플랫폼 서비스는 Google Cloud Platform, MS Azure, Amazon Web Service Cloud  등 3개의 서비스가 대표적입니다.

아래는 MS Azure 에서 사용가능한 서비스들 입니다. 무료, 유료 서비스가 존재합니다.








이 중 MS의 Azure 의 Cognitive(인지) Service 를 이용해 음성을 문자로 바꾸어주는 코드를 MS 예제를 참조해 C++ 로 직접 만들어 보았습니다.

먼저 결과를 보면, 신기하게도 노트북의 마이크에 제가 직접 음성으로 말한 "Hello, This is ocean coding school"을 문자로 변환해 줍니다.

물론 이런 소프트웨어는 많지만, 사용이 아닌 개발 관점의 포스팅입니다.

영어 발음이 썩 훌륭하진 않지만, 잘 인식하니 기특합니다. ㅎㅎ

재미있네요. 이미 Artificial Intelligence 와 로봇으로 대표되는 4차 산업 혁명이 착착 진행되고 있음을 체감하였습니다.

아래 코드는 프로그램 실행 화면의 결과이며, 처음 실행시 Say something 이라는 문구를 출력합니다.

이때 마이크에 영어로 이야기 하면 그 내용이 잠시 후 화면에 글씨로 옮겨집니다.



사용자가 말한 음성을 서버로 전송한 후, 이를 문자로 변환해 돌려주는 방식입니다.

근데 여기까지 오는 과정이 만만치 않았습니다.

머신러닝 플랫폼 중 음성인식 기술을 코드에 이용하기 위해서 Subscription Key (구독키) 가 프로그래밍 코드에 필요한데, 이를 위해 Azure 가입이 필요합니다.

Azure는 창공의 색이라는 뜻으로 MS의 클라우드 서비스를 말합니다.

순서대로 그 과정을 정리해 보겠습니다.

1. MS Azure 가입

MS 계정이 하나 필요하며, 이어지는 Azure 가입 절차에서 핸드폰 인증, 신용카드 인증이 모두 필요합니다.

Azure는 유료, 무료 서비스로 구분되어 있기 때문에 비용처리 관련 사항 때문으로 판단됩니다.

유료 서비스도 처음 약 200$ 상당의 크레딧을 제공해 주므로, 개인 사용자이고 Azure 클라우딩 기술을 체험해 보고 싶다면 돈 걱정을 할 필요는 없습니다. 그리고 무료서비스도 상당히 많습니다.




체험 계정 만들기를 통해 Azure 가입 절차가 시작되며, MS 계정이 필요합니다.



사용자 정보를 입력하는데, 전화 또는 문자 인증이 필요합니다.


저는 전화가 아닌 문자인증 방식으로 진행하였습니다.


그 다음은 신용카드 정보 등록인데 Azure 가입시 필수입니다.

다시 말씀드리지만, 바로 결재되는 것이 아니니, 맘 편하게 등록하면 됩니다.

신용카드 정보 등록을 마치면 가입이 완료됩니다.



2. MS Azure 에 클라우딩 서비스 리소스 만들기

가입이 완료되면 Azure 포탈로 이동하면 , 다음과 같은 다양한 서비스를 이용할 수 있습니다.



우선 제게 필요한 "Cognitive Service" 중 Speech-Text 기술을 찾아 봅니다. 




음, 바로 검색이 되지 않아 "Cognitive Service 만들기 "를 눌러 들어갑니다.




서비스 종류가 다양한데, 더 보기를 눌러 Machine Learning 분야의 음성 서비스를 찾았습니다.



선택하면 아래의 만들기 창이 보입니다. 얼른 만들어 해보고 싶은 마음입니다.



등록 시 가격 책정은 F로 시작하는 정책이 무료이네요. 실수로 유료로 했더라도 언제든 해당 서비스의 삭제가 가능합니다.

리소스 그룹은 해당 서비스의 이름입니다. 아무거나 입력해도 상관없습니다.




드디어 Azure 포탈에 머신러닝-음성 서비스가 등록이 되었습니다.



이렇게 힘들게 Azure 가입과 서비스 등록을 진행한 이유는 이제 해당 서비스에 대한 subscription key(구독키) 를 받을 수 있기 때문입니다.

해당 리소스를 Azure 포탈에서 선택하면 짜잔, 이제 키가 뜹니다. 바로 이 키를 앞으로 우리가 만들 코드에 등록해야지만 음성-문자 변환 코드가 정상적으로 동작합니다.





3. 음성-문자 변환 프로그래밍

이제 Azure 가입 절차는 완료되었고, Visual Studio를 이용해 코드를 작성해 볼 차례입니다.

먼저 Visual Studio 2017에 개별 구성 요소 중 "NuGet 패키지 관리자" 가 설치되어 있어야 합니다. 

NuGet은 MS 닷넷 프레임워크의 오픈소스 패키지 관리자입니다.




이제 C++ 콘솔 프로젝트를 하나 생성합니다.

솔루션 탐색기의 해당 프로젝트를 마우스 우클릭->NuGet 패키지 관리->찾아보기에서 Speech로 검색하면 Microsoft.CognitiveService.Speech 를 선택해 설치합니다.



그리고 왠지는 모르지만 해당 Speech 관련 MS 예제에서는 64bit (x64)로 컴파일 하라고 하네요. 



드디어 코드를 입력할 차례입니다.

##include "pch.h"
#include <iostream>
#include <speechapi_cxx .h>
 
using namespace std;
using namespace Microsoft::CognitiveServices::Speech;
 
void recognizeSpeech()
{
 // Creates an instance of a speech config with specified subscription key and service region.
 // Replace with your own subscription key and service region (e.g., "westus"). 
  
 auto config = SpeechConfig::FromSubscription("subscription key", "eastasia");
 
 // Creates a speech recognizer.
 auto recognizer = SpeechRecognizer::FromConfig(config);
 cout << "Say something...\n";
 
 // Performs recognition. RecognizeOnceAsync() returns when the first utterance has been recognized,
 // so it is suitable only for single shot recognition like command or query. For long-running
 // recognition, use StartContinuousRecognitionAsync() instead.
 auto result = recognizer->RecognizeOnceAsync().get(); 
 
 // Checks result.
 if (result->Reason == ResultReason::RecognizedSpeech)
 {
  cout << "We recognized: " << result->Text << std::endl;
 }
 else if (result->Reason == ResultReason::NoMatch)
 {
  cout << "NOMATCH: Speech could not be recognized." << std::endl;
 }
 else if (result->Reason == ResultReason::Canceled)
 {
  auto cancellation = CancellationDetails::FromResult(result);
  cout << "CANCELED: Reason=" << (int)cancellation->Reason << std::endl;
 
  if (cancellation->Reason == CancellationReason::Error)
  {
   cout << "CANCELED: ErrorCode= " << (int)cancellation->ErrorCode << std::endl;
   cout << "CANCELED: ErrorDetails=" << cancellation->ErrorDetails << std::endl;
   cout << "CANCELED: Did you update the subscription info?" << std::endl;
  }
 }
}
 
int main()
{
 recognizeSpeech();
 cout << "Please press a key to continue.\n";
 cin.get();
}


위 코드 13라인에서 Subscription key에 Azure에서 얻은 구독 키를 문자열로 입력하고, 다음은 Azure Region 서버인데 저는 Azure 서비스에 등록된 Region인 eastasia로 진행하였습니다.

역시 M$답게 많은 전 세계 방방곡곡에 Azure 서버를 설치하였군요.



1번 라인의 #include "pch.h"문장은 VS 2017에서 이전 버전의 #include "stdafx.h"가 대체된 precompiled header 파일 입니다.

나머지 코드는 수정 할 필요가 없습니다.

빌드 후 실행하면 "Say something"이라고 나오는데 이때 마이크에 대고 영어로 이야기하면 글자로 변환해 보여줍니다.

고작 50줄의 코드로 음성인식에 대한 기초적인 지식도 없이 이런 프로그래밍이 가능하다는 것이 참 흥미롭습니다.

다음에는 face 인식을 포스팅해 보도록 하겠습니다.

감사합니다.

댓글

이 블로그의 인기 게시물

Qt Designer 설치하기

C++ 예제 (소켓 서버, 이미지, 파일전송)