이전에 scrcpy를 유용하게 쓰고 있다는 이야기를 했었습니다.

https://moordev.tistory.com/323

 

scrcpy로 우분투에서 안드로이드 스마트폰 미러링하기

우분투에서 안드로이드 게임을 하거나 안드로이드 에뮬레이터를 돌리는 것은 꽤나 어렵습니다. 기껏해야 Genymotion정도가 안드로이드를 돌리는데 겨우 쓸만합니다. 그리고 대부분 안드로이드 게

moordev.tistory.com

 

실제로 미러링임에도 딜레이가 적었으며 디버그 모드를 활성화 해서 PC를 기억해두면 연결후에 바로 화면이 뜨는 등 매우 편리한 프로그램이었습니다.

 

그런데 사용하고 있는 PC가 아니라 오래된 랩탑에 scrcpy만 설치해서 필요에 따라 스마트폰 화면을 띄우는 독으로 만들면 어떨까라는 생각을 했습니다.

 

비슷한것으로 삼성Dex가 있고 더 옛날로 돌아가면 모토로라의 아트릭스가 있겠네요.

일단 Dex나 아트릭스나 있으면 좋겠지만 삼성 휴대폰이 아니더라도 넓은 화면으로 스마트폰을 쓰고 싶은 사람들도 있을 것이고 외부 모니터를 지원하지 않는 휴대폰도 있을 것이며 때에 따라서는 HDMI모니터 대신 오래되서 버려진 랩탑을 사용하는 또다른 방법이 될 수도 있겠다는 생각을 했습니다.

 

우선 만들어진 이미지는 

https://drive.google.com/file/d/1McZMh8MxRRkGEghZtrtM52wuuOyduZ1Y/view?usp=sharing

 

custom-live.iso

 

drive.google.com

여기서 다운로드 받을 수 있습니다. Debian 10 Buster 기반이고 필요에 따라 Debian 11 Bullseye의 패키지 일부를 백포트해서 설치했습니다.

MD5 2e2118cf81dcd620547bc14505a9a288 

 

해당 이미지를 balenaEtcher로 USB에 굽거나 CD로 구워서 PC로 부팅합니다.

 

그리고 디버그 모드가 설정된 안드로이드 휴대폰을 USB로 연결하면 끝입니다. 디버그 모드 설정은 여기서 굳이 설명 안 해도 찾아보면 많이 나오니 따로 설명은 안 하겠습니다. 참고로

https://4343282.tistory.com/267

 

USB디버깅 모드) 안드로이드 개발자 옵션 활성화 하기

 USB디버깅 모드는 프로그램을 개발하는 개발자, 마케팅을 진행하는 마케터들에게는 필수 기능입니다. 안드로이드 기기에서 기본적으로 제공하는 '안드로이드 개발자 옵션(USB 디버깅 모드)'를

4343282.tistory.com

여기 자세히 나와 있네요.

 

그러면..

https://youtu.be/QGEC9VW_tjM

이렇게 쓸 수 있습니다. 여기에 몇가지 단축키를 알아두시면 더 편리합니다.

 

왼쪽 Alt + O = 스마트폰 화면 꺼짐

왼쪽 Alt + Shift + O = 스마트폰 화면 켜짐

왼쪽 Alt + P = 전원 버튼

왼쪽 Alt + R = 화면 돌리기

왼쪽 Alt + 방향키 위아래 = 볼륨 조절

왼쪽 Alt + H = 홈버튼

마우스 오른쪽 버튼 = 뒤로가기

Ctrl+드래그 = 핀치투 줌

 

자세한 내용은 SCRCPY 설명서를 참조 하시면 됩니다.

 

이런 만드는 방법은 다음과 같습니다.

Virtualbox를 준비합니다.

Debian을 Virtualbox에 설치합니다.

설치가 끝난 뒤에 Debian에 xorg, nodm, openbox, adb, scrcpy 를 설치합니다. (scrcpy는 bullseye 이상에서 제공합니다. 그러므로 Debian 11 이상 사용을 추천)

/etc/default/nodm 파일에 

 

NODM_USER = "설치할때 정한 로그온계정"

 

