ラズパイ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

にしておく

ARP スプーフィング

ARP スプーフィング

ARPの仕様を悪用し
ターゲットのARPテーブルを書き換える

ARPテーブルは
IPアドレスとMACアドレスの対応表

これにより
パケットを意図した端末に送信できる

これにより
監視対象のネットワークで
人為的な通信を作ったり介入したりすることで
パケットキャプチャすることができる

ARPスプーフィングの原理は
ARP要求とARP応答は認証がなく
クライアントはARP要求を送ってなくてもARP要求を受け入れてしまうこと
これを悪用し
ARP要求に
偽のMACアドレスを書き込むことで
ARPテーブルの上書きをすること

つまり通信の横取りができる

とはいっても
webページを開いたときに表示されないではバレる

なので
ターゲットをARPスプーフィングし
ルータに届くパケットを攻撃するものに届くようにし
さらに
ルータもARPスプーフィングして
ターゲットに届くパケットを攻撃するものに届くようにしておき
あとは
両方のパケットを転送することで
バレにくくする

このように中間に入り込んで行うので
中間者攻撃
MITM attack
Man-In-The-Middle attack
と言われる

実際に実験するには
仮想マシンの Windows7 試用版
Kali Linux 仮想マシン
を使う

KaliLinux には arpspoof があり
これを使い
ARPスプーフィングができる

arpspoof を2回実行することで
KaliLinux でIP転送機能を有効化することで
アクティブキャプチャができる

なお Windows7試用版は
ライセンス認証しないと起動後1時間後に
自動的にシャットダウンされるので注意

まず windows7 で
windows キーを押しながら r をおし
cmd を入力

これでコマンドプロンプトが起動するので

arp -a

を実行

デフォルトゲートウェイの
Physical Address を確認しておく

次に KaliLinux で
MACアドレス
IPアドレス
を確認

ip addr show eth0

実行結果は

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:f8:42:a7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.134/24 brd 192.168.1.255 scope global dynamic noprefixroute eth0
       valid_lft 86099sec preferred_lft 86099sec
    inet6 fe80::a00:27ff:fef8:42a7/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

ip コマンドについては
ip コマンドチートシート for Red Hat Enterprise Linux

を参考に

そして ルータのIPの確認

route -n

結果は

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0

routeコマンドのオプションで
-n を使うと名前解決を行わない

その他オプションについては
routeの主なオプション

を参考に

次にIP転送機能の有効化
1を設定すると有効化
0を設定すると無効になる

echo 1 > /proc/sys/net/ipv4/ip_forward

次に windows7 で wireshark の起動
これでパケットの流れを把握する

次に KaliLinux で
windows7 へ偽情報を送る

arpspoof コマンドで
-i でインターフェース指定
-t でターゲット端末のIPと 書き換えるIPを指定

arpspoof -i eth0 -t 192.168.1.174 192.168.1.1

を実行

この後に windows7 でコマンドプロンプトで

arp -a

を実行すると

Interface: 192.168.1.174 --- 0xf
  Internet Address      Physical Address      Type
  192.168.1.1           60-45-cb-67-e6-38     dynamic
  192.168.1.8           4c-17-44-27-c2-e4     dynamic
  192.168.1.96          08-84-9d-2a-ee-68     dynamic
  192.168.1.255         ff-ff-ff-ff-ff-ff     static
  224.0.0.22            01-00-5e-00-00-16     static
  224.0.0.251           01-00-5e-00-00-fb     static
  224.0.0.252           01-00-5e-00-00-fc     static
  239.255.255.250       01-00-5e-7f-ff-fa     static
  255.255.255.255       ff-ff-ff-ff-ff-ff     static

から

