ラズパイ3で赤外線リモコンの操作

ラズパイ3で赤外線リモコンの操作

Raspberry Pi 3 で赤外線リモコン&温度センサーを試す

を参考に実践

まず
irMagician を ラズパイ3にUSB ケーブルで接続

使用するのはAndroid で使っているものでOK

irMagician の黄色LEDが点滅していれば認識している

また

ls -l /dev/ttyACM0


/dev 以下に ttyACM0 が存在していれば認識しているのを
確認できる

次に
ptyhon-pip と pyserial のインストール

curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python get-pip.py
pip install pyserial

制御プログラムを git で取得

git clone https://github.com/netbuffalo/irmcli.git
cd irmcli/

で移動してから赤外線センサーの学習

udo python irmcli.py -c

を実行したけど

  File "irmcli.py", line 15
    print "Capturing IR..."
                          ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Capturing IR...")?

となる

SyntaxError: Missing parentheses in call to ‘print’.
で検索してみると
どうやら
python3 から print の構文が変わっていて

Python3 print でシンタックスエラーになった。

によれば

Python3からはprint()で実行しないとエラーになる

とのこと

15行目の
print “Capturing IR…”

print(“Capturing IR…”)
として
実行したら

  File "irmcli.py", line 19
    print msg
            ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(msg)?

となるので

さすがに毎回変更は面倒なので

vim irmcli.py

でファイルを開き

:%s/print msg/print(msg)/g

で一度に変更

vim の置き換えについては
vim置換

を参考に

いくつか修正するところがあるので
/print ”
で検索し
print() になるように修正

  File "irmcli.py", line 113
    print ir_serial.readline().rstrip()

については

print(ir_serial.readline().rstrip())

とすると

Traceback (most recent call last):
  File "irmcli.py", line 142, in <module>
    captureIR(args.file)
  File "irmcli.py", line 16, in captureIR
    ir_serial.write("c\r\n")
  File "/home/pi/.pyenv/versions/3.6.10/lib/python3.6/site-packages/serial/serialposix.py", line 532, in write
    d = to_bytes(data)
  File "/home/pi/.pyenv/versions/3.6.10/lib/python3.6/site-packages/serial/serialutil.py", line 63, in to_bytes
    raise TypeError('unicode strings are not supported, please encode to bytes: {!r}'.format(seq))
TypeError: unicode strings are not supported, please encode to bytes: 'c\r\n'

となってしまう

irmagician ラズパイ エラー
で検索し

JSONに保存した赤外線データを使って赤外線照射したいのですが、エラーが出てできません。

によれば
python3 だと
“n,%d\r\n” % recNumberはstr型なので提示エラーになる

~.encode()とbyte型に変換するとよい
とのこと
python3 pySerial TypeError: unicode strings are not supported, please encode to bytes:

も参考にするように書いてある

少しわかりにくかったので
ser.write
で検索し

Python3でpyserialを使う

をみると
write() で
文字列の前に
b
をつければOKらしい

