프로젝트를 위해 유용한 라이브러리나 도구들을 서칭하던 도중 발견한 아주 귀한 녀석이다.

이번엔 이녀석에게 빨아먹을수 있는 기능들을 최대한 단시간 내에 빨아먹어보도록 하겠다.

ESP net

ESPnet: end-to-end speech processing toolkit

end-to-end 발화 관련된 처리 모델을 같은 규격으로 모아놓은 툴킷이다.

 

이 레파지토리만 따로 리뷰를 하는 이유는 여기 하고자하는게 거의 다들어가있기 때문이다.

 

GitHub - espnet/espnet: End-to-End Speech Processing Toolkit

End-to-End Speech Processing Toolkit. Contribute to espnet/espnet development by creating an account on GitHub.

github.com

 

ESP net 에서 다루는 도구들은 다양하게 있는데 그중 사용해볼수 있을법한 도구들은 다음과 같다.

 

ASR: Automatic Speech Recognition

이전 에 했던 Speech to Text 모델들이 있다. ASR이라고도 부른다.

 

TTS: Text-to-Speech

이전 에 조사했던 Text to Speech 모델들이 있다.

SE: Speech Enhancement (and Separation)

발화 데이터를 Separate Speech를 하면 Single Speaker일 경우 denoising 해주는 모델이 있고.

Multi Speaker일 경우 발화자A, 발화자B 이런식으로 분리된 음성으로 나누어주는 모델이 있었다.

ST: Speech Translation & Machine Translation

흔히 아는 음성 번역이다.

VC: Voice Conversion

목소리를 변환한 음성을 만들어주는 모델이다.

SVS: Singing Voice Synthesis

노래하는 목소리 생성 모델이다.

Docker 실행

도커에서 성공적으로 ESPnet을 돌렸다. 튜토리얼대로 똑같이하면 아무런 문제없이 잘 돌아갔다.

튜토리얼에서는 Demo 버전을 웹을 이용해서 테스트 할수있는 여러 환경을 구성하고있다.

기존에 Docker compose를 이용해 메인 컨테이너랑 묶어 해당 모델을 사용하려고 했으나 당장의 프로토타이핑 스탭에서 Docker를 사용하지 않기로 했다.

 

여담

우선 해당 프로젝트는 1인개발 프로젝트여서 다중환경을 지원할 필요성이 크게없다. 

(하지만 나중에는 Docker에 올려야한다는 생각정도는 가지고있다.)

다만 만드는 과정에서 Docker환경에 맞춰서 개발하기 좀 고달프다. 그이유는 음성 인식 부분을 마이크 입력이 아닌 웹규격이나 소켓 데이터 스트림으로 구현해야한다는 점 때문이다. 그렇기에 이러한 부분에 대해서 고민할 부분을 조금 뒤로 미루기위해 여러 시도와 실험 끝에 잠깐 Docker 사용을 놔주기로했다.

 

Test

Espnet에서 가장 유용하다고 생각한 부분은 역시 TTS모델을 다양하게 사용할 수 있다는 점이였다.

그중 테스트해본 여러 모델들중 괜찮다는 생각이 든 모델들을 정리해보겠다.

 

Espnet model zoo를 사용하면 다음과 같이 매우 간단하게 huggingface에서 모델을 이용해서 음원을 만들수있다.

속도는 약간 아쉬운 느낌이긴 하지만 아쉬운건 CPU기준이고 GPU로 한다면 매우 높은 성능이 나올거라고 기대하고있다.

(다크한 일본 캐릭터 느낌) cc by 4.0

 

mio/amadeus · Hugging Face

ESPnet2 TTS model mio/amadeus This model was trained by mio using amadeus recipe in espnet. Demo: How to use in ESPnet2 Follow the ESPnet installation instructions if you haven't done that already. cd espnet git checkout d5b5ec7b2e77bd3e10707141818b7e6c57a

huggingface.co

 

 

(귀엽고 시니컬한 일본 캐릭터 느낌) cc by 4.0

 

mio/tokiwa_midori · Hugging Face

ESPnet2 TTS model mio/tokiwa_midori This model was trained by mio using amadeus recipe in espnet. Demo: How to use in ESPnet2 Follow the ESPnet installation instructions if you haven't done that already. cd espnet git checkout 0232f540a98ece921477b961db8ae

huggingface.co

