728x90
현재 진행중인 프로젝트가 음성인식을 사용하는 프로젝트이다.
음성인식 로직은 다음과 같다.
녹음 -> Naver Clova API를 사용해 음성을 텍스트로 변환 (네이버가 정확도가 가장 높아서 선정하였다.) -> DialogFlow로 대답을 받아온다 -> 이것을 다시 Clova를 사용해 텍스트를 음성으로 변환
이런 로직으로 진행하고 있는데, 일단 녹음을 받기 위해서 음성인식을 받아와야한다.
유니티에서는 UnityEngine안에서 Microphone 클래스를 제공한다.
하위의 멤버함수인 Start함수는 (마이크 이름, 반복(Loop), 녹음최대시간, 프리퀀시) 와 같은 형태로 구현되어있다.
마이크는 모바일에 탑재된 마이크를 기준으로 작성하였고, 마이크의 이름을 전달하여 녹음한 후, AudioSource를 추가해 생성된Clip을 재생시켜주었다.
버튼에 들어가는 코드는 다음과 같다.
public void OnStartBtn(){ //녹음 시작 버튼
if(MicrophoneScript.Instance.selectedMic == null){
MicrophoneScript.Instance.logText.text = "Mic is not found!";
}
else{
MicrophoneScript.Instance.logText.text = "Recording Start!";
MicrophoneScript.Instance.clip = Microphone.Start(MicrophoneScript.Instance.selectedMic,false,15,22050); //녹음시작
}
}
public void OnStopBtn(){ //녹음 종료 버튼
MicrophoneScript.Instance.logText.text = "Recording Stop!";
Microphone.End(MicrophoneScript.Instance.selectedMic); //녹음 종료
MicrophoneScript.Instance.mainAudio.clip = MicrophoneScript.Instance.clip; //메인 오디오에 클립 저장
MicrophoneScript.Instance.mainAudio.Play(); //오디오 소스 재생
}
그리고, 녹음기능 전체를 관리해줄 스크립트도 작성하였다.
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;
public class MicrophoneScript : MonoBehaviour
{
#region Private Var
[SerializeField] GameObject micBtn;
[SerializeField] Transform micParents;
[SerializeField] Text micListText;
#endregion
#region Public var
public Text logText;
public Text selectMicText;
public string selectedMic = null;
public AudioClip clip;
public AudioSource mainAudio;
#endregion
#region Singleton
private static MicrophoneScript _instance;
public static MicrophoneScript Instance{
get{
if(_instance == null) _instance = FindObjectOfType(typeof(MicrophoneScript)) as MicrophoneScript;
return _instance;
}
}
#endregion
private void Start() {
for(int i=0;i<Microphone.devices.Length;i++){ //마이크 리스트 받아와서 띄워줌.
GameObject micObj = Instantiate(micBtn, micParents);
micObj.GetComponent<MicListBtn>().SetMicText(Microphone.devices[i]);
}
for(int i =0; i<Microphone.devices.Length;i++){
micListText.text += Microphone.devices[i] + "\n";
}
}
}
위 코드는 참고만 하면 된다.
그리고 버튼을 스크롤뷰에 보여주기 위해 버튼자체를 프리펩화 해서 버튼을 누를때마다 마이크를 선택할 수 있도록 만들었다.
Microphone.devices 는 연결되어있는 마이크 리스트를 string형태로 반환한다. 이를 활용해 0번째 마이크를 사용해 녹음을 진행했다.
추후에 Clova를 사용하는것이 익숙해지면 한번 정리하려고 한다.
728x90
'Develop > Unity' 카테고리의 다른 글
[Unity] 캐스팅이 뭘까? - 유니티에서 활용하는 키워드 'as' (0) | 2024.06.19 |
---|---|
[Unity] 파이 그래프(원 그래프)를 만들어보자! (0) | 2024.06.13 |
[Unity] '객체 지향 프로그래밍'이란 무엇인가 1(object-oriented programming)(OOP) (3) | 2024.05.07 |
[Unity] 리스트의 정렬 검색 - 하이 우동 호텔! (2) | 2024.03.20 |
[Unity] 멀티 플레이를 위해 포톤을 연동하자!(Photon) - 1. 서버 연결 (0) | 2023.12.11 |