Interface: 192.168.1.174 --- 0xf
  Internet Address      Physical Address      Type
  192.168.1.1           08-00-27-f8-42-a7     dynamic
  192.168.1.8           4c-17-44-27-c2-e4     dynamic
  192.168.1.96          08-84-9d-2a-ee-68     dynamic
  192.168.1.134         08-00-27-f8-42-a7     dynamic
  192.168.1.255         ff-ff-ff-ff-ff-ff     static
  224.0.0.2             01-00-5e-00-00-02     static
  224.0.0.22            01-00-5e-00-00-16     static
  224.0.0.251           01-00-5e-00-00-fb     static
  224.0.0.252           01-00-5e-00-00-fc     static
  239.255.255.250       01-00-5e-7f-ff-fa     static
  255.255.255.255       ff-ff-ff-ff-ff-ff     static

と変化しているのがわかる

変わっているのは
192.168.1.1 の Physical Address の部分

この変更された値は KaliLinux のMACアドレスの値

この状態で windows7 で wireshark を起動し
arp で絞り込むと
偽情報を含むARP要求が届いているのがわかる

これでwindows7 の通信するルータのMACアドレスを書き換えたので
次にルータに対しても同様に書き換えをするので
KaliLinux で
ctrl + alt +t で新しい端末を起動

arpspoof -i eth0 -t 192.168.1.1 192.168.1.174

を実行することで
ルータの windows7 のMACアドレスを
KaliLinux に書き換える

あとは Wireshark を起動し
windows7 でwebサイトをみたり
ネットに繋いだりすると
その通信内容をキャプチャすることができる

試しに wireshark で http に絞ってみるとその内容をみることができる

なお正常な値に戻すには
arpspoof を
ctrl + c で停止させればいい

これで再度 windows7 で

arp -a 

を実行すると元の値に戻っているのがわかる

最後に KaliLinux でIP転送機能をOFFにする

echo 0 > /proc/sys/net/ipv4/ip_forward

コマンドライン版 wireshark の tshark

コマンドライン版 wireshark の tshark

使い方については
tsharkコマンドの使い方

オプションについては
tshark オプションメモ

を参考に

-i オプションでキャプチャするインターフェースの指定

-c オプションでパケット数の指定
なおデフォルトだと無限になっている

eth0 で2つのパケットを取得するのなら

tshark -i eth0 -c 2

とすればOK

結果は

Running as user "root" and group "root". This could be dangerous.
Capturing on 'eth0'
    1 0.000000000 AsustekC_67:e6:38 → Spanning-tree-(for-bridges)_00 STP 60 Conf. Root = 32768/0/60:45:cb:67:e6:38  Cost = 0  Port = 0x8001
    2 2.000087602 AsustekC_67:e6:38 → Spanning-tree-(for-bridges)_00 STP 60 Conf. Root = 32768/0/60:45:cb:67:e6:38  Cost = 0  Port = 0x8001
2 packets captured

となる

最初のメッセージは
root ユーザで行うとでる警告文

-f オプションでフィルタリング
-w オプションで保存ファイル名の指定
-r オプションで保存したパケットファイルからの読み出し
-q オプションで表示する出力を減らす

DNS通信をキャプチャし
traffic.pcap にして保存するなら

tshark -f "udp port 53" -i eth0 -w traffic.pcap

を実行

別端末を ctrl + alt + t で起動

dig ntp.nict.jp +short

を実行したら

ctrl + c で tshark を停止

内容をみるには

tshark -r traffic2.pcap 

とすれば内容をみることができる

なお実行結果は

Running as user "root" and group "root". This could be dangerous.
    1 0.000000000 192.168.1.134 → 192.168.1.1  DNS 94 Standard query 0xbecb A ntp.nict.jp OPT
    2 0.000822310  192.168.1.1 → 192.168.1.134 DNS 162 Standard query response 0xbecb A ntp.nict.jp A 133.243.238.244 A 133.243.238.163 A 61.205.120.130 A 133.243.238.164 A 133.243.238.243 OPT

となっている

パケットの監視を行いフィルタリングするなら
-Y オプションを使う

先ほどと同じようにDNSに絞り込むなら

tshark -i eth0 -Y 'udp.port==53' -n

を実行

別端末を ctrl + alt + t で起動

dig ntp.nict.jp +short

を実行

これで tshark 側に通信内容が表示される

Wireshark SSL セッション復元

Wireshark SSL セッション復元

ubuntu18.04を https 接続できるように設定し
SSLセッションを復元できるようにする