mio 라는 유저의 TTS모델인데 우선 목소리 자체가 애니메이션 캐릭터의 목소리를 이용하여 학습한거라 깔끔하다.

일본어에서 가장 괜찮았던건 다음 2개이다.

 

(밝고 명랑한 한국어, 약간 옜날 애니메이션에 밝고 명랑한 여자 캐릭터같은 느낌 이다.) cc by 4.0

 

imdanboy/kss_jets · Hugging Face

ESPnet2 TTS model imdanboy/kss_jets This model was trained by imdanboy using kss recipe in espnet. Demo: How to use in ESPnet2 Follow the ESPnet installation instructions if you haven't done that already. cd espnet git checkout 967ddbed826a7c90b75be2a71295

huggingface.co

 

 

조금 아쉬운점은 ESP net의 레시피로 만들어진 한국어 모델이 거의 없었고 전부다 테스트 해봤지만 잘 돌아가는 것도 별로 없었다.

한국어에서는 다음의 모델이 가장 괜찮았다. 한국어의 언어 특성을 보정하기위한 문장을 발음으로 바꿔주는 g2pk를 추가설치해줘야한다.

 

(평범한 젊은 느낌은 아닌 영어, 약간 어색하다고 느꼈다. 가장 인기있는 모델.) cc by 4.0

 

espnet/kan-bayashi_ljspeech_vits · Hugging Face

ESPnet2 TTS pretrained model kan-bayashi/ljspeech_vits ♻️ Imported from https://zenodo.org/record/5443814/ This model was trained by kan-bayashi using ljspeech/tts1 recipe in espnet. Demo: How to use in ESPnet2 Citing ESPnet @inproceedings{watanabe2018

huggingface.co

 

모델 총평 :

1. 일본어 모델은 영어도 못말하고 알파벳으로 말한다. -> 일본발음으로 해결하도록 추가적으로 로직을 만들어줘도 되지만 영 빠진다.

2. CPU기준 약간 버벅거림 있다. 체감생성시간 0.8초

(나중에 langsmith 찍어보겠다. 그래도 이정도면 맥북 CPU인데 빠르다고 생각된다.)

3. 한국어 모델은 거의 없다. 골라서는 못할것 같다.

4. 라이센스는 다 CC by 4.0이다 저작권 명시만 하고 쓰면 될것같다.

5. 여기서 테스트해본 TTS말고도 다른 기능들도 테스트를 해봤는데 상당히 유용한 프로젝트인것 같다. 일단은 TTS만 사용하겠다.

해당 글은 완성 되었으나. 필자의 경험에 따라 업데이트 할수도 있습니다. (글 내용이 바뀔수 있다는 뜻)
더 편리한 구조를 찾으면 바꾸겠습니다. 피드백 부탁드립니다.

 

여러가지 실험을 위해 파이썬 프로젝트를 만들어야하는 경우가 많다보니 Boilerplate를 하나정도 만들어서 운용하는게 효율적이겠다라는 생각이 들어 만들면서 과정을 정리해보려고 한다.

github repository

 

Devcontainer 설정

devcontainer는 Docker기반의 개발환경을 VScode에 만들어주는 도구인데 최근 협업을 위해 사용했는데 매우 편리했던 기억이 있어서 이것을 설정해보려고 한다. 

 

Docker에 대해서 어느정도 알고있다는 것을 전제로 커스텀 해야할 부분만 써내려가 보겠다.

 

dev container extension

우선 VS code에서 다음의 확장 프로그램을 설치해야한다.

 

그 다음 프로젝트에 .devcontainer 설정을 추가해야하는데 나는 그냥 Docker가 아닌 Docker compose를 사용하도록 설정하려고한다.

아래 레파지토리에서는 공식적인 Devcontainer 설정 템플릿을 제공하고 있으니 다음을 기반으로 설정하면 된다.

 

vscode-dev-containers/containers/python-3 at main · microsoft/vscode-dev-containers

