시스템 아키텍처

프로토타입의 첫 버전을 설계하는데 있어 최소 스펙을 갖추었다고 판단했다.

앞으로 계속 기능을 붙이며 조금씩 업데이트 해 나갈 예정이다.

System Architecture

시스템 아키텍처는 다음과 같다. 

대화 데이터들을 embedding하여 관련정보를 query할 수 있도록 하여, 일반적인 Retrieval 구조가 완성되었다.

 

개발은 한국어버전 일본어 버전으로 2개 만들었으며 최대한 간단하게 구성하려고 했다.

반응은 전화하는것 정도의 빠른 반응까지는 얻어내기 힘들었지만, 나름 대화가 된다고 느낄수 있는 속도였다.

 

Test (한국어)

Test (일본어)

테스트케이스를 따로 정리하지는 않았다.

 

한국어와 일본어 버전을 나눈 이유는 한국어성능에서의 약간의 부족함을 느껴서이다.

1. 우선 한국어의 느낌이 잘 안사는것 같은 느낌이 들었다. 듣는 내가 한국인이어서 그럴수도 있을것 같다. 친구같은 느낌의 대화를 바라지만 너무 공손하고 예의 차리고 딱딱한 대화라고 느껴짐이 있었다. ChatGPT의 학습적인 문제라고 생각한다.

2. 현재 ASR이 ?나 .이나 !를 안붙여준다. 다른걸 찾아봐야겠지만 한국어의 경우 똑같은 말이어도 !?. 에 따라서 의미가 많이 달라지기도 하고 억양에 따라 의미가 달라지는 경우도 많다. 그런부분을 잘 캐치하지 못하게 되는 걸 느꼈다. 반면 일본어는 문장기호가 한국어보다 중요도가 좀 떨어진다. 그런면에서 더 괜찮은 것 같았다.

3. 한국어 TTS가 어색하다. 사실 한국어는 다양하지는 않지만 그럭저럭 괜찮은 모델을 찾기도 했었다. 영어 TTS가 좀 생각했던 것 보다 많이 별로라고 느꼈고, 일본어는 몇몇 되게 괜찮은 모델들이 있었다.

 

Conclusion

사실 필자가 일본어와 영어 둘다 초급 수준으로 하기에 비교적 어색함을 덜 느꼈을 수 도 있을 거라고 생각이 들었다.

그래서 실제 일본인, 혹은 모국어가 영어인 사람한테도 기회가 된다면 한번 시켜보겠다.

 

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

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

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

 

+ Recent posts