Python

「ブログのページをPythonを使って読み上げる」ただそれだけのプログラミング

こんにちは ともです。

今回の投稿は「ブログのページからPythonを使って本文を取得ただそれだけの単純なプログラミング」のつづきです。

ブログのページをPythonを使って読み上げるただそれだけのプログラミングになります。

音声読み上げの設定

音声はOpen JTalkを使用しています。

Open JTalkの設定は、以下のページを参考にしています。

参考:Open JTalkをWindowsでビルドして動かしてみる

hts_engineダウンロード

OS:Windows 10

コンパイル:Visual Studio Community

上記URLを参考にOpenJtalkの「Source Code」をダウンロードします。※ダウンロード後にVisual Studio Communityでbuildを実施します。

ダウンロードは「hts_engine_API-1.10.tar.gz」のファイルをダウンロードします。

ダウンロード後は任意のフォルダに配置します。私の環境のディレクトリ構成は以下の通りです。

  
D:\
  ┗hts
    ┗hts_engine_API-1.10.tar.gz
  

このディレクトリ配下でファイルを解凍します。

hts_engineビルド

ビルドを行います。

  
D:\
  ┗hts

cd D:\hts\hts_engine_API-1.10

nmake -f Makefile.mak
    
  

ビルドができない場合はVisial Studio Communityの「ツール」->「ツールと機能を取得」を選択します。

C++によるデスクトップ開発にチェックを行います。

OpenJtalkダウンロード

ダウンロードは「open_jtalk_dic_shift_jis-1.11.tar.gz」のファイルをダウンロードします。

ダウンロード後は任意のフォルダに配置します。私の環境のディレクトリ構成は以下の通りです。

OpenJtalkビルド

Makefileのファイルを更新します。apiのディレクトリパスの変更を行います。

D:\jtalk\open_jtalk-1.11\bin\Makefile.mak

    
CC = cl
CL = link

CFLAGS = /O2 /Ob2 /Oi /Ot /Oy /GT /GL /TC 
         /I..\text2mecab 
         /I ..\mecab\src
         /I ..\mecab2njd
         /I ..\njd
         /I ..\njd_set_pronunciation 
         /I ..\njd_set_digit
         /I ..\njd_set_accent_phrase
         /I ..\njd_set_accent_type
         /I ..\njd_set_unvoiced_vowel
         /I ..\njd_set_long_vowel
         /I ..\njd2jpcommon
         /I ..\jpcommon
         /I D:\hts\hts_engine_API-1.10\include
LFLAGS = /LTCG

LIBS = ..\text2mecab\text2mecab.lib 
       ..\mecab\src\mecab.lib
       ..\mecab2njd\mecab2njd.lib
       ..\njd\njd.lib
       ..\njd_set_pronunciation\njd_set_pronunciation.lib
       ..\njd_set_digit\njd_set_digit.lib
       ..\njd_set_accent_phrase\njd_set_accent_phrase.lib
       ..\njd_set_accent_type\njd_set_accent_type.lib
       ..\njd_set_unvoiced_vowel\njd_set_unvoiced_vowel.lib
       ..\njd_set_long_vowel\njd_set_long_vowel.lib
       ..\njd2jpcommon\njd2jpcommon.lib
       ..\jpcommon\jpcommon.lib
       D:\hts\hts_engine_API-1.10\lib\hts_engine_API.lib
       winmm.lib
       Advapi32.lib

all: open_jtalk.exe

open_jtalk.exe : open_jtalk.obj
    $(CC) $(CFLAGS) /c $(@B).c
    $(CL) $(LFLAGS) /OUT:$@ $(LIBS) $(@B).obj

clean:  
    del *.exe
    del *.obj
    
  

D:\jtalk\open_jtalk-1.11\mecab\Makefile.mak

    
all: char.bin matrix.bin sys.dic unk.dic

left-id.def: _left-id.def
    copy _left-id.def left-id.def

pos-id.def: _pos-id.def
    copy _pos-id.def pos-id.def

rewrite.def: _rewrite.def
    copy _rewrite.def rewrite.def

right-id.def: _right-id.def
    copy _right-id.def right-id.def

char.bin matrix.bin sys.dic unk.dic: naist-jdic.csv matrix.def left-id.def pos-id.def rewrite.def right-id.def char.def unk.def feature.def
    ..\mecab\src\mecab-dict-index.exe -d . -o . -f UTF-8 -t sjis

clean:
 del char.bin matrix.bin sys.dic unk.dic
    
  

音声データダウンロード

音声データをダウンロードします。

MMDAgent_Example-1.8.zip

  
D:\
  ┗voice_mei
    ┣MDAgent_Example-1.8
    ┗MDAgent_Example-1.8.zip
  

実行

実行します。以下のディレクトリ配下にinput.txtを作成し、発音したい内容を記載します。

  
cd D:\jtalk\open_jtalk-1.11\bin

open_jtalk.exe -m D:\voice_mei\MMDAgent_Example-1.8\Voice\mei\mei_normal.htsvoice -x dic -ow output.wav input.txt
  

コーディング

コーディングは以下の通りです。

  
D:\
  ┗python_workspace
    ┗getblogpage.py
  
    
from bs4 import BeautifulSoup
import requests
import subprocess
import winsound

request = requests.get('{url}')

bs_result = BeautifulSoup(request.text, 'html.parser')

OPENJTALK_BINPATH = 'D:/jtalk/open_jtalk-1.11/bin'

OPENJTALK_DICPATH = 'D:/jtalk/open_jtalk-1.11/mecab-naist-jdic'
OPENJTALK_VOICEPATH = 'D:/voice_mei/MMDAgent_Example-1.8/Voice/mei/mei_normal.htsvoice'

open_jtalk=[OPENJTALK_BINPATH + '/open_jtalk.exe']
mech=['-x',OPENJTALK_DICPATH]
htsvoice=['-m',OPENJTALK_VOICEPATH]
speed=['-r','1.0']
outwav=['-ow','open_jtalk.wav']
cmd=open_jtalk+mech+htsvoice+speed+outwav
str_line = ''
paragraph_list = bs_result.find_all('p')
for line in paragraph_list:
    c = subprocess.Popen(cmd,stdin=subprocess.PIPE)
    print(line.text)
    c.stdin.write(line.text.encode('shift-jis'))
    c.stdin.close()
    c.wait()
    winsound.PlaySound('open_jtalk.wav', winsound.SND_FILENAME)

    
  

コーディングの説明は省略します。

実行

pythonのコマンドラインで実行します。

    
D:\
  ┗python_workspace
    ┗getblogpage.py

cd D:\python_workspace

python getblogpage.py
    

まとめ

pythonを使って自分のブログページの本文を取得しました。ただそれだけのブログラムです。

コメント

0 件のコメント:

コメントを投稿

コメントをお待ちしています。