PYTHON実行中に音声出力します
(動作はwindows上のみです)
別ファイルにある{“呼び出しキー”:”テキストデータ”}の辞書データファイルを読み込んで、指定したテキストを読み上げます。
汎用化のためクラス化しましたが、音声出力の実態は(windowsの機能呼び出し宣言2行+呼び出しメソッド行)の3行です。
import win32com.client
sp = win32com.client.Dispatch(“SAPI.SpVoice”)#これを呼ぶだけ
sp.Speak(str)#一文読み上げ
コードが読みづらくなるのでデータ呼び出し部分とまとめて、別ファイルが良いかなと思ったのです。
しかし、考えてみれば、ソース中だと、#コメント代わりになるとも言えるのでソース埋め込みも悪くないですけどね。
【手順】
クラスから実体を作ります
- sp=Talk()
テキストデータを読み込みます
- sp.set_dic(ファイル名)
読み上げます
- 文字列変数=キー
- sp.talk(テキスト辞書オブジェクト[キー])
読み上げのためのクラスを定義します
WINDOWSの機能win32comを使います
import win32com.client
from os import path
import json
class Talk():
def talk(self,strs):#読み上げ機能
speaker = win32com.client.Dispatch("SAPI.SpVoice")#これを呼ぶだけ
speaker.Speak(strs)#一文読み上げ
def set_dic(self,filename):#読み上げテキストを格納
json_open = open(filename, 'r',encoding="utf-8")
bun_dic = json.load(json_open)
return bun_dic#jsonオブジェクトを返す
例として、ビットフライヤーのapiを叩いてデータを取得するプログラムに、ヘルプ的に音声案内を付け足します.
#音声読み上げ以外の部分の解説ページはこちらにあります
#https://tokyo559.com/page-6751/getbf/
from pprint import pprint#辞書を整形出力
import time#タイマーとか現在時刻とか
import pybitflyer#ラッパー
import json#データ形式
import requests#
import datetime#
from class_talk import Talk
sp=Talk()#音声出力の実体化
product='BTC_JPY'
#ラッパーのインスタンス化
api = pybitflyer.API(api_key='', api_secret='')#public apiなので、''でOK
def getmarkets():
pprint(requests.get('https://api.bitflyer.com/v1/getmarkets').json())
def py_board():
response = api.board(product_code=product)
print(product,'midprice =',response['mid_price'])
print('asks 件数',len(response['asks']))
print('bids 件数',len(response['bids']))
def py_ticker(self, **params):
response = api.ticker(product_code=product)
pprint(response)
def py_executions(self, **params):
response = api.executions(product_code=product)
print('executions')
pprint(response)#全9種類
print(len(response))
def py_getboardstate(self, **params):
response = api.getboardstate(product_code=product)
print('getboardstate')
print(response)
def py_gethealth(self, **params):
response = api.gethealth(product_code=product)
print('gethealth')
print(response['status'])
def py_getchats(self, **params):
td=datetime.datetime.now()
td=td - datetime.timedelta(days=1) #3時間減算
response = api.getchats(from_date=td.strftime('%Y-%m-%d'))#T%H:%M:%S'))
print('getchats 最近の100件だけ表示')
for i in range(1000):#response:
print(response[i]['message'])
if __name__ == '__main__':
bun_dic=sp.set_dic('describe.json')#別ファイルから音声テキストを読み込む
try:
while True:
inp=input('''どの処理にしまましょうか
<<<HTTP Public API>>>
h:help
0:getmarket
1:py_board
2:py_ticker
3:py_executions
4:py_getboardstate
5:py_gethealth
6:py_getchats
end:END'''
)
if inp=='h':
sp.talk(bun_dic[inp])#音声出力、キーを投げてやると対応した文章が読み上げられる
if inp=='0':
print('0: get markets')
sp.talk(bun_dic[inp])
getmarkets()
if inp=='1':
print('1:py_board')
sp.talk(bun_dic[inp])
py_board()
if inp=='2':
print('2:py_ticker')
sp.talk(bun_dic[inp])
py_ticker('FX_BTC_JPY')
if inp=='3':
print('3:py_executions')
sp.talk(bun_dic[inp])
py_executions('FX_BTC_JPY')
if inp=='4':
print('4:py_getboardstate')
sp.talk(bun_dic[inp])
py_getboardstate('FX_BTC_JPY')
if inp=='5':
print('5:py_gethealth')
sp.talk(bun_dic[inp])
py_gethealth('FX_BTC_JPY')
if inp=='6':
print('6:py_getchats')
sp.talk(bun_dic[inp])
py_getchats('')
elif inp=='end'or inp=='END'or inp=='' or inp=='100':
print('bye--')
sp.talk(bun_dic[inp])
break
else:
pass
except KeyboardInterrupt:
pass
用意した音声ヘルプファイル
{
"h":"番号を入力してください、endと入力すると終了します",
"0":"ビットフライヤーが扱っている暗号資産の種類と取引の種類一覧を取得します",
"1":"板、約定されていない予約の一覧を表示します.数が膨大なので、件数のみ表示します",
"2":"ティッカー、現在の価格の感触を表示します",
"3":"約定一覧を表示します",
"4":"板の状態、取引所の板に関わるサーバーの状態",
"5":"取引所の状態、遅延しているかどうか",
"6":"チャットの履歴データ、膨大なので直近の一部のみ表示します",
"end":"これで終わります"
}
例
プログラムの処理の選択で”1″を入力すると”1″に対応した
“板、約定されていない予約の一覧を表示します.数が膨大なので、件数のみ表示します”
が読み上げられる。
例で挙げたプログラムはコードが長いが、読み上げに関するコード自体は短いので、かんたんに応用できると思う。
テキストファイルの準備が面倒かもしれませんが、量の多いテキストでもエクセルを使えばかんたんです。UTF-8での保存を忘れないように。

コメント