이것을 안 하면 root로 로그인 되어버립니다. 보안상 문제가 있겠지요.

 

/etc/xdg/openbox/autostart

파일을 열고 마지막줄에 다음과 같이 적습니다.

 

while :; do adb wait-for-device && scrcpy; done

 

이제 openbox의 단축키를 일부 수정합니다.

/etc/xdg/openbox/rc.xml 파일을 수정합니다.

 

<keyboard>

  <keybind key="XF86PowerOff">

    <action name="Execute">

      <command>sudo shutdown -h now</command>

    </action>

  </keybind>

</keyboard>

 

<keyboard> 안을 이것으로 바꿔버립니다. (단축키 충돌 방지를 위함)

 

그리고 shutdown 시 암호를 묻지 않게 하기 위해서

(참고 : https://linux.byexamples.com/archives/315/how-to-shutdown-and-reboot-without-sudo-password/)

 

sudo visudo

%sudo ALL = NOPASSWD: /sbin/shutdown

 

위 내용을 추가합니다.

 

이제 이것을 LinuxRespin을 사용해서 백업합니다.

cd /tmp

wget gitlab.com/remastersys/LinuxRespin/-/raw/master/respin_4.0.0-2_all.deb

sudo dpkg -i respin*.deb

sudo apt install -f

 

이제 백업을 합니다.

 

sudo respin backup

(backup대신 dist를 해도 되나 nodm이 오류 날 수 있음)

이제 /home/respin/respin에 iso파일이 하나 있을 겁니다. 이것은 표준 iso이므로 이걸 하이브리드 iso로 만들어서 USB에 바로 심을 수 있게 만듭니다.

 

sudo apt-get install syslinux isolinux syslinux-utils syslinux-efi
cd /home/respin/respin

isohybrid *.iso

이제 해당 iso파일을 VM밖으로 꺼내와서 사용하면 끝. (VM밖으로 꺼내는 것은 네트워크를 사용하던지 아니면 알아서 하시면 됩니다.

,

라즈베리파이는 작은 컴퓨터입니다.

그리고 성능은 그 크기에 걸맞게 그리 좋지 못하지요.

 

하지만 그럭저럭 좋은 성능에 굉장히 저렴한 가격으로 쓸만한곳이 상당히 많습니다.

 

이전에 저는 Tacotron으로 무언가를 하나 만들었습니다. 어찌되었건 이를 다시 서빙해야 했는데 코드는 python의 기본 적인 웹서버로 웹페이지에서 받아볼 수 있게 어찌저찌 만들었습니다.

 

tacotron의 오픈소스를 만든 keithito의 demo_server 소스를 이용해서 hccho2의 한국어 tacotron을 데모를 쓸 수 있게 어찌저찌 잘 수정했습니다.

https://github.com/MoorDev/Tacotron2-Wavenet-Korean-TTS/blob/master/run.py

 

그런데 이걸 서비스할 방법이 마땅치 않습니다. 무료로 유명한 구글의 컴퓨트 엔진을 쓰려고 했는데 RAM이 모자란 탓인지 자꾸 멈춥니다. 심지어 pip도 제대로 안 되더군요.

 

서버를 구축하려면 pip freeze 된 것을 다시 설치해야 하는데 이거 자체가 안 되니 환장할 노릇입니다.

 

그래서 제 옆에 있던 라즈베리파이에 한번 넣어보기로 했습니다. 그래도 ARM칩셋이지만 램도 어느정도 충분하고 학습이 아닌 결과물만 뽑으면 되는 것이니까요.

 

 

우선 제가 개발한 파이썬 환경을 Freeze 합니다.

 

개발및 학습 PC에서

pip freeze > requirements.txt

 

그리고 만들어진 requirements.txt는 다른 곳에서 쓸 때도 그대로 환경을 구축하는데 쓰이게 됩니다. 

 

그 다음 라즈베리파이에 OS를 설치합니다.

이건 제가 따로 말 안 해도 방법이 워낙 많으니까 넘어갑니다. 대신 ssh를 활성화 해야 하는건 잊으면 안 됩니다.

ssh 활성화는 구운 SDCARD에 boot파티션에 ssh란 파일이름으로 아무 파일이나 하나 만들어주면 됩니다.

무선인터넷을 바로 잡는 법은 역시 boot파티션에 wpa_supplicant.conf 라는 이름으로 

내용을 다음과 같이 적으시면 됩니다.

country=US
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="공유기이름"
    psk="공유기비밀번호"
}

왜 국가가 US로 되어 있냐면 KR로 하니 라즈베리파이가 못 잡습니다. 그래서 그냥 호환되는 US로 했습니다. 일단 잡히면 되는거지요.

 

그 다음 개발환경이자 Python 폴더 자체를 통째로 넣어줍니다. 보통 Tensorflow 개발 PC는 리눅스고 라즈베리파이OS도 리눅스이니 충분히 복사가 가능할 것입니다.

 

이걸 통째로 SDCARD에 넣어줘야 합니다. 만약 필요하면 경로도 최대한 같게 해주는 것이 중요하지요.

 

그리고 라즈베리파이를 부팅하면... SSH로 접속할 수 있게 됩니다. IP주소를 모르겠다면 공유기설정에서 찾던가 아니면 다른 방법을 찾아야 합니다.

ssh pi@라즈베리파이주소

기본 비밀번호는 raspberry 인데 해킹 방지를 위해 꼭 sudo raspi-config에서 비밀번호를 바꾸는 작업을 해 줍시다.

 

이제 파이썬 버전을 맞추는 작업이 필요한데 제가 사용한 라즈베리파이OS는 데비안 10(Buster)기반입니다. 기본으로 Python 3.7을 사용합니다.

그에비해 저는 Python3.6을 기본으로 사용했습니다. 그래서 얼마나 다른가 봤는데... 예약어 차이정도라 크게 문제는 없을 정도네요. 그래서 그냥 쓰기로 했습니다. 만약 3.8이었다면 많이 차이나기 때문에 Python을 수동으로 설치하는 수고가 필요했을 겁니다.

 

그리고 requirements.txt를 사용해서 필요한 패키지를 설치합니다.

sudo pip3 install -r requirements.txt

 

이제 어마어마한 다운로드를 보일텐데 ARM칩과의 차이로 인해 일부 문제가 있었습니다.

 

저는 우선 LLVM문제가 일어났습니다. 데비안 Buster는 LLVM-7을 사용하는 반면 저는 LLVM-10을 사용했습니다.

그래서 LLVM-10을 설치했습니다.

 

그런데 수동으로 해야합니다.

https://releases.llvm.org/download.html

 

LLVM Download Page

If you'd like access to the "latest and greatest" in LLVM development, please see the instructions for accessing the LLVM Git Repository. The major changes and improvements that the development version contains relative to the previous release are listed i

releases.llvm.org

여기서 제 라즈베리파이는 ARM-32비트이므로 ARMv7을 선택합니다. 64비트 버전도 나오고 있으니 이를 확인해야합니다. 64비트라면 AArch64를 다운로드 받으세요.

라즈베리파이에서

wget github.com/llvm/llvm-project/releases/download/llvmorg-10.0.1/clang+llvm-10.0.1-armv7a-linux-gnueabihf.tar.xz

tar -xvf clang*.xz

cd clang+llvm (탭)

sudo cp -R * /usr/local

 

이걸로 llvm-10의 설치를 끝냈습니다. 그러고나니 제일 중요한 Tensorflow가 문제가 생기더군요.

일단... 안 깔립니다. 원래 설치가 되어야 정상인데 간혹 거부가 일어나나 봅니다.

sudo pip3 install tensorflow==(원하는버전)

이걸로 설치가 되어야 정상이지만 설치가 제대로 안된다면

https://qengineering.eu/install-tensorflow-1.15.2-on-raspberry-pi-4.html

 

Install TensorFlow 1.15.2 on Raspberry Pi 4 - Q-engineering

A thorough guide on how to install TensorFlow 1.15.2 on your Raspberry Pi 4. Build from source code with Bazel for Python 3 and C++ API.

qengineering.eu

여기를 참고합니다.

 

sudo apt-get install libatlas-base-dev libatlas3-base

sudo apt-get install libhdf5-dev libc-ares-dev libeigen3-dev

sudo pip3 install h5py==2.10.0

wget github.com/Qengineering/Tensorflow-Raspberry-Pi/raw/master/tensorflow-1.15.2-cp37-cp37m-linux_armv7l.whl

 

sudo -H pip3 tensorflow-1.15.2-cp37-cp37m-linux_armv7l.whl

 

이걸로 Tensorflow 1.15.2를 구동할 수 있게 되었습니다.

 

그래서 결과는..?

 

잘 됩니다!!!

,

1. 제가 좋아하는 사람이 있습니다. 이 사람이 목소리 연기가 꽤 괜찮아서 어쩌다보니 목소리 데이터를 모을 수 있었습니다. 다만 쓸 만한 것이 다 합쳐서 2시간이 될까 말까 합니다.

 

2. 그리고 Tacotron이란 것이 있습니다. 딥러닝을 사용해서 일종의 TTS를 만드는 프로젝트인데 한국어 Tacotron이 오픈소스로 꽤 잘 나와 있습니다.

https://github.com/hccho2/Tacotron2-Wavenet-Korean-TTS

 

소스가 올라온지 2년 정도 되긴 했지만 제가 fork해서 일단 필요하면 계속 발전 시킬까 생각은 하고 있습니다. 기존 프로젝트에서 Requirement만 일단 모아놓고 추후에 가능하면 Tensorflow 2.x 로 가능할지 찾아보고 있습니다. 물론 제 성격상 언제 할 수 있을지 아무도 모릅니다.

 

3. KSS 데이터셋이라는 것이 있습니다. 한국어 음성 딥러닝을 공부하는 데에 있어서 정말 눈물나게 고마운 데이터입니다. 어떤 성우분인지 모르지만 12시간 분량의 문장을 녹음해 주었습니다.

https://www.kaggle.com/bryanpark/korean-single-speaker-speech-dataset

 

이걸 기반으로 음성인식도 하고 반대로 TTS도 만들고 하는데 쓰입니다. 연구소나 학교에서 정말 유용하게 쓰입니다. 대신

CC BY-NC-SA 4.0

이것 때문에 상업적인 이용은 불가능합니다.

 

그래서 위의 것을 다 합치면 무엇이냐...

 

Tacotron을 사용해서 제가 좋아하는 사람의 목소리를 TTS로 만들고 싶었습니다.

그래서 처음에는 제가 가지고 있던 2시간 분량의 좋아하는 사람의 목소리를 학습 시켜보았습니다.

결과는... 말을 하다 맙니다. 그래프를 보니 희미..합니다.

 

 

그래서 들어보니 한마디 나오려다가 옹알이를 합니다.

 

해결방법은 더 많은 학습데이터를 쏟아부으면 된답니다. 그런데 녹음을 부탁하기가 좀 껄끄럽습니다. 바쁠 수도 있고요.

그래서 다른 방법을 찾아보니 잘 만들어진 데이터셋과 함께 학습을 시키면 적은 데이터로도 괜찮은 품질이 나온다고 합니다.

 

그래서 Multi로 KSS데이터셋을 사용해 KSS와 그분의 목소리를 함께 학습을 시켰습니다.

 

결과는... KSS데이터셋으로 한 것만 멀정히 말합니다. 그런데 해당 학습 모델에서 KSS와 제가 모은 그분의 목소리가 섞이는 것이 보이더군요.

 

그분에게 제 TTS데이터를 보내봤습니다. 반응이 좋더군요. 자기 목소리랑 비슷하다고요.

근데...그거 KSS에 살짝 본인 목소리 데이터를 첨가한겁니다. (KSS12시간+그분2시간)

그래서 살짝 발상을 전환해서 제 데이터에 KSS데이터의 1시간분량을 첨가해봤습니다...

결과는... 꽤 만족스럽습니다. 전보다 발음도 괜찮고 일단 alignment는 잘 잡습니다. 대신 데이터셋을 새로 구성해서 처음부터 다시 학습 중입니다...

현재 데이터셋 설정
1. Multi-Speech
2. KSS Speech 12Hour
3. 그분+KSS 1hour

일단 현재는 만족

,