忍者ブログ

数学をわかりやすくするblog

[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

gstreamerとopen_jtalkで字幕の読み上げ

tts_server.py

#! /usr/bin/env python3
import socketserver
import subprocess

SPEED = 1.8
PITCH = 300
VOLUME = 1.0
DICDIR = "/var/lib/mecab/dic/open-jtalk/naist-jdic/"
HTSVOICE = "/opt/voice/mei_normal.htsvoice"
CMD = "open_jtalk -r {0} -p {1} -jm {2} -x {3} -m {4} -ow /dev/stdout \
| aplay --quiet".format(SPEED, PITCH, VOLUME, DICDIR, HTSVOICE)

class TTS_Server(socketserver.BaseRequestHandler):
    """
        gstreamerのudpsink(5004)から文字列を受け取って
        open_jtalkのstdinに渡すUDPServer
    """

    def handle(self):
        data = self.request[0]
        with subprocess.Popen(CMD, shell=True,
                                stdin=subprocess.PIPE).stdin as stream:
            stream.write(data)
        print(str(data,"utf8"))

if __name__ == "__main__":
    HOST, PORT = "localhost", 5004
    print("server listen {0}:{1}".format(HOST, PORT))
    server = socketserver.UDPServer((HOST, PORT), TTS_Server)
    server.serve_forever()

# 2015/05/11 とりあえず動いた

gst-srt-tts.sh

#!/bin/sh
WIDTH=960
VIDEO_HEIGHT=540
SUBTITLE_HEIGHT=100
FONT_NAME="selif"
VIDEO_PATH="$1"
SRT_PATH="${1%.*}.srt"

gst-launch-1.0 videomixer name=mix sink_1::ypos=${VIDEO_HEIGHT} ! xvimagesink \
filesrc location="${VIDEO_PATH}" ! queue ! decodebin name=decode \
decode. ! videoscale ! video/x-raw,width=${WIDTH},height=${VIDEO_HEIGHT} ! mix.sink_0 \
decode. ! pulsesink \
videotestsrc pattern=black ! video/x-raw,width=${WIDTH},height=${SUBTITLE_HEIGHT} \
! subtitleoverlay name=overlay font-desc="${FONT_NAME}" ! mix.sink_1 \
filesrc location="${SRT_PATH}" ! queue \
! subparse subtitle-encoding=UTF-8 ! tee name=srt ! overlay. \
srt. ! udpsink

使い方

tts_serverを起動しておく

python3 tts_server.py

別の terminal を開いて test.mp4 test.srt がある場所で

gst-srt-tts.sh test.mp4

で日本語字幕の表示と読み上げをしながら動画再生する

参考にしたところ

PR

コメント