NOTE: Most of the contents of this repository have been migrated to the new devcontainers GitHub org (https://github.com/devcontainers). See https://github.com/devcontainers/template-starter and ht...

github.com

 

.devcontainer extension setting

.devcontainer를 만들때 docker 컨테이너가 만들어지고 내부에 설치될 vscode의 extension을 지정할 수있는데

@enabled라고 검색하면 다음과 같이 사용중인 extension이 나오는데 이를 extension id copy해서 이런식으로 쭉쭉 추가해주면 된다.

.devcontainer

.devcontainer설정은 크게 별거는 없고 어떤 compose 나 docker 파일을 실행할것인지 선택하고 

workspace path를 지정해주면 vscode 로컬소스가 workspace위치에 복사된다. 여기서 git commit과 push가 문제없이 잘 된다.

 

Github Package 관리설정

이전 글에서 env관리하는데 굉장히 편리하다고 느꼈던 pipenv를 이용해 보려고 한다.

짧은 코드지만 이렇게 만드는데 많은 시행착오가 있었다. pipenv의 버전 문제라던지,, 풀버전으로 명시를 안하면 종속성이 안붙는다던지.

DockerFile & main.py

파이썬 이미지를 설치하는 도커 파일이다. 파이썬환경에 맞게 하도록 설정했다.

또한 포트 설정까지 해서 작동을 테스트했다.

 

VScode Task Setting

Live2d SDK 까보다가 알게된 기능인데 편리해서 추가해봤다.

Control+Shift+B 로 기본설정한 Task를 자동으로 실행 가능하고

Control+Shift+P 로 사용가능한 Task를 조회, 실행 할 수 있다.

.vscode/task.json

2개 이상 Task를 넣으면 다음과 같이 Path 이동 없이 편리하게 쓸 수 있다.

프로젝트 진행시 Path가 복잡해지면 이렇게 쓰는게 좋아보인다.

Docker compose로 프로젝트가 복잡해졌을경우 아주 유용할 것으로 보인다.

Control+Shift+P > Tasks: Run Task

 

Repository

내가 사용하려고 만들었지만 모두 편리하게 사용했으면 좋겠다.

사용방법은 해당 레파지토리의 README에 작성해놓을테니 참고하면 된다.

 

GitHub - lunaB/Boilerplate-Python: Boilerplate Python

Boilerplate Python. Contribute to lunaB/Boilerplate-Python development by creating an account on GitHub.

github.com

 

해당 프로젝트에 대한 구체적인 구조에 대해서는 작성하지는 않지만,

프로젝트를 진행함에 편의를 제공하는 환경을 경험적으로 작성해보려고 한다.

 

인공지능 프로젝트를 진행함에 있어서 다양한 오픈소스를 테스트 해본다거나 라이브러리에 대한 실험을 해야했다.

그런데 여기서 파이썬 버전을 옮겨가면서 테스트 해야할 필요도 있고, 각기 다른 환경을 설치해야할 소요도 많았다.

그래서 개발환경을 이전에 뒤집어 엎었는데 그 경험이 나쁘지 않아서 공유하려고 한다.

 

 

사용경험이 매우 좋으며 다른 사람에게도 추천하고 싶은 구성으로 작성했다.

Pyenv

파이썬 버전 관리자다. 여러가지의 파이썬 버전을 스위칭 해서 사용할 수 있다는 점이 매우 편리한 점이다.

세팅만 잘 해놓는다면 사용하는게 매우 편리하게 되어있다. 사용 키워드만 정리했다.

 

사용가능한 파이썬 버전 리스트

pyenv install --list

 

해당 파이썬 버전 다운로드

pyenv install 3.10.13

 

해당 경로에서의 파이썬 실행환경 고정

해당 경로에 .python-version 파일이 생기고 해당 경로 내에서 실행하는 파이썬 파일이 모두 해당 버전으로 구동된다.

pyenv local 3.10.13

 

터미널의 파이썬 실행환경 활성화

pyenv shell 3.10.13

 

Pipenv

파이썬 의존성을 관리하는 패키지이다. 의존성 관리가 조금 골치아픈 requirement.txt를 사용하는 방식이 아닌, pakage & pakage lock 포멧의 의존성 관리 파일을 사용한다는 점에서 매우 편리하다.

 

package와, dev package가 나눠져 있다는 것도 매우 편리하고, lock으로 의존성 설치에 대한 보장도 받을 수 있다는게 매우 좋은 것 같다.

 

의존성 파일 생성

의존성 파일인 Pipfile 파일이 생성된다.

pipenv --python 3.10.13

 

파이썬 환경, env 생성 위치 확인

pipenv --py
pipenv --venv

 

의존성 전체 설치

Pipfile에 정의된 패키지가 설치된다.

pipenv install

 

터미널의 env활성화

pipenv shell

 

의존성 추가 및 설치

의존성 파일들에 패키지가 추가되며 설치된다.

--dev옵션을 붙이면 dev dependency에 추가된다.

pipenv install 패키지명
pipenv install 패키지명 --dev

 

Pyenv & Pipenv 

이 두개의 도구를 같이 쓰면 매우 편리한 부분이 있다.

우선 pipenv가 env를 만들때 pyenv의 python버전을 가져다가 env를 만들어주기 때문에 둘은 상당히 같이 쓰기 편하고, 나름 효율적이라고 느껴졌었다.

 

다른 사람들은 모르겠지만 기존의 패키지를 freeze 하는 방식은 여러가지로 불편한 점이 많고, 실행 환경에 따라 오류도 잦았다.

하지만 Pipenv는 Npm과 매우 유사한 구조를 가지고 있기도 하고 개발의존성이 나누어져 있는것 또한 매우 편리했다.

= 배포와 구동이 매우 편리하다.

해당 프로젝트의 얼굴이 되어줄 버추얼 캐릭터를 만들어 내는데 상당한 어려움이 있었다.

 

우선 가장 흔하게 사용하는 Live 2D를 이용해보려고 Live2D WEB SDK를 건들여봤는데 상당히 쉽지 않았다.

일단 주석이 일본어로 되어있기도 했고 자습서(Document)가 필자가 생각하기에 그다지 친절하지 않았다.

 

하지만 별다른 대안이 없지 않다라고 생각 한 부분이 다른 라이브러리나 프레임워크는 무료 정책이 아니거나, 구현 난이도가 매우 높거나, 언어가 까다롭거나 중 하나였다.

 

Live2D가 뭔가?

Live2D가 생소한 사람을 위해 알게된 내용만 간단하게 정리하자면 2D일러스트를 머리카락, 눈동자, 눈썹, 윗입술, 아랫입술, 머리, 목, 어깨 등등 부분 부분을 나누고 그러한 일러스트들이 자연스럽게 움직여서 마치 2D의 캐릭터가 살아움직이는 것 과 같은 효과를 내게 하는 엔진이다. 일반적으로 SDK형식으로 유니티랑 호환이 되기에 게임개발에 많이 사용이 되어왔었지만, 요근래 버추얼 유튜버, 버추얼 휴먼등의 유명세로 게임이 아닌 다른 용도로도 많이 이용되고 있다.

다음이 Live2D를 이용한 캐릭터 모델링의 사례라고 볼 수 있다. 대부분 Live2D를 사용하는 모양새이다.

 

 

소개는 이정도로 하고 우선 Live2D SDK, 개발에 대한 정리부터 시작하겠다.

Live2D SDK, 개발

live2d sdk를 이용하여 개발을 하려고 한다. sdk를 이용하는 이유는 표정과 행동 입모양을 내 맘대로 컨트롤 하기 위함이다.

다양한 환경에서 돌릴 수 있는 SDK들이 있다.

 

웹 호환성

우선 가장 먼저 눈에 들어왔던것은 유니티, 웹, 자바 이 3개다. 유니티 SDK가 가장 보편적으로 사용되는 것 같은데 필자는 유니티를 능숙하게 다루지 못하는 편이라 유니티로 잘 만들수는 있겠지만, 여러 모듈들을 엮어서 만들어야하는 프로젝트이니만큼 이해도가 있는 환경을 사용하고 싶었다. 웹이 가장 적당하다고 생각이 들었는데, 우선 웹으로 만들면 이후 방송에 적용할때 OBS에도 바로 띄울 수 있고. http프로토콜을 이용하여 표정, 행동, 입모양을 컨트롤 할 수 있게 되기 때문이다.

 

그러므로 여러가지 편의성 때문에 WEB SDK를 이용하려고 한다.

live2d sdk 호환성

 

 

다음은 Live2D SDK와 Live2D 개발사가 직접 제공하는 웹SDK 공식 가이드 코드이다.

SDK와 공식 가이드 코드는 Typescript로 되어있고 Canvas에 WebGL을 이용하여 일러스트를 올린다.

 

 

Live2D Cubism SDK | Live2D Cubism

魅力的なビジュアルを様々なプラットフォームで実現。

www.live2d.com

 

GitHub - Live2D/CubismWebSamples

Contribute to Live2D/CubismWebSamples development by creating an account on GitHub.

github.com

 

 

필자는 WebGL을 배워본적 없기에 상당한 노가다를 통해 공식 가이드 코드를 분석했다. 주석의 대부분이 일본어로 되어있어 상당히 불친절 하다고 느꼈다. 몇번이고 다른거 찾아볼까라는 생각때문에 이런 저런 캐릭터 모델링 라이브러리를 찾아봤지만 돌고돌아 Live2d였다.

 

공식 가이드코드를 어떻게든 요리해서 다음과 같이 웹에 올리고 방송에 띄우는 것을 성공했다.

웹과 OBS(인터넷 방송 도구) 캡처 사진

 

 

Live2D SDK, 립싱크

Live2D SDK에는 음성파일에 맞게 입을 움직이는 립싱크 기능이 있는데 해당 기능을 이용해보려고 공식 문서를 뒤졌다.

 

 

wav 파일의 음량을 기반으로 립싱크(Web) | SDK 자습서 | Live2D Manuals & Tutorials

 

docs.live2d.com

 

립싱크 | Cubism SDK Manual | Live2D Manuals & Tutorials

 

docs.live2d.com

 

 

RAG는 Retrieval-Augmented Generation의 약자이다.

RAG와 관련된 언급을 이전 글 에서 했었는데 이번글에서는 이를 위한 Vector DB에 대한 비교를 해보려고 한다.

 

Vector DB비교

다음은 pytorch korea 커뮤니티에서 가져온 Vector DB의 비교 테이블이다.

2023년 기준 Vector 데이터베이스 비교 (https://discuss.pytorch.kr/t/2023-picking-a-vector-database-a-comparison-and-guide-for-2023/2625)

 

우선 필자가 써본 데이터베이스의 극히 개인적인 경험에 대해서 간단하게 서술하자면 다음과 같다.

Pinecone

단어 유사도 맞추기 게임을 만들때 처음으로 사용해봤다. Pinecone을 사용해본건 출시된지 얼마 안됬었을 때였지만, 파이어베이스의 데이터베이스와 비슷한 느낌을 받았던 Vector DB이다.

그리고 상당히 API가 사용하기 좋게 구현되어있어서 편리했었던 기억이 있다. 클라우드에서 데이터베이스 관리를 하기 매우 쉽게 만들어놓았다. 

Chroma

프리렌서로 일할때 하던 프로젝트에서, 해당 데이터베이스를 사용해봤다.

일단 벡터 기반으로 검색을 하면서 metadata로 하이브리드 필터를 상당히 편리하게 걸 수 있었다.

직관적이고 간단한 문법으로 검색할 수 있으며 검색 쿼리를 JSON으로 작성할 수 있다는게 매우 편리한 포인트였다.

JSON 조건 제어가 편리한 이유는 조건을 Function Call을 이용한 쿼리 생성에 매우 용이하기 때문이다. (경험상 매우 편리했음)

 

또한 오픈소스이며, 클라우드를 사용하지않고 클라이언트용으로 사용하면 Apache 2.0 라이센스에 무료로 이용할 수 있다는 점이 상당히 괜찮은 점이었다.

 

대신 아쉬운점은 기능적 측면에서 다양하지 않다는 점이었다. 검색도 굵직한 범용적인 쿼리들은 다 있었지만, 가려운데 긁어주는 세분화되고 특수한 쿼리들이 없어서 약간 아쉬운 점이 있었다.

 

내부적으로는 SQLite를 이용한다.

Weaviate

이것도 프리렌서로 일할때 하던 프로젝트에서 사용했던 데이터베이스이다.

 

우선 Chroma DB를 사용하다가 해당 데이터베이스로 옮겼는데, 그 이유로는 Chroma DB의 기능 중 조금 아쉬운 부분이 있었다.

그래서 검색 부분에서 더 다양한 조건을 걸 수 있는 Weaviate로 갈아 탔었다.

 

Weaviate는 Document는 잘 되어있지만 사용하는 난이도는 Chroma보다 조금 높았던 것 같다. (아무 많이는 아니고 조금)

기능이 다양해졌으니 어느정도는 당연하다고 생각되는 수준이었다.

 

이것도 상당히 쓸만하고 Client로 사용했을때 무료로 사용할 수 있다.

이것 또한 오픈 소스이며 BSD-3-Clause 라이센스이다.

잘 모르는 사람을 위해 중요한 부분만 짚자면, 무료사용, 배포 제한 없음, 소스공개의무없음, 특허보호없음 이기에 상업적이용도 상관없다.

 

+ Recent posts