Vi.NO 프로젝트는 유튜브 영상의 스크립트를 기반으로 영상 요약과 스크립트를 제공하는 서비스이기에 유튜브 영상의 스크립트를 추출하는 과정이 필요했다.
npm 모듈을 통해 스크립트를 추출하려고 했으나 정확도가 매우 떨어지는 것을 인지하고 정확도를 높이기 위해 고군분투하던 중 naver cloud에서 제공하는 clova speech를 알게 되어 성공적인 스크립트 추출 결과를 얻을 수 있었다.
그러므로 이번 포스트에서는 우리가 스크립트를 추출하기 위해 노력한 과정을 아래의 순서에 따라 설명해보도록 하겠다.
1. npm youtube 스크립트 모듈
=> npm 모듈 사용 시에 발생한 정확도 문제
2. 음성 인식 api 비교
=> 여러 음성 인식 api를 각 판단 기준에 따라 수치로 분류된 표를 참고하여 우리 서비스에 적합한 api를 찾는 과정
3. naver clova speech
=> clova speech의 기능과 장점에 대해 설명
4. 스크립트 비교
=> npm 모듈, clova speech로 추출한 스크립트를 비교하여 clova speech의 정확도 판단

유튜브 영상의 스크립트와 문장 마다의 타임 스탬프가 필요했고 node.js 를 활용해서 백엔드 개발을 진행하고 있었기에 먼저 Npm 에서 제공하는 유튜브 스크립트 추출 모듈을 사용하고자 했다.
유튜브 영상 더보기에서 볼 수 있는 스크립트를 가져오는 모듈로 처음엔, 매우 간단하게 진행되는 듯 했다.
import { getSubtitles, getVideoDetails } from 'youtube-caption-extractor';
// Fetching Subtitles
const fetchSubtitles = async (videoID, lang = 'en') => {
try {
const subtitles = await getSubtitles({ videoID, lang });
console.log(subtitles);
} catch (error) {
console.error('Error fetching subtitles:', error);
}
};
// Fetching Video Details
const fetchVideoDetails = async (videoID, lang = 'en') => {
try {
const videoDetails = await getVideoDetails({ videoID, lang });
console.log(videoDetails);
} catch (error) {
console.error('Error fetching video details:', error);
}
};
const videoID = 'video_id_here';
const lang = 'en'; // Optional, default is 'en' (English)
fetchSubtitles(videoID, lang);
fetchVideoDetails(videoID, lang);
서비스 목표에 따라 스크립트의 정확도가 중요했기 때문에 정확도에 신경을 쓰지 않을 수가 없었다. 영어로 이루어진 영상은 나름 높은 정확도를 보였으나 한국어 영상의 경우에는 우리가 원하는 정도의 정확도가 나오지 않았다.

ㄴ 위 이미지는 실제 스크립트 추출 결과다.. 참담..
글 마지막에 스크립트 비교를 통해 정확도 차이를 보여주도록 하겠다.
따라서 더 좋은 스크립트 추출을 위해.. 음성 인식 api를 비교해보기로 했다.
유튜브 영상의 mp3를 추출한 후 음성인식 api를 통해 스크립트를 추출하는 방식으로 정했다.
우리에게 필요한 요소는 다음과 같았다.
- 정확한 스크립트 추출
- 문장에 해당하는 타임 스탬프 추출
비교하고자 하는 google speech-to-text와 naver cloud 의 Clova speech 모두 타임 스탬프 기능은 지원하고 있었기에 스크립트의 정확도가 가장 중요한 선택 기준이 되었다.

