気の向くままに辿るIT/ICT/IoT
IoT・電子工作

ラズパイ3B+自作スマートスピーカーにニュース読み上げ機能追加

ホーム前へ次へ
Raspberry Piって?

ラズパイ3B+自作スマートスピーカーにニュース読み上げ機能追加

ラズパイ3B+自作スマートスピーカーにニュース読み上げ機能追加

2018/12/28

 以前、作って運用しつつもブラッシュアップ中のRaspberry Pi 3 Model B+とJuliusOpen JTalkベースの自作スマートスピーカーがあります。

 主な機能は、

 尚、ラズパイ用ACアダプタを挿したスイッチ付きコンセントでのON/OFFとは別にラズパイ用boot/reboot/shutdown物理ボタン付き。

 音声認識にJuliusを使った自作スマートスピーカーに伝言とメモの機能を実装するにあたり、マイクとスピーカーを専有してしまうOSSやALSAからPulseAudioに移行しました。

 ちなみに便利なのでラズパイだけでなく、PC/Debianにも自作スマートスピーカー機能を搭載しています。

 自ずとモニタ付きとなるPC版スマートスピーカーには、PC及びラズパイ双方のスマートスピーカー機能のデスクトップアプリとしてPyQt5/Qt Designerによる操作パネルも作成しました。

ニュース読み上げ

 今回は、これらに加え、ニュース読み上げ機能を追加してみました。

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install python3-pip
$ pip3 install feedparser
$ sudo pip3 install feedparser
$ chmod u+x get_yahoo_news.py
$ cat get_yahoo_news.py
#!/usr/bin/env python3
# coding: utf-8
 
import feedparser
import os
 
# Yahoo!都合により、2020/11/21変更
#rss_url = "https://news.yahoo.co.jp/pickup/rss.xml"
rss_url = "https://news.yahoo.co.jp/rss/topics/top-picks.xml"
 
yahoo_news_feed = feedparser.parse(rss_url)
 
title = ""
for entry in yahoo_news_feed.entries:
  title = title + " " + entry.title
 
f = open('/home/xxx/tmp/input.txt', 'w')
f.write(title)
f.close()
 
res = ""
try:
  res = os.system("open_jtalk -m /usr/share/hts-voice/mei/mei_happy.htsvoice -ow $HOME/tmp/output.wav -x /var/lib/mecab/dic/open-jtalk/naist-jdic $HOME/tmp/input.txt && aplay $HOME/tmp/output.wav && rm $HOME/tmp/output.wav")
except:
  print ("Error.")
print (res)
$

 無料のニュースAPIでめぼしいものってないな...という中、Yahoo! JAPAN デベロッパーネットワークでニュースもとれそうだった為、アプリケーションIDも取得したものの、ニュース取得クエリーがイマイチわからないなと思っていた矢先、Yahoo!ニュース RSSリストを発見。

 そうだよAPIにこだわらなくてもRSSって手もあるじゃん...。

 っていうか、リンク先にある通り、RSSならニュースソースは、めっちゃ豊富、どれにしようか悩ましいほど。

 というわけで、とりあえず、Yahoo!ニュース・トピックス - 主要RSSからタイトルを取得・加工、Open JTalkで読み上げるpythonスクリプトを作成することにしました。

 スマートスピーカーで機能させるなら、$HOME部分は、/home/xxxにしておいた方がよいかも。

 詳細はリンク先に譲りますが、もちろん、独自辞書に適切なワードを登録後、必要に応じてエンコード変換、スピーカー用自作スクリプトに追記後、Julius&スピーカー用自作スクリプトの再起動などを要します。

 メイさんトークだと記事によっては、聞き取りづらいものもありますが、とりあえず。

追記

 構成ファイル変更の反映については、systemd/systemctlならsystemd自動起動設定参照。

2018/01/18

 feedparserは、というか、pip/pip3 installは、一般ユーザーでもできますが、systemdなどで自動起動する際、自前スクリプトなどの実行においてsuしない場合、root起動となるので、その可能性があるなら、sudoなど管理者権限でインストールしておく必要があります。

 自身は、当初一般ユーザーでfeedparserを入れており、他方、ある日、.serviceファイルから自前スクリプトをsuして一般ユーザーとして呼び出していたのをsuせずにroot起動に変更しました。

 これにより、一般ユーザー環境には入っていたfeedparserが、root環境に入っていない状況となり、結果、自前スマートスピーカーでこのYahoo!ニューススクリプトを解析できず、応答しないという状況に。

 端末で実行していれば、エラーが出力され一目瞭然ですが、IoTデバイスとして実装してしまうと原因を見つけにくくなるため、要注意です。

2020/11/21

 【更新】Yahoo!ニュース「RSS」のURL変更と一部サービス終了のお知らせにより、サンプルで取得していたURLも変更となったので修正。

 最初のお知らせは、6月8日だった模様、あ、実際の変更は、8月24日(月)だった模様も今日になってラズパイスピーカーでニュースを聴いてみたら、冒頭で「URLが変更になる」といった旨の(テキストを読み上げた結果)音声が流れてきて気づいた次第。

ホーム前へ次へ