Sipeed MAix Bit with MIC MaixPy で マイクのお試し #3 です。
前回、Sipeed MAix Bit with MIC MaixPy #2 で
バイナリーのまま、音データを送信してみましたが、Serial通信でのデータ抜けが結構ありました。
そこで、今回は、 #2 のプログラムにハンド・シェイクを組み込んでみました。
プロトコル
PC側 | Bit側
1) b's' 送信 ------> b's' が来たら、音データ(1 CHUNK*2 バイト)をバイナリ送信
<------ 音データ(バイナリ) + '\r\n' 送信
2) 最後が、'\r\n'
で無ければ、 b'r' ----> b'r' であれば、先に送ったデータを再送
<------ 前の音データ(バイナリ) + '\r\n' を再送
3) 最後が、'\r\n'
であれば、 b's' ----> b's' であれば、次のデータを送信
<------ 音データ(バイナリ) + '\r\n' 送信
この様な簡単なプロトコルです。
Serial 通信は、多分、全2重なので、送信と受信が同時に行えます。
1. 最初は、やはり、Sipeed MAix Bit 側の python script です。
必ず、b's'を受信してから、音データ+'\r\n' を送信します。
2. PC 側の python script です。
1) b's' を送信して、音データの受信を待ちます。
2) 受信データの末尾が、'\r\n' であれば、スピーカへ出力して、次の b's' を送信します。
output = stream.write(line[:CHUNK*2])
で、 \r\n を除いて、pyaudio.PyAudio() のStream へ出力します。
3) 末尾に '\r\n' が付いていなければ、
b'r' を送信して、データの再送を促します。
結論は、感覚としては、 b's' / b'r' をわざわざ入れなくても、
Bit 側が、送信後、1度受信して、次のデータを送信するを繰り返すと、データ抜けはなくなるようです。
転送速度は、
Seepd=int(921600*1.6) 、 CHUNK=1024 で試すと
32,768[byte/sec]
となって、
Sample Rate 16,000 * 2 (Monoral 16bit) = 32,000[byte/sec]
を何とか出せるようになりました。
ですが、PC のスピーカーからは、まともな音はできません。
多分、 Bit 側の Python Script が遅くて、I2S で取り込むデータに抜けが出ている
気がします。
Bit側を、C言語で作れば、USB-Serial でも Sampling 16Khz Monoral 16bit で音が出そな
気がします。
今回は、ここまでぞね!!