なお ipアドレスを調べるには
ifconfig ではなく
ip コマンドを使う

ip a

でIPアドレス表示ができる

Ubuntu18.04で自分自身のIPアドレスを調べる(IPコマンド)

を参考に

次にSSHサーバインストール

sudo apt-get install openssh-server

これでリモート操作が可能に

次にapache 関連のインストールと設定

sudo apt-get install apache2

で Webサーバ インストール

sudo a2enmod ssl
sudo a2ensite default-ssl
sudo service apache2 restart

でSSLモジュールを有効化

次に KaliLinux で Firefox を起動し
https://192.168.1.150/
へアクセス

192.168.1.150 は ubuntu のIPアドレス

次に wireshark で
ip.addr==192.168.1.150
としてパケットを絞り込む

HTTPSでの通信は
Info には Application Data と表示され

内容も
Encrypted Application Data
となり
平文内容は表示されない

これを復号するには
webサーバのSSL秘密鍵が必要になる

ubuntu の場合
Apacheのインストール時に
サンプルのSSL証明書が自動的に作成されるので
これを使う

秘密鍵は
/etc/ssl/private/ssl-cert-snakeoil.key
にあるので

これをダウンロードする

scp や sftp でコピーしようとしても
Permission denyed
となり権限がないためコピーできない

一度
ssh でログインし

udo cp /etc/ssl/private/ssl-cert-snakeoil.key .

でコピー

ll ssl-cert-snakeoil.key 

で権限などを確認

-rw-r----- 1 root root 1704  5月  3 05:30 ssl-cert-snakeoil.key

となっているので

sudo chown snowpool:snowpool ssl-cert-snakeoil.key 

で所有者を変更

ログアウトしてから
KaliLinux 側で

sftp snowpool@192.168.1.150

で sftpコマンドで接続し

get ssl-cert-snakeoil.key

でファイルを取得

sftp コマンドについては
sftp – 安全なファイル転送 – Linuxコマンド

権限関連については
chmod? chown? よくわからんって人のための、ファイル権限系まとめ

をみるとわかりやすい

これでファイルが取得できたんで

chown root:root ssl-cert-snakeoil.key 

で権限を戻しておく

wireshark で
Edit > Preferences

Protocols をクリック

SSLをクリックし
RSA Keys list の Edit をクリック

+を押すとサーバ情報の追加ができる

IP address にIPアドレス
今回は ubuntu18 のIPアドレス

Port に 443

Protocol
に http

KeyFile に秘密鍵のファイルを指定し
OK
をクリック

これでSSL通信の内容をみることができる

Xmas スキャン

Xmas スキャン

Xmasスキャンでは
TCP パケットの
FIN
URG
PUSH
の3つのフラグを設定し送信する

今回は
Metasploitable の
FTPポート21番に対して実行

nmap -sX -p 21 192.168.1.137

結果は

Starting Nmap 7.70 ( https://nmap.org ) at 2020-04-25 06:06 JST
Nmap scan report for 192.168.1.137
Host is up (0.00022s latency).

PORT   STATE         SERVICE
21/tcp open|filtered ftp
MAC Address: 08:00:27:55:20:B9 (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 0.45 seconds

となり

Wireshark で
statictics > Flow Graph
で表示

Flow type を
TCP Flows にして確認すると
FIN PSH URG に対し
応答がないことがわかる

FIN
のときと同じく
パケットを送信して
ポートが開いているなら応答がない

次に閉じている24番ポートに実行

nmap -sX -p 24 192.168.1.137

結果は

Starting Nmap 7.70 ( https://nmap.org ) at 2020-04-25 06:11 JST
Nmap scan report for 192.168.1.137
Host is up (0.00040s latency).

PORT   STATE  SERVICE
24/tcp closed priv-mail
MAC Address: 08:00:27:55:20:B9 (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 0.24 seconds

となり

Wireshark でみてみると
FIN PSH URG パケットを送ると
TCPパケットのRSTと ACK が返ってくるのがわかる

このようにTCPパケットが返ってくるなら
ポートが閉じていると判断できる