Node-RED에 Open Jtalk를 통합하여 Text to Speech!

홈 디렉토리를/home/user1이라고 합니다.
Open Jtalk은 나고야 공업 대학 개발의 일본어 음성 합성 소프트웨어입니다.
이번에는, 로컬의 Linux 환경에 구축한 Node-RED에 Open Jtalk를 짜넣어, 텍스트 데이터를 음성으로 읽어 보고 싶습니다. 스마트 스피커를 만드는데 음성 합성은 필수입니다.

Open-Jtalk 설치



Node-RED는 로컬 환경의 Linux에 구축되어 있으며 Ubuntu16.04 기반을 사용하기 때문에 Ubuntu 용 패키지 덕분에 설치가 매우 쉽습니다.
先ずはOpen-Jtalkをインストールします。
$ sudo apt-get update
$ sudo apt-get install open-jtalk

インストール時に、下記提案パッケージが表示されますので、こちらもインストールします。
$ sudo apt-get install open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001


Node-RED에서 호출하는 쉘 스크립트 작성



Open-Jtalk 설치가 완료되었습니다. 표준 출력의 것을 텍스트로부터 음성으로 변환하는 처리를 실시하므로, 텍스트 파일을 작성합니다.
- 홈 디렉토리에 voice.txt 만들기 --> $ nano/home/user1/voice.txt
- 안녕하세요, 세카이와 설명

exec 노드에서 실행되는 쉘 스크립트
$ nano jtalk.sh

#!/bin/sh

cat /home/user1/voice.txt | open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -ow /home/user1/jtalk.wav
play /home/user1/jtalk.wav
rm -f /home/user1/jtalk.wav

$ chmod a+x jtalk.sh

Node-RED에서 exec 노드를 사용할 때 |(파이프)로 명령을 연결하면 오류가 발생하기 때문에 쉘 스크립트로 정리하고 있습니다.
이 쉘 스크립트는 Open-Jtalk를 사용하여 텍스트 파일의 문장을 jtalk.wav로 변환하고 jtalk.wav를 재생하고 재생한 후에는 jtalk.wav를 파괴하는 흐름입니다.
Node-RED내의 노드로부터 출력된 텍스트 데이터를 텍스트 파일로서 한 번 보존하는 공정으로 해 두면, 별도로 만들어 둔 일기 예보나 챗봇과 조합하기 쉬워집니다.

Node-RED에 내장



작성한 쉘 스크립트를 「exec」노드에 짜넣어, 「inject」노드(아래 그림의 timestamp로 표시되어 있는 노드)와, 「file in」노드(voice.txt로 표시), debug 노드로 선으로 연결합니다. 혹은, Node-RED 화면 우측 상단의 「3」→「읽기」→「클립보드」로 샘플 플로우를 불러옵니다.



샘플 흐름
[{"id":"5182ef17.5027f","type":"tab","label":"Open Jtalk","disabled":false,"info":""},{"id":"4b2e227b.1625ec","type":"file in","z":"5182ef17.5027f","name":"voice.txt","filename":"/home/user1/voice.txt","format":"utf8","chunk":false,"sendError":false,"x":273,"y":44,"wires":[["a9f80fce.6ca6"]]},{"id":"f120b0e9.f651f","type":"inject","z":"5182ef17.5027f","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":108,"y":45,"wires":[["4b2e227b.1625ec"]]},{"id":"a9f80fce.6ca6","type":"exec","z":"5182ef17.5027f","command":"/home/user1/jtalk.sh","addpay":true,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"open-jtalk","x":457.5,"y":43.5,"wires":[[],[],["9a7d5b65.81d768"]]},{"id":"9a7d5b65.81d768","type":"debug","z":"5182ef17.5027f","name":"","active":true,"console":"false","complete":"false","x":668,"y":58,"wires":[]}]

구현 후, 선두의 「inject」노드의 좌단을 클릭하면 음성으로 「안녕하세요 세카이」라고 들릴 것입니다. "inject"노드의 편집 화면을 호출하면 정기적으로 실행하는 처리를 설정할 수 있습니다.

요약



Open-Jtalk를 사용하여 Text to Speech를 로컬 환경에 구현할 수있었습니다. 다만, Open Jtalk는 일본어 전용으로 “히라가나” “가타카나” “한자” “숫자”를 이해해 읽습니다. 알파벳은 예를 들어 Hello World에서 에이치 이엘 엘 오 더블린 오 엘디라고 읽습니다. 일본어와 영어 단어가 섞여있는 문장에 대해서는 무료 테두리가있는 "Watson Text to Speech"가 여전히 우수합니다.
이번 'Open Jtalk'는 스마트 스피커 이용자에게 음성으로 전할 때 '히라가나', '가타카나', '한자', '숫자'로 구성된 문장이라면 사용거리가 있을 것입니다.

관련 콘텐츠


  • 로컬 환경에서 리눅스에서 스마트 스피커에 도전 (1) → 여기를 클릭
  • Node-RED에서 Julius를 사용하여 음성 인식 → 여기를 클릭
  • 좋은 웹페이지 즐겨찾기