안녕하세요 TriplexLab 입니다. 오늘의 예제는 음성 검색에 관해서 살펴 보도록 하겠습니다. 웹에서 음성 인식 추출 API( Web Speech API ) 사용합니다. 기본으로 제공해주고 있어 별도의 작업 없이 사용할 수 있습니다만, 아쉽게도 PC에서 현재는 Chrome, Edge, Safari에서만 제공되고 모바일에서는 안드로이드, 사파리, 등등 제공되고 있네요.
recognition.onresult = function(e) { //result이벤트는 음성 인식 서비스가 결과를 반환할 때 시작됩니다.
console.log(e)
};
객체 transcript라는 곳에 텍스트가 들어간 모습을 확인 할수 있습니다.
다음에는 store라는 객체에 texts라는곳에 담아 두어 콘솔에 찍어 봤습니다. 실시간으로 인식한 데이터 최종 값이 계속해서 갱신됩니다. 여러 문장이 인식된 경우, 인덱스를 달리하여 각 results 객체 안에 정보를 담아 리턴됩니다.
recognition.onresult = function(e) { //result이벤트는 음성 인식 서비스가 결과를 반환할 때 시작됩니다.
store.texts = Array.from(e.results)
.map(results => results[0].transcript).join("");
console.log(store.texts)
};
👉전체 소스코드(JS)
const $ = (el) => document.querySelector(el);
const store = {
texts : '',
isRecognizing: true
};
(() => {
/* Speech API start */
let SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
if(!("webkitSpeechRecognition" in window)){
alert("지원 안되는 브라우저 입니다. !")
} else {
const recognition = new SpeechRecognition();
recognition.interimResults = true; // true면 음절을 연속적으로 인식하나 false면 한 음절만 기록함
recognition.lang = 'ko-KR'; // 값이 없으면 HTML의 <html lang="en">을 참고합니다. ko-KR, en-US
recognition.continuous = false; //각 인식에 대해 연속 결과가 반환되는지 아니면 단일 결과만 반환되는지를 제어합니다. 기본값은 단일( false.)
recognition.maxAlternatives = 20000; // maxAlternatives가 숫자가 작을수록 발음대로 적고, 크면 문장의 적합도에 따라 알맞은 단어로 대체합니다.
recognition.onspeechend = function() { // 음성 감지가 끝날때 실행될 이벤트
recognition.stop();
$('.dictate').classList.remove("on");
store.isRecognizing = true;
};
recognition.onresult = function(e) { //result이벤트는 음성 인식 서비스가 결과를 반환할 때 시작됩니다.
store.texts = Array.from(e.results)
.map(results => results[0].transcript).join("");
console.log(store.texts)
$('input').value = store.texts;
};
/* // Speech API END */
const active = () => {
$('.dictate').classList.add('on')
recognition.start();
store.isRecognizing = false;
};
const unactive = () => {
$('.dictate').classList.remove('on')
recognition.stop();
store.isRecognizing = true;
};
$('.dictate').addEventListener('click', () => {
if(store.isRecognizing){
active();
} else {
unactive();
}
});
}
})();