이 두가지 api 중에 고민하고 있었는데 위의 자료를 참고하여 결정할 수 있었다.
CER(%)의 수치가 낮을 수록 인식률이 좋다고 보면 된다.
WER(Word Error Rate)과 CER(Character Error Rate)로 계산할 수 있는데 한국어의 언어 구조 특성 상 CER로 오류를 측정하는 것이 더 정확한 평가 방법으로 간주된다고 한다.
따라서 한국어 음성 인식률에서 clova speech의 오인식률이 더 낮게 측정됨에 따라 우리는 한국어 영상의 정확도가 높은것이 우선이기 때문에 clova speech api를 사용하기로 결정했다.
그렇게 최종적으로 naver cloud의 clova speech를 사용하기로 결정했다.
우리가 사용할 clova speech의 기능과 장점을 적어보고 추출된 스크립트의 비교를 통해 clova speech의 정확도를 알아봤다.
- 문장 자동 분리 및 타임스탬프 지원
- 키워드 부스팅 및 인식 후 보정
- 인식 결과 수정 에디터 제공
- 실시간 음성 인식
- API 기반 인식 제공
문장 자동 분리 기능을 통해 우리 프로젝트의 기능인 영상 요약을 chat gpt에게 요청할 때 더욱 효과적일 수 있겠다고 판단했으며, 타임스탬프의 경우 테스트 결과, 시간에 맞게 잘 끊어주는 것을 확인할 수 있었다.
이를 활용하여 Vino의 기능을 더욱 효과적으로 구현할 수 있을 것이라고 판단했다.

또한 clova speech는 object storage 저장공간을 별도로 사용하기 때문에 유튜브 영상의 mp3를 저장할 수도 있고 추출된 스크립트도 저장할 수 있었다. 다른 데이터들이 담긴 메인 DB와 별도로 관리하여 스크립트만 따로 관리할 수 있다는 점도 장점으로 다가왔다.
추출에 사용한 영상 보러가기
1강. Sales vs Marketing vs Branding - 현대카드 CEO 정태영 [OVER THE RECORD]
[YouTube Caption Extractor(npm 모듈 활용) ]
제 아이 씨 상처준 어때요 지금 몇 번 나왔어요 3분 대라 우리가 몇 번을 채워야 되는거예요 어 왜 가보자 [음악] 아 아 아 아 아 아 와 카메라 했으니까 나왔었네요 여러분 안녕하세요 현대카드 대표이사 맞붙는 상태입니다 저 사실 이런 동영산 굉장히 무서워 하고 불편해 하는 데 브랜딩에 권에서 꼭 한번 남기고 싶었던 얘기도 있고 길지 않게 한번 에센스를 정리하고 하는 것도 의미가 있겠다 싶고 오더 에코 엿 아름다운 섭외 하다 보니까 제가 안에서는 면목이 없어서 제가 나섰습니다 감사합니다 감사합니다 사정이고 에 일단 제 앞에 보시면 그 3 1스 그 마케팅 브랜딩 이라는 세 개의 단어가 있습니다
[clova speech 활용]
제 아이 시선 처리는 어때요? 지금 몇 분 나왔어요? 한 3분 되나 우리가 몇 분을 채워야 되는 거예요? 오케이 가보자 와 카메라 앞에 서니까 낯서네요. 여러분 안녕하세요 현대카드 대표이사 맡고 있는 정태욱입니다. 저 사실 이런 동영상 굉장히 무서워하고 불편해하는데 브랜딩에 관해서 꼭 한 번 남기고 싶었던 이야기도 있고 길지 않게 한번 에센스를 정리하고 가는 것도 의미가 있겠 오버더레코에 다른 분을 섭외하다 보니까 제가 안에서는 면목이 없어서 제가 나섰습니다. 감사합니다. 감사합니다. 사족이구나. 일단 제 앞에 보시면 그 세일즈 마케팅 브랜딩이라는 세 개의 단어가 있습니다.
clova speech api 를 활용해서 추출한 스크립트는 매우 높은 정확도를 보여주었고, 문장부호까지 clova speech에서 자동으로 인식하여 스크립트를 추출하는 것을 보고 감탄했다. 문장 마다의 타임스탬프 역시 정확도가 높아 우리 프로젝트에 사용하기 적합하다고 판단했다.
clova speech의 구체적인 사용 예시와 관련 내용은 다음 포스트에 진행될 예정이다!