:%s/write(“/write(b”/g
で置き換えて実行したが
リモコンの学習ができない

仕方ないので
コードを書き換えるより
ディレクトリ単位で python 環境を構築することに

pyenv-virtualenvでディレクトリ単位のpython環境構築

ラズパイにpyenv・Python3.7.0をインストールしてpyenv-virtualenvで仮想環境の構築!

を参考に

なお pyenv-virtualenv のインストールに関しては
pyenv と pyenv-virtualenv で環境構築

を参考に

 git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv

でファイルを取得

sudo vim .bash_profile 

でファイルを開き

最終行に

eval "$(pyenv virtualenv-init -)"

を追記して保存

source ~/.bash_profile

でファイルをリロード

次に仮想環境の構築

cd irmcli/

で irmagician のディレクトリに移動

次に python 2.7.9 をインストール

pyenv install 2.7.9

しかし

ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

となる

エラーを検索

RaspberryPiにpyenvを入れて複数のPython動かすよ

を参考に

sudo apt install -y libssl1.0-dev

Debian 9 Stretchでは、libssl-devは
OpenSSL 1.1.xベースになっているので
あったlibsslを入れろとの事

再度

pyenv install 2.7.9

を実行しインストール成功

pyenv は
global なら全体のバージョンを設定

local なら
カレントディレクトリに反映となるので

pyenv local 2.7.9 

として
irmcli ディレクトリのみ
python を 2.7.9 にする

次に
仮想環境の保存と再構築のため

pyenv exec pip install wheel

で wheel をインストール

freeze コマンドで
requirements ファイルを作成し
wheel ファイルを出力

pyenv exec pip freeze > ~/pyp_list.txt
pyenv exec pip wheel --wheel-dir=~/wheelhouse -r ~/pyp_list.txt

としておく

次に

python --version

で ver 2.7.9 になっているのを確認

curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python get-pip.py
pip install pyserial
[/shell
で必要なものをインストール


vim irmcli.py

で変更した部分を元に戻しておく

元に戻したら

sudo python irmcli.py -c

で部屋のリモコンの全灯を押し学習させる

sudo python irmcli.py -s -f light_on.json

でファイルへ書き出し

リモコンの消灯を押して照明を消す

sudo python irmcli.py -p -f light_on.json

を実行すると全灯になって照明が点灯する

なお距離は2mでも動作するが
リモコンと異なり
赤外線センサーの向きなどがあっていないと
操作できないので注意

Amazon Echo でラズパイのコマンドを実行

Amazon Echo でラズパイのコマンドを実行

声で部屋の電気のON/OFFをしたい(後編:音声認識しちゃうよ)

AmazonEchoからRaspberryPiのコマンドを実行する(node-red-contrib-amazon-echo)

を参考に

ubuntu のブラウザ
今回は firefox で
http://raspberrypi.local:1880/admin/
へアクセス

すでにログインしているなら数日間は
自動ログインできる

ハンバーガーメニューから
パレットの管理をクリック

ノードを追加 をクリック

node-red-contrib-amazon-echo
で検索

node-red-contrib-amazon-echo

ノードを追加をクリック

追加をクリック

しばらくすると追加されるので
閉じるをクリック

これで入力欄に
amazon echo hub
amazon echo device
が追加される

amazon echo hub をドラッグ&ドロップ

ダブルクリックし
編集画面をだす

Port を 8111 にして
完了をクリック

次に
Amazon Echo Device をドラッグ&ドロップし
灰色の○をクリックして
Amazon Echo Hub とワイヤーをつなげる

Amazon Echo Device をダブルクリックし
設定画面で
Name に任意の名前を入力

今回は テスト として完了をクリック

これでデブロイをクリック

次に
https://alexa.amazon.co.jp/
へアクセスし

スマートホーム > デバイス > 検出
としたが
なぜか追加されない

とりあえず後にして
Node-RED のフローを作成

http://raspberrypi.local:1880/admin/
へアクセス

debug をドラッグ&ドロップすると
msg.payload となるので

これを
テスト
とワイヤーでつなぐ

なお
つなげるところを間違えたら
ワイヤーをクリックし
delete キーで消すことができる

今回はテストと
Amazon Echo Hub をつなげるときに
ワイヤーを間違えて設定したので
これを修正した

つなげることができたら
デブロイをクリック

次に
msg.payload をクリックし
デバッグアイコンをクリック

しかし反応がないため

sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8111

で設定

iptables コマンドについては
iptables – システム管理コマンドの説明 – Linux コマンド集 一覧表

を参考に
ーI オプションでルール追加
–dport は送信先ポート設定
今回は80ポートを送信先にしている
-j で行動の設定
ACCEPTなのでパケットを通している

-A はルールの追加
PREROUTING は
送信先IPをマシン自身のIPへ変換

sudo apt-get install iptables-persistent

でインストール

現在のIpv4ルールを保存しますか?
現在のIpv6ルールを保存しますか?
となるので
はい
を選択

これで

sudo reboot

で再起動後

再度
デバイスを検出すると
Royal Philips Electronics スマートデバイス
として認識された

これで
Amazon Echo に
アレクサ テスト オン
アレクサ テスト つけて
と言っても動作しない

Android の Alexa アプリで見ると
照明として認識されているので

アレクサ 照明 オン
アレクサ 照明 オフ
とすると反応した

これで反応するようにはなったので
次に
Node-RED でのラズパイコマンドを実行

機能のところにある
exec をドラッグ&ドロップ

テストから
exec までをワイヤーでつなぐ

execをダブルクリックし
コマンドに
sh /home/pi/test.sh
として
完了をクリック

デブロイをクリック

次にラズパイで

vim test.sh

でファイルを作成し

if [ $1 = "on" ]
then
    echo "ON" >> /tmp/test.txt
elif [ $1 = "off" ]
then
    echo "OFF" >> /tmp/test.txt
fi

として保存

これで
アレクサ 照明 つけて
とすると
/tmp/test.txt

ON
と書き込まれる

確認したいのなら

cat /tmp/test.txt

とすればファイルの中身を見ることができる

なお
Alexa アプリで
文字化けしていたデバイス名を
テスト
と変更すれば
アレクサ テスト つけて
でも反応するようになった

ラズパイ3で Google カレンダー取得

ラズパイ3で Google カレンダー取得

Google Calenderの予定をPython3から取得する


Raspberry PiでGoogle Calendarの予定を読み上げさせる

Google Calendarの予定に応じてRaspberryPiに処理をさせる(その1)

Raspberry PiとGoogle カレンダでGoogle Homeにゴミの日を教えてもらう


参考に

まずはセットアップ
Google Calendar APIのPython Quickstart

を参考に行う

Enable the Google Calender API
をクリック

どのプラットフォームか聞かれるので
とりあえず Desktop app にして
CREATE をクリック

認証に必要な情報がでるので
DOWNLOAD CLIENTCONFIGURATION
をクリックし
json ファイルをダウンロード

終わったら
DONE をクリック

次にダウンロードしたファイルを
ラズパイ3にコピーする

scp credentials.json  pi@192.168.1.4:/home/pi/

次にラズパイ3で必要なライブラリのインストール

sudo pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

次に認証のためのスクリプトの取得

wget https://raw.githubusercontent.com/gsuitedevs/python-samples/master/calendar/quickstart/quickstart.py

次に認証をブラウザで行うことになるので

【ラズベリーパイ(ラズパイ)】ラズパイをスピーカーにもっとも簡単に接続する方法!

を参考に
VNCで設定を行う

sudo raspi-config

5 Interfacing OPtions を選択

P3 VNC を選択

はい を選択

設定できたら
Finish を選択

./VNC-Viewer-6.20.113-Linux-x64

でVNC Viewer を起動

使い方に関しては
Raspberry Pi(ラズパイ)をSSHとVNC設定してリモート接続してみた!【Windows10】

を参考に

IPアドレスを入力

ユーザ名 pi
パスワードはログインパスワードを入力し
OK をクリック

これでリモートデスクトップが表示されるので
端末アイコンをクリック

python quickstart.py

しかし

Traceback (most recent call last):
  File "quickstart.py", line 20, in <module>
    from googleapiclient.discovery import build
ImportError: No module named googleapiclient.discovery

となってしまう

googleapis /google-api-python-client

を見ると
virtualenv が必要らしい

pip install virtualenv

でインストール

virtualenv google_calender

で仮想環境を作成

source google_calender/bin/activate

で仮想環境を有効化

pip install google-api-python-client

の後に

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

を実行したが

WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProtocolError('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))': /simple/pytz/

と同じようにでてくる

仕方がないので
ラズパイ3での認証はやめて
Ubuntu で認証することに

Google Calenderの予定をPython3から取得する

を参考に

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

で必要なライブラリのインストール

Enable the Google Calender API をクリックし
API Console をクリック

これで API の設定画面になるので
OAuth 2.0 クライアントIDの
ダウンロードアイコンをクリックし
ダウンロードしたファイルを
credentials.json
へ変更

あとは

vim quickstart.py

でファイルを作成

from __future__ import print_function
import datetime
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/calendar.readonly']

def main():
    """Shows basic usage of the Google Calendar API.
    Prints the start and name of the next 10 events on the user's calendar.
    """
    creds = None
    # The file token.pickle stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server()
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('calendar', 'v3', credentials=creds)

    # Call the Calendar API
    now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time
    print('Getting the upcoming 10 events')
    events_result = service.events().list(calendarId='primary', timeMin=now,
                                        maxResults=10, singleEvents=True,
                                        orderBy='startTime').execute()
    events = events_result.get('items', [])

    if not events:
        print('No upcoming events found.')
    for event in events:
        start = event['start'].get('dateTime', event['start'].get('date'))
        print(start, event['summary'])

if __name__ == '__main__':
    main()

で保存

python quickstart.py 

を実行すると認証画面になる

最後のほうで
このアプリは 確認されていません
とでるが

https://eguweb.jp/gas/this-application-has-not-been-confirmed
を参考に
承認作業を行えばOK

これで
token.pickle
が作成されるので

Google カレンダーに予定を追加し

python quickstart.py 

を実行すると
最新10件まで Google カレンダーの予定を取得できる

あとは
token.pickle
credentials.json
をラズパイ3へ scp で転送する

scp token.pickle pi@192.168.1.4:/home/pi/
scp credentials.json  pi@192.168.1.4:/home/pi/

次に
天気予報情報・Googleカレンダーの予定をpythonで取得する方法 on Raspberry Pi/Mac

を参考に
ラズパイ3で

wget https://raw.githubusercontent.com/karaage0703/karaage-echo/master/get_gcal_schedule.py

でファイルを取得

python get_gcal_schedule.py

を実行したけど

Traceback (most recent call last):
  File "get_gcal_schedule.py", line 7, in <module>
    from oauth2client import client
ModuleNotFoundError: No module named 'oauth2client'

となるので
raspberry piでGoogleカレンダー取得スクリプトのセットアップ

を参考に

sudo pip install --upgrade oauth2client --ignore-installed six 

でインストール後

再度実行しても

/home/pi/.pyenv/versions/3.6.10/lib/python3.6/site-packages/oauth2client/_helpers.py:255: UserWarning: Cannot access /home/pi/.credentials/calendar-python-quickstart.json: No such file or directory
  warnings.warn(_MISSING_FILE_MESSAGE.format(filename))
Traceback (most recent call last):
  File "/home/pi/.pyenv/versions/3.6.10/lib/python3.6/site-packages/oauth2client/clientsecrets.py", line 121, in _loadfile
    with open(filename, 'r') as fp:
FileNotFoundError: [Errno 2] No such file or directory: 'client_secret.json'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "get_gcal_schedule.py", line 91, in <module>
    get_schedule()
  File "get_gcal_schedule.py", line 60, in get_schedule
    credentials = get_credentials()
  File "get_gcal_schedule.py", line 45, in get_credentials
    flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
  File "/home/pi/.pyenv/versions/3.6.10/lib/python3.6/site-packages/oauth2client/_helpers.py", line 133, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "/home/pi/.pyenv/versions/3.6.10/lib/python3.6/site-packages/oauth2client/client.py", line 2135, in flow_from_clientsecrets
    cache=cache)
  File "/home/pi/.pyenv/versions/3.6.10/lib/python3.6/site-packages/oauth2client/clientsecrets.py", line 165, in loadfile
    return _loadfile(filename)
  File "/home/pi/.pyenv/versions/3.6.10/lib/python3.6/site-packages/oauth2client/clientsecrets.py", line 125, in _loadfile
    exc.strerror, exc.errno)
oauth2client.clientsecrets.InvalidClientSecretsError: ('Error opening file', 'cl

となる

このため
一度 ubuntu で
google_calender ディレクトリを作成し
ここで作業

別ディレクトリを作成したのは
quickstart.py がすでにあるので
別のファイルを作りたいため

vim quickstart.py

でファイルを作成

from __future__ import print_function
import httplib2
import os

from apiclient import discovery
from oauth2client import client
from oauth2client import tools
from oauth2client.file import Storage

import datetime

try:
    import argparse
    flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
    flags = None

# If modifying these scopes, delete your previously saved credentials
# at ~/.credentials/calendar-python-quickstart.json
SCOPES = 'https://www.googleapis.com/auth/calendar.readonly'
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'Google Calendar API Python Quickstart'


def get_credentials():
    """Gets valid user credentials from storage.

    If nothing has been stored, or if the stored credentials are invalid,
    the OAuth2 flow is completed to obtain the new credentials.

    Returns:
        Credentials, the obtained credential.
    """
    home_dir = os.path.expanduser('~')
    credential_dir = os.path.join(home_dir, '.credentials')
    if not os.path.exists(credential_dir):
        os.makedirs(credential_dir)
    credential_path = os.path.join(credential_dir,
                                   'calendar-python-quickstart.json')

    store = Storage(credential_path)
    credentials = store.get()
    if not credentials or credentials.invalid:
        flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
        flow.user_agent = APPLICATION_NAME
        if flags:
            credentials = tools.run_flow(flow, store, flags)
        else: # Needed only for compatibility with Python 2.6
            credentials = tools.run(flow, store)
        print('Storing credentials to ' + credential_path)
    return credentials

def main():
    """Shows basic usage of the Google Calendar API.

    Creates a Google Calendar API service object and outputs a list of the next
    10 events on the user's calendar.
    """
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    service = discovery.build('calendar', 'v3', http=http)

    now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time
    print('Getting the upcoming 10 events')
    eventsResult = service.events().list(
        calendarId='primary', timeMin=now, maxResults=10, singleEvents=True,
        orderBy='startTime').execute()
    events = eventsResult.get('items', [])

    if not events:
        print('No upcoming events found.')
    for event in events:
        start = event['start'].get('dateTime', event['start'].get('date'))
        print(start, event['summary'])


if __name__ == '__main__':

で保存し

cp ../ダウンロード/client_secret_354559203980-pd3t3vum75cc19ihvj6pgttqasf8npbd.apps.googleusercontent.com.json client_secret.json

でダウンロードしたファイルを
client_secret.json
として保存

あとは

python quickstart.py

を実行すればブラウザが立ち上がり認証画面になる

詳細をクリックし

Project Default Service Account(安全ではないページ)に移動
をクリック

許可をクリック

許可をクリック

これで ubuntu で
calendar-python-quickstart.json
が生成されるので

scp /home/snowpool/.credentials/calendar-python-quickstart.json    pi@192.168.1.4:/home/pi/.credentials/


ラズパイ3のディレクトリにコピー

これでラズパイ3で再度

python get_gcal_schedule.py

を実行すれば

get_gcal_schedule.pyが正常に動作する

あとは予定の読み上げ

Raspberry PiでGoogle Calendarの予定を読み上げさせる

では

python get_gcal_schedule.py | aquestalkpi/AquestalkPi -f - | aplay #pythonの出力結果をaquestalkpiにパイプし、それをさらに、aplayにパイプ

で読み上げていた

aquestalkpi は個人で非営利なら無料らしい
オプションなどについては
それ、ラズパイでつくれるよ——日本語を喋らせる

を参考に
-f オプションで
読み上げるテキストファイルを指定している

sudo bluetoothctl 
connect 6C:56:97:3A:52:98

を実行し Amazon Echo へ接続

ctrl + d で抜けて

jtalk.sh

でファイルを作成し

#!/bin/bash
tempfile=`tempfile`
#option="-m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice \
option="-m /usr/share/hts-voice/mei/mei_normal.htsvoice \
-x /var/lib/mecab/dic/open-jtalk/naist-jdic 
-ow $tempfile"
#echo "$1" | open_jtalk $option
python get_gcal_schedule.py | open_jtalk $option
#aplay -q $tempfile
aplay  -D bluealsa $tempfile
rm $tempfile

として保存

./jtalk.sh

を実行すれば
予定があれば読み上げ
ないのなら
今日の予定はありません
と Amazon Echo で音声が流れるようになる

ラズパイ3 Node-RED セットアップ

ラズパイ3 Node-RED セットアップ

Raspberry PiにおけるNode-REDの活用について

AmazonEcho (Alexa) と RaspberryPi を連携して声だけでPS4を操作する

Amazon EchoをRaspberry Piのワイヤレス音声認識マイク&スピーカとしてミクさんの声で喋らせたり家電制御(リモコン制御)する方法

を参考に
Node-RED を導入

wget https://git.io/noderedlinux

でインストールスクリプトダウンロード

bash noderedlinux

を実行

This script will remove versions of Node.js prior to version 7.x, and Node-RED and
if necessary replace them with Node.js 12.x LTS (erbium) and the latest Node-RED from Npm.
 
It also moves any Node-RED nodes that are globally installed into your user
~/.node-red/node_modules directory, and adds them to your package.json, so that
you can manage them with the palette manager.
 
It also tries to run 'npm rebuild' to refresh any extra nodes you have installed
that may have a native binary component. While this normally works ok, you need
to check that it succeeds for your combination of installed nodes.
 
To do all this it runs commands as root - please satisfy yourself that this will
not damage your Pi, or otherwise compromise your configuration.
If in doubt please backup your SD card first.
 
Are you really sure you want to do this ? [y/N] ? 

となるので
y で Enter

Would you like to install the Pi-specific nodes ? [y/N] ? 


y で Enter

なお N にすると
標準的な Node-RED となる
もし N にしても再度

bash noderedlinux

を実行すれば選択できる

次に Node-RED の起動

node-red-start 

これで
/home/pi/.node-red/
配下に各種設定ファイルが導入される

Node-RED の停止は
Ctrl + c でログ出力を止めて

node-red-stop 

で停止

ログの確認は

node-red-log

でできる

ログは tail形式で最新のログを順次表示するので
ctrl +c で停止できる

なお自動起動には
systemd スクリプトで設定をする

sudo systemctl enable nodered.service

で自動起動

自動起動解除は

sudo systemctl disable nodered.service

自動起動状態の確認は

sudo systemctl status nodered.service

なおNode-REDの設定を変更した場合

node-red-restart

で再起動する必要がある

次にFlow Editor のログインの画面の設定

Raspberry Pi上のNode-REDにパスワードを設定するスクリプト

を参考に

wget https://git.io/nrpiadminpass.sh

でスクリプト取得

bash nrpiadminpass.sh 任意のパスワード

でパスワードを設定

その後

node-red-restart 

で設定を反映

これで
Ubuntu で
Firefox や Chrome などで
http://raspberrypi.local:1880/
へアクセスすると
ログイン画面になるので
ユーザ名 admin
パスワードは設定したパスワード
でログインできるようになる

次に FlowEditor のURL変更

vim .node-red/settings.js

で設定を開き
94行目の

 //httpAdminRoot: '/admin',

 httpAdminRoot: '/admin',

というようにコメントアウトを削除

その後

node-red-restart 

で設定を反映

これで
http://raspberrypi.local:1880/admin/
へアクセスすると
ログイン画面になる

これで Node-RED のセットはできたので
次回は Node-RED Alexa Home Skill Bridge の設定

ラズパイ3にOpenJTalk インストール

ラズパイ3にOpenJTalk インストール

ラズパイ3に喋らせるため
OpenJTalk をインストール

「ラズパイ、音楽かけて」でRaspberry Piにmp3を再生させる


【Raspberry Pi】指定時間にゴミの収集日を音声でお知らせする方法[Open Jtalk+cron]

を参考に

sudo apt-get update

でリポジトリ更新

sudo apt-get install -y open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001

これでインストールして

MMDagent で女性音声の追加

wget --no-check-certificate https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip

wget –no-check-certificate
とすると
SSLのついたサイトへアクセスできる

wgetでこういう時はこうする!!

にオプションについて載っているので参考に

unzip MMDAgent_Example-1.7.zip

で解凍

sudo cp -R ./MMDAgent_Example-1.7/Voice/mei /usr/share/hts-voice/

cp コマンドの -R オプションを調べてみる

意味は
コピー元にディレクトリを指定した場合
再帰的に(サブディレクトリも含めて)コピーする

【 cp 】コマンド――ファイルをコピーする

を参考に

あとはテスト

echo "はじめまして、ラズベリーパイです" | \
open_jtalk -m /usr/share/hts-voice/mei/mei_normal.htsvoice \
-x /var/lib/mecab/dic/open-jtalk/naist-jdic \
-ow voice.wav 

で音声ファイルを作成し

sudo bluetoothctl 
connect 6C:56:97:3A:52:98

を実行し Amazon Echo へ接続

ctrl + d で抜けて

aplay -D bluealsa voice.wav

で喋らせる

これで
はじめまして、ラズベリーパイです
と Amazon Echo から声がでる

もしくは

vim jtalk.sh 

を作成

#!/bin/bash
tempfile=`tempfile`
option="-m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice \
-x /var/lib/mecab/dic/open-jtalk/naist-jdic \
-r 0.7 \
-ow $tempfile"
echo "$1" | open_jtalk $option
#aplay -q $tempfile
aplay  -D bluealsa $tempfile
rm $tempfile

として保存

./jtalk.sh "こんにちは。音声テストです。"

というように
スクリプトの後に”” で囲んでテキストを入力し
それを喋らせる

もともとは
-q オプションででメッセージを表示しないようにする予定だが
音声がでないため
-D オプションで bluealsa を指定するようにしたら
男性の声で
こんにちは。音声テストです
と音声がでるようになった

aplay のオプションについては
aplayのヘルプ/オプション

を参考に

また OpenJTalk のオプションで
-r オプションによりしゃべる速度をコントロールできる

-r 0.7
だとちょっとゆっくりになる

OpenJTalk のオプションについては
Ubuntu Open JTalk その2 – open_jtalkコマンドの説明

を参考に

よく使うものとしては
-m で音声データ指定

-ow で保存するwavファイルの指定

あと
テキストファイルを用意して
OpenJTalk で音声ファイルを作成し
aplay で再生することもできる

vim test.txt

でファイルを作成

今日の予定はイオンで買い物

というように適当に入力し保存

open_jtalk  -m /usr/share/hts-voice/mei/mei_normal.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic -ow text.wav test.txt

で音声ファイルを作成

aplay -D bluealsa text.wav

とすれば
今日の予定はイオンで買い物
と音声がでる

テキストの音声変換に関しては
テキストを音声データに変換してロボットに喋らせる。

も参考に

ラズパイ3に pyaudio インストール

ラズパイ3に pyaudio インストール

sudo pip install pyaudio

を実行すると

Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting pyaudio
  Downloading https://files.pythonhosted.org/packages/ab/42/b4f04721c5c5bfc196ce156b3c768998ef8c0ae3654ed29ea5020c749a6b/PyAudio-0.2.11.tar.gz
Building wheels for collected packages: pyaudio
  Running setup.py bdist_wheel for pyaudio ... error
  Complete output from command /usr/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-q8X_DO/pyaudio/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" bdist_wheel -d /tmp/pip-wheel-DpglbX --python-tag cp27:
  running bdist_wheel
  running build
  running build_py
  creating build
  creating build/lib.linux-armv7l-2.7
  copying src/pyaudio.py -> build/lib.linux-armv7l-2.7
  running build_ext
  building '_portaudio' extension
  creating build/temp.linux-armv7l-2.7
  creating build/temp.linux-armv7l-2.7/src
  arm-linux-gnueabihf-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -Wdate-time -D_FORTIFY_SOURCE=2 -g -fdebug-prefix-map=/build/python2.7-InigCj/python2.7-2.7.16=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -I/usr/include/python2.7 -c src/_portaudiomodule.c -o build/temp.linux-armv7l-2.7/src/_portaudiomodule.o
  src/_portaudiomodule.c:29:10: fatal error: portaudio.h: そのようなファイルやディレクトリはありません
   #include "portaudio.h"
            ^~~~~~~~~~~~~
  compilation terminated.
  error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
  
  ----------------------------------------
  Failed building wheel for pyaudio
  Running setup.py clean for pyaudio
Failed to build pyaudio
Installing collected packages: pyaudio
  Running setup.py install for pyaudio ... error
    Complete output from command /usr/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-q8X_DO/pyaudio/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-POjPm0/install-record.txt --single-version-externally-managed --compile:
    running install
    running build
    running build_py
    creating build
    creating build/lib.linux-armv7l-2.7
    copying src/pyaudio.py -> build/lib.linux-armv7l-2.7
    running build_ext
    building '_portaudio' extension
    creating build/temp.linux-armv7l-2.7
    creating build/temp.linux-armv7l-2.7/src
    arm-linux-gnueabihf-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -Wdate-time -D_FORTIFY_SOURCE=2 -g -fdebug-prefix-map=/build/python2.7-InigCj/python2.7-2.7.16=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -I/usr/include/python2.7 -c src/_portaudiomodule.c -o build/temp.linux-armv7l-2.7/src/_portaudiomodule.o
    src/_portaudiomodule.c:29:10: fatal error: portaudio.h: そのようなファイルやディレクトリはありません
     #include "portaudio.h"
              ^~~~~~~~~~~~~
    compilation terminated.
    error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
    
    ----------------------------------------
Command "/usr/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-q8X_DO/pyaudio/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-POjPm0/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-install-q8X_DO/pyaudio/

というエラーがでる

CentOSにPyenvをインストールしてPython3の開発環境を構築する

を参考に

pip list

を実行すると

Package    Version
---------- -------
pip        18.1   
setuptools 40.6.2 
You are using pip version 18.1, however version 20.2b1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

となり
バージョンが古いらしい

pip install --upgrade pip

でアップデート

再度実行してもエラーになるので

sudo python --version

としたら

Python 2.7.16

となっていたので

 sudo pyenv global 3.6.10

としたところ

sudo: pyenv: コマンドが見つかりません

となってしまうので

PyenvによるPython3.x環境構築(CentOS, Ubuntu)

を参考に

sudo visudo

でファイルを編集する

なお nano エディタで操作することになるので
使い方に関しては
GNU nanoを使いこなす

を参考に

Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

の部分を

#Defaults       secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults        env_keep += "PATH"
Defaults        env_keep += "PYENV_ROOT"

として
ctrl + s で上書き保存し
ctrl + x で終了

これで

sudo pyenv global 3.6.10

とすれば

sudo python --version

を実行したときに

Python 3.6.10

と変更されるようになった

次に

sudo pip install pyaudio

を実行してみたが

Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting pyaudio
  Downloading PyAudio-0.2.11.tar.gz (37 kB)
Using legacy setup.py install for pyaudio, since package 'wheel' is not installed.
Installing collected packages: pyaudio
    Running setup.py install for pyaudio ... error
    ERROR: Command errored out with exit status 1:
     command: /home/pi/.pyenv/versions/3.6.10/bin/python3.6 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-_p6von58/pyaudio/setup.py'"'"'; __file__='"'"'/tmp/pip-install-_p6von58/pyaudio/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-eikj46h2/install-record.txt --single-version-externally-managed --compile --install-headers /home/pi/.pyenv/versions/3.6.10/include/python3.6m/pyaudio
         cwd: /tmp/pip-install-_p6von58/pyaudio/
    Complete output (16 lines):
    running install
    running build
    running build_py
    creating build
    creating build/lib.linux-armv7l-3.6
    copying src/pyaudio.py -> build/lib.linux-armv7l-3.6
    running build_ext
    building '_portaudio' extension
    creating build/temp.linux-armv7l-3.6
    creating build/temp.linux-armv7l-3.6/src
    gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/home/pi/.pyenv/versions/3.6.10/include/python3.6m -c src/_portaudiomodule.c -o build/temp.linux-armv7l-3.6/src/_portaudiomodule.o
    src/_portaudiomodule.c:29:10: fatal error: portaudio.h: そのようなファイルやディレクトリはありません
     #include "portaudio.h"
              ^~~~~~~~~~~~~
    compilation terminated.
    error: command 'gcc' failed with exit status 1
    ----------------------------------------
ERROR: Command errored out with exit status 1: /home/pi/.pyenv/versions/3.6.10/bin/python3.6 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-_p6von58/pyaudio/setup.py'"'"'; __file__='"'"'/tmp/pip-install-_p6von58/pyaudio/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-eikj46h2/install-record.txt --single-version-externally-managed --compile --install-headers /home/pi/.pyenv/versions/3.6.10/include/python3.6m/pyaudio Check the logs for full command output.

となってしまう

このため

Pip install PyAudio

を参考に

sudo apt-get install python-dev portaudio19-dev

でパッケージをインストールし

sudo pip install pyaudio

でインストール

sudo bluetoothctl 
connect 6C:56:97:3A:52:98

を実行し Amazon Echo へ接続

ctrl + d で抜けて

vim test.py

でファイルを作成

import wave
import pyaudio

def play(wav_file):

    try:
        wf = wave.open(wav_file, "rb")

    except FileNotFoundError:
        print("No such file " + wav_file)
        return

    p = pyaudio.PyAudio()

    ## Bluetoothスピーカーの情報を取得
    for device_index in range(p.get_device_count()):
        device = p.get_device_info_by_index(device_index)
        if device["name"] == "bluealsa":
            bluetooth_device = device_index

    ## Bluetoothスピーカーを指定してストリームオープン
    stream = p.open(
        format=p.get_format_from_width(wf.getsampwidth()),
        channels=wf.getnchannels(),
        rate=wf.getframerate(),
        output=True,
        output_device_index=bluetooth_device
    )

    # 再生
    chunk_size = 1024
    data = wf.readframes(chunk_size)

    while len(data) > 0:
        stream.write(data)
        data = wf.readframes(chunk_size)

    stream.stop_stream()
    stream.close()
    p.terminate()


if __name__ == "__main__":

    play("/usr/share/sounds/alsa/Front_Center.wav")

として保存

音声再生サンプルコードは
Amazon EchoをRaspberry PiのBluetoothスピーカーとして利用する

のものを使わせていただきました

あとは

python test.py 

を実行し
Amazon Echo から
フロント センター
と聞こえれば
python による音声出力ができることが確認できる

ラズパイ3へ pyenv インストール

ラズパイ3へ pyenv インストール

Raspberry PiにpyenvをインストールしてPythonをバージョン管理

を参考に
pyenv をインストール

これができれば
Amazon EchoをRaspberry PiのBluetoothスピーカーとして利用する

を参考に
pyaudioモジュールを使うことで
Pythonで Amazon Echo に音声出力できる

なお、コマンドの実行結果が最新OSの場合異なっている

uname -a

結果

Linux raspberrypi 4.19.118-v7+ #1311 SMP Mon Apr 27 14:21:24 BST 2020 armv7l GNU/Linux
lsb_release -a

結果

No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 10 (buster)
Release:	10
Codename:	buster

lsb_release コマンドは
ディストーションのバージョンを確認するコマンド

詳しくは
ディストリビューションのバージョンなどを確認する・lsb_releaseコマンド †

を参考に

まず必要なパッケージのインストール

sudo apt update
sudo apt upgrade
sudo apt install -y git openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev

次に Github から pyenv を取得

git clone https://github.com/yyuu/pyenv.git ~/.pyenv

次にパスを通す

sudo vim ~/.bash_profile

でファイルを作成し開く

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

を追記して保存

設定反映のため

source ~/.bash_profile

で再読み込み

bashrc と bash_profile の違いについては
.bash_profileと.bashrcのまとめ

を参考に

.bash_profile
ログイン時に実行される
環境変数を設定

.bashrc
シェル起動時に実行される
エイリアス
シェル関数
コマンドラインの補完
を設定

なお
source コマンドは
ファイルに書かれた内容を実行するコマンド

これについては
Linux — source コマンドは何をしているのか > 実は環境をリロードするためのものではない

を参考に

pyenv のインストールができているなら

pyenv --version

でバージョンを表示できる

今回は

pyenv 1.2.18-19-gcf81e5a0

という結果になった

pyenv install --list

でインストールできるバージョンの一覧が表示される

今回は 3.6.10をインストール

これは
Amazon EchoをRaspberry PiのBluetoothスピーカーとして利用する

で使用しているバージョンが 3.6.10
であるのと
pyaudio モジュールが3.7 でインストールできない可能性があるため

現状だと

python --version

の結果が

Python 2.7.16
python3 --version

の結果が

Python 3.7.3

となっている

pyenv install 3.6.10

でインストール

pyenv global 3.6.10

でバージョンを変更

もし元に戻したいのなら

pyenv global system

とすればOK

ラズパイ3B+マイクとスピーカー設定その2

ラズパイ3B+マイクとスピーカー設定その2

Amazon echo Dot をスピーカーに設定できたので
次にマイクの設定

今回は以前購入したものを利用

ラズパイ3にはマイクを差し込むところがないため
USBオーディオ変換アダプタを使用

なお mic 側にマイクを差し込まないと認識しなかった

USBで接続したら

arecord -l

を実行

**** ハードウェアデバイス CAPTURE のリスト ****
カード 1: Device [USB PnP Sound Device], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

となり
このときのサブデバイス番号を覚えておく

arecord -D plughw:1 myvoice.wav

で録音開始

ctrl + c を押すまで録音される

^Cシグナル 割り込み で中断...
arecord: pcm_read:2145: 読込エラー: システムコール割り込み

となるが録音はされる

次に

aplay -D bluealsa myvoice.wav

を実行すれば録音した声が聞こえる

ただし、今回利用したパーツだとノイズが入っている

ラズパイ3B+マイクとスピーカー設定その1

ラズパイ3B+マイクとスピーカー設定その1

Raspberry PiでBluetoothスピーカーを鳴らす

Amazon EchoをRaspberry PiのBluetoothスピーカーとして利用する

を参考に

buetooth スピーカをラズパイ3B+で使えるようにする

まず
ラズパイと Bluetooth デバイスのペアリング

sudo bluetoothctl 

を実行

scan on

を実行すると

[CHG] Device D4:6D:6D:F5:A0:D1 UUIDs: 0000110e-0000-1000-8000-00805f9b34fb
[CHG] Device D4:6D:6D:F5:A0:D1 UUIDs: 0000111f-0000-1000-8000-00805f9b34fb
[CHG] Device D4:6D:6D:F5:A0:D1 UUIDs: 0000111e-0000-1000-8000-00805f9b34fb
[CHG] Device 77:9E:22:C9:6D:10 RSSI: -60
[CHG] Device 84:C7:EA:4A:F1:35 RSSI: -42
[CHG] Device 4A:7E:3E:79:A0:E3 RSSI: -81
[CHG] Device 4A:7E:3E:79:A0:E3 RSSI: -53
[CHG] Device 77:9E:22:C9:6D:10 RSSI: -46
[NEW] Device 8C:DE:52:16:70:48 SRS-BTV5
[CHG] Device 4A:7E:3E:79:A0:E3 RSSI: -63
[CHG] Device 8C:DE:52:16:70:48 RSSI: -51
[CHG] Device 84:C7:EA:4A:F1:35 RSSI: -56

というようにリストが表示される

なお

scan off

を実行するまでずっと流れるので注意

今回使用したのは
SRS-BTV5

trust 8C:DE:52:16:70:48

で信頼し

pair 8C:DE:52:16:70:48

でペアリング

connect 8C:DE:52:16:70:48

で接続

接続したら

quit

で元のシェルに戻す

なお接続を切りたいときには

sudo bluetoothctl

のあとに

disconnect

で接続を切ることができる

このあたりに関しては
Linux のコマンドラインで Bluetooth 接続

を参考に

次に

aplay -D bluealsa /usr/share/sounds/alsa/Front_Center.wav

を実行したが

ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'defaults.bluealsa.device'
ALSA lib conf.c:4568:(_snd_config_evaluate) function snd_func_refer returned error: そのようなファイルやディレクトリはありません
ALSA lib conf.c:5036:(snd_config_expand) Args evaluate error: そのようなファイルやディレクトリはありません
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM bluealsa
aplay: main:828: audio open error: そのようなファイルやディレクトリはありません

となってしまう

Raspberry piでbluetoothスピーカーを鳴らす

も参考に

sudo apt-get install pulseaudio pulseaudio-module-bluetooth

を実行し

paplay /usr/share/sounds/alsa/Front_Center.wav 

を実行したが

接続失敗: 接続拒否
pa_context_connect() は失敗: 接続拒否

となってしまう

このため
【ラズベリーパイ(ラズパイ)】ラズパイをスピーカーにもっとも簡単に接続する方法!

を参考に
VNCで設定を行う

sudo raspi-config

5 Interfacing OPtions を選択

P3 VNC を選択

はい を選択

設定できたら
Finish を選択

次に ubuntu で
https://www.realvnc.com/en/connect/download/viewer/
から

VNC Viewer
をダウンロード

cd ダウンロード/
chmod +x VNC-Viewer-6.20.113-Linux-x64

でダウンロードしたファイルに実行権限を付与

./VNC-Viewer-6.20.113-Linux-x64

で起動

使い方に関しては
Raspberry Pi(ラズパイ)をSSHとVNC設定してリモート接続してみた!【Windows10】

を参考に

IPアドレスを入力

ユーザ名 pi
パスワードはログインパスワードを入力し
OK をクリック

これでリモートデスクトップが表示される

これで音のアイコンを右クリック
Audio Outputs で
SRS-BTV5 を選んでみたが音がでない

このため
Amazon EchoをRaspberry PiのBluetoothスピーカーとして利用する

を参考に
別のもので実験

sudo bluetoothctl

の後に

scan on

で接続可能なものを探す

次に Amazon Echo で
アレクサ ペアリングして
と話かけると

Discovery started
[CHG] Controller B8:27:EB:A2:F7:30 Discovering: yes
[NEW] Device 70:25:8C:8F:5D:67 70-25-8C-8F-5D-67
[NEW] Device 55:DD:D8:56:3D:73 55-DD-D8-56-3D-73
[NEW] Device D4:6D:6D:F5:A0:D1 DESKTOP-SBDOP9H
[CHG] Device 70:25:8C:8F:5D:67 RSSI: -42
[CHG] Device 55:DD:D8:56:3D:73 RSSI: -76
[CHG] Device 55:DD:D8:56:3D:73 RSSI: -54
[NEW] Device 6C:56:97:3A:52:98 6C-56-97-3A-52-98
[CHG] Device 6C:56:97:3A:52:98 Name: Echo Dot-070
[CHG] Device 6C:56:97:3A:52:98 Alias: Echo Dot-070

というようにリストに表示されるので

scan off

でスキャン停止

trust 6C:56:97:3A:52:98

で信頼

pair 6C:56:97:3A:52:98

でペアリング

connect 6C:56:97:3A:52:98

で接続

しかし

aplay -D bluealsa /usr/share/sounds/alsa/Front_Center.wav

を実行しても

ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'defaults.bluealsa.device'
ALSA lib conf.c:4568:(_snd_config_evaluate) function snd_func_refer returned error: そのようなファイルやディレクトリはありません
ALSA lib conf.c:5036:(snd_config_expand) Args evaluate error: そのようなファイルやディレクトリはありません
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM bluealsa
aplay: main:828: audio open error: そのようなファイルやディレクトリはありません
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'defaults.bluealsa.device'
ALSA lib conf.c:4568:(_snd_config_evaluate) function snd_func_refer returned error: そのようなファイルやディレクトリはありません
ALSA lib conf.c:5036:(snd_config_expand) Args evaluate error: そのようなファイルやディレクトリはありません
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM bluealsa
aplay: main:828: audio open error: そのようなファイルやディレクトリはありません

となってしまう

次に
Raspberry PiでBluetoothスピーカーを鳴らす

を参考に

sudo apt install mplayer

次に
Raspberry Piで音声認識

を参考に

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install alsa-utils sox libsox-fmt-all

としたものの変わらず

vim .asoundrc 

でファイルをひらき

defaults.bluealsa.interface "hci0"
defaults.bluealsa.device "6C:56:97:3A:52:98"
defaults.bluealsa.profile "a2dp"
defaults.bluealsa.delay 10000

pcm.bt-receiver {
  type bluealsa
  device "6C:56:97:3A:52:98"
  profile "a2dp"
}

を最終行に追記

mplayer -ao alsa:device=bt-receiver /usr/share/sounds/alsa/Front_Center.wav

を実行することで
フロント センター
とAmazon Echo から聞こえるようになった

どうやら

aplay -D bluealsa /usr/share/sounds/alsa/Front_Center.wav

の実行の前に
.asoundrc へ
bluetooth の設定を書いておかないと
エラーがでるらしい

ほかにも再生できるか実験

mplayer -ao alsa:device=bt-receiver -playlist http://www.simulradio.info/asx/fmpalulun.asx

とすれば
サイマルラジオが
Amazon Echo から流れるようになる

止めるときには ctrl + c でOK

これで bluetooth スピーカーはできたので
次にマイクの設定を行う

なお、再起動などでAamazon Echo との接続が切れたら

sudo bluetoothctl
connect 6C:56:97:3A:52:98

というように
connect のときに Amazon Echoを指定すればOK

ラズパイ3B+の設定

ラズパイ3B+の設定

Raspberry Pi 4用インストールメディアを作成する

を参考に
まずはインストールメディアの作成
https://www.raspberrypi.org/downloads/
へアクセスし

NOOBS をクリック

NOOBS Lite の
Download ZIP
をクリック

Lite と通常の違いは
OSが最初からインストールされているかということ

Lite の場合ネット経由でインストールするので
最初から複数のOSが要らなかったり
ネットが使って最小限の実験にするなら
Lite で十分そう

ダウンロードできたら
unzip コマンドで microSD へ解凍

-d オプションを使うことでディレクトリを指定し解凍ができる

unzipでディレクトリを指定して解凍

を参考に

unzip NOOBS_lite_v3_3.zip -d /media/snowpool/4A54-50FD/

で解凍

これでインストールメディアの作成は終わり

あとは
Raspberry Pi 4へOSをインストールする(Raspbian編)

を参考にインストール

インストールするときに
通常のインストール以外に
Lite
Full
があるけど
Lite にするとデスクトップ環境がない

Lite と通常版の詳しい違いに関しては
Raspbian通常版とRaspbianLiteの違いをわかりやすく解説!

を参考に

通常版と Full の違いは
デスクトップ環境で使えるアプリの量

詳しくは
新しいRaspbian Stretchに収録されているアプリケーション比較

を参考に

今回は
bluetooth
Wi-Fi
のあたりを使うので
通常版で実験

インストールが終われば
あとはSSH を有効にして
あとはリモート操作できるので
まずはSSHの設定

sudo raspi-config

で設定画面をだす

5 Interfacing Options を選択

P2 SSH を選択

はい を選択

設定が終わったら
Finish で設定画面を抜けることができる

これでSSHは有効化されるので
続いて公開鍵認証にする

Raspberry Pi 初期設定

を参考に

Ubuntu で ssh-keygenコマンドで作成

このコマンドについては
【 ssh-keygen 】コマンド――SSHの公開鍵と秘密鍵を作成する

を参考に

-t で暗号形式を rsa
-b で4096ビットに指定
なおデフォルトでは2048ビット

ssh-keygen -t rsa -b 4096

で作成

Enter file in which to save the key (/home/snowpool/.ssh/id_rsa): 

となったらファイル名を入力

今回は raspi
としておく

パスフレーズは省略するので

Enter passphrase (empty for no passphrase): 

Enter same passphrase again: 


Enter にすればパスフレーズなしとなる

次に公開鍵の登録

これは
ssh-copy-id コマンドを使う

詳しくは
【 ssh-copy-id 】コマンド――SSHの公開鍵を登録する

を参考に

ssh-copy-id -i raspi.pub pi@192.168.1.4

で登録

パスワードを求められるので
pi ユーザのものを入力
なお @ のあとのIPアドレスは
ラズパイ3のアドレス

なぜか ubuntu 16.04 の場合
.ssh ではなく
カレントディレクトリに鍵ファイルなどが生成されるので

mv raspi* .ssh/

で移動しておいた

あとは

ssh -i .ssh/raspi pi@192.168.1.4

で接続

接続できたら
次に vim の設定

raspberry pi : Vim インストール

を参考に

dpkg -l |grep vim

を実行すると

ii  vim-common                             2:8.1.0875-5                        all          Vi IMproved - Common files
ii  vim-tiny                               2:8.1.0875-5                        armhf        Vi IMproved - enhanced vi editor - compact version

となり
vim-tiny がインストールされているのがわかる

Vim の種類 (Vim family)

によれば最小構成の vim ということで機能が減っている

これはラズパイの容量のためもあると思うけど

sudo apt-get --purge remove vim-common vim-tiny

でアンインストールし

sudo apt-get install vim

で通常版 vim をインストール

設定ファイルをつくるので

vim .vimrc

でファイルを作成

"クリップボードからのコピペを可能にする
set clipboard+=unnamed
" シンタックスハイライトの有効化
syntax enable
" 不可視文字を可視化(タブが「▸-」と表示される)
set list listchars=tab:\▸\-
" コマンドラインの補完
set wildmode=list:longest

を記述し保存

vimrc の内容については
何も考えず~/.vimrcにこれを書くんだ! 〜vim初心者によるvim初心者のためのvim入門〜

を参考に

なお sudo 権限で vim を使うと設定が反映されていないので

sudo ln -s ~/.vimrc /root/.vimrc

でシンボリックリンクにしておく

次に
Raspberry PiのSSH設定方法

を参考に
パスワード認証による SSHログインを無効化しておく

sudo vim /etc/ssh/sshd_config 

で設定ファイルをひらき

56行目の

#PasswordAuthentication yes

PasswordAuthentication no

にしておく