Raspberry Pi Zero W のPWM サウンド出力とノイズの改善 続きの続き(完結か?)

話があっちこっちいくけど、日常的に気になってやってることを順番で書いてるとこうなるのよね。今日は、PAM8403の話。

色々やって、秋月のスピーカー購入ついでに、持ってなかったパーツ類を買い揃えてRaspberry Pi Zero WのPWMサウンド出力に再挑戦しました。

と、ここまできて、こんなページを見つけていました。
曰く、
The Raspberry Pi is able to create audio using a pair of GPIO pins. The problem is that the audio is badly distorted. The low notes are too low and cause the speaker to rumble and sound blown, and the high notes have lots of unwanted noise. To assist with removing these noises, this audio filter circuit was added to the original Raspberry Pi.

低音が低すぎて、高音はノイズが・・・ということですね。
で、これの対策で、元々のPWM出力記事を書いてくれたところの回路設計で、ハイパスフィルターやローパスフィルターが実装されている。
なるほど、なるほど勉強になる。

前のボッ ボッボッボッボッは、Raspberry Pi からの出力は低音が低すぎたので音割れしてたと考えた方が良いのかな。
ではフィルターが必要だね、と、

行ってきました、秋月電子とaitendo

通販で買った方が安いじゃん!って結果はさておき、お店に行くのもイベントで、久しぶりの秋葉原を満喫しながら闊歩してきましたよ。

aitendoで抵抗とコンデンサ他、少々。
秋月電子で、スピーカーとaitendoになかった値の抵抗。

さらに、あきばお~で、お土産に350円のMP3プレイヤーを2個買って帰った、

さてさて、部品も揃ったのでRaspberry Pi Zero用の出力回路を作成して音を出してみた。
すると・・・


低音での音割れ発生タイミングが最大ボリューム側に移動・・・したと思う。

ちょっと音を大きくしてもボッ ボッボッボッってのはしなくなった。
さらに、先のページにあったようにPAM8403の出力に抵抗を入れると、Raspberry Pi
 Zero W本体のノイズを表現しなくなったので超ベスト。

と、勢いに乗ったところで、PAM8403のアンプを使った工作を開始。

本体ケースと、それに合わせてカットした1枚10円程度の中華基盤。








 カットした基盤に部品を固定していく。
 ケースへの穴あけを試行錯誤しながら配線。
何度もハンダ付けをし直した記憶がある。







で、これが完成形。
結局、記憶とGoogleだよりで完成まで6時間かかった。






終わり:
Raspberry Pi 関連のノイズは、 自分の耳ではほぼ解消できたと思ってもよいかもと思える状態になっているね


自作スピーカー事始め、そして焼失

前回書こうとしていた、ダイソーの300円のUSB電源スピーカーを使った自作スピーカー作りをする話。子供がやりたいといったので一緒に作りました。

2個目のUSBスピーカーを使います。スピーカーボックスは、スピーカーが入っていた箱をそのまま使うことにしました。箱捨てないでおいてよかったw
箱のサイズは、82x130x66mmなので、0.7L
60x70x50mmで0.2Lぐらいなので 約3倍の大きさになります。
低音はボックスの大きさと聞いたので、紙ボックスでも期待できるかもしれません。


ボックスのデコレーション用に木目のシート を使って、まずは箱作成。
こんな感じに出来あがありました。
これにスピーカー用の穴をあけます。
直径52mmです。
USBスピーカーを分解しました。
開けてちょっと驚いたのが、スピーカーの枠の色が違うこと。
左右の音大きさが微妙に違ったけど、もしかするとこのせい?
とりあえず、お試しなのでこのまま使っていきます。
元々スピーカーについていたアンプとケーブルでは長さが足りない感じなので、ケーブを外して、別のケーブルを付けます。ここも余っているものを使って+側を赤色でなくて黄色を使っています。
とりあえず、スピーカーを載せるとこんな感じ。
左右の色の違いが気になる。
ところで、箱のカットを子供にお願いしていたら、箱の内側の耳を切り落としたので、右側のボックスの蓋が落ち込みました。まぁ修理すればよいだけなのでw



と、ここで、子供がアニメを見るためにリビングへ移動してしまいました。
いったん、制作を中断します。

で、一人で部屋にいて、むき出しになったスピーカーや基盤を見て、あれこれ試したくなってきました。
例のPAM8403アンプ の出力をこちらに入れたらどうなるかな?
あっちの方が出力大きい感じだから音が変わるかな・・・

と、出力をアンプの出力端子にあててみたところ・・・・煙が・・・・

焼けました。300円スピーカーのアンプのチップが燃えて穴が開いてしまいました。orz
接続を戻して使ってみましたが、右側からは音が出ません。Ω\ζ°)チーン


 下は、穴が開いた写真。(^^;;
まぁ、色々と素人なので、これも仕方がないかと・・・
 こっちのアンプの電源が入った状態だったからかな、

続きは、次回



 

オーディオの魔力により簡易自作スピーカー作成へ

アンプとスピーカーのことをやりだしてから、元の本題であるハロ作成が滞っている。というか、手につかない。
なんかあれば、YouTubeで、ステレオのビデオを見て聴いている。
いい音ってやつは、たぶん素人でもわかるんだろうな。

前回までの試行を振り返ると、
アンプを組み込もうとか思っていて試していたスピーカーは、妻が独身の時に使っていたKENWOOD AS-5という今やカタログも記録もほとんどないスピーカー。ずっとヘッドホンだったので使っていなかった。これがどうやらもフルレンジだけど低音が出ない。元の内蔵アンプではほぼ壊滅、前回までのPAM8403でちょっと低音が出始める感じ。そこで、音量を上げると低音側でボッボッボッボッボッボッボッボッ。と音が鳴りだす。中高音だけのときは音量を上げてもこんな音はしない。
つまり、低音で音割れしているのかな。


とりあえず、元の電源アダプタが異常に大きくてコンセントボックスを圧迫するし、12V1Aとか、意外と電力食い?PAM8403だと5v0.5A未満?(USB電流計で測定できない数値)なので置き換えても問題が無いかな、と他のことしながらYouTubeの理想の音とか感涙の音とかをヘッドホンとスピーカーで聞き分けること2週間。

で、流れ的に色々Youtubeとかでスピーカーを見ていると、ダイソーの300円USBスピーカー、秋月電子で2個500円のスピーカーとか目につく。おそらく、秋月のスピーカーとFOSTEXのスピーカーボックスは近いうちに買うと思う。
そして、その前に試しにとダイソーの300円のUSBスピーカーを買ってみた。

うん、USB「電源」スピーカーです。

とりあえず、音的にはレビューの通り、「使える」ので子供のPCに繋いであげた。そして、お遊び用にもう一式を買って、箱を変えてみようとチャレンジをした。

おっとっと、文章長くなってきたので、 今日はここまで。

 次はこれのお話でも。




PAM8403アンプをもう少し調べてみた

PAM8403アンプで音が~って話がありましたが、ちょっと違う話。

この基盤のスピーカー出力のシルクパターンは、PAM8403のデータシートの記載と+-が逆になっていることは確か。

ただし、出力側がステレオジャックになると、このままだとモノラルになるとのこと。
こちらの「 ラジオ、ときどきラーメン2」さんのブログが参考になります。

このような場合は、ブログの通り、プリントのシルクパターン通りにするとステレオになるとのことで、
実際実験したら、少しは音が混ざりますが、左右で聞き分けるぐらいの音量にはなった。

なので、出力側のLRの+ーが分かれているなら 、シルクパターンと逆。
ステレオプラグのような形で繋ぐ場合は、シルクパターン通り、ということになる。

ということで、左右に分離した環境で、ラズパイで再チャレンジ。

結果は、
全然ダメでした。
間にアンプをれなければ、大丈夫なんだけどなぁ。



これだと、音量を上げればスピーカーでも行ける。音は割れるけど。

しかし、何か大事なことを忘れているのかもしれない・・・って、素人にはもうこれ以上は無理っぽい・・・
どんどん深み入っていきそうで嫌だなぁww




開発用パーツの続きの続き

PAM8403のアンプを使うためには、ハンダ付けしなくちゃいけない。
他にもハンダ付けしたいものや色々あったけど、やけど注意、火事注意を念頭にすろと、ハンダごてを出して使うこと自体がイベントになって、個人的には、沢山をまとめて実施しましょうとなっている。

という感じで、溜まっていたやりたいことを一気に片づけ走ったのだけど、今回使ったハンダごてがこれ。上海問屋で買ったUSBハンダごて、1000円しなかったかな?



とっても良いです。熱量は少し足りないかもしれないけど、自分の扱う分には十分。
何しろUSBから給電だし、本体スイッチのON/OFFで、温まるのも15~20秒程度と早くてOFFも簡単ににできる。こて先は掃除しないように書いてあるので特殊加工してあるのかな?つけっぱなしでも焼けた感じがしない。

あ、どこかのサイトのレビューにあるような、ボタンを押している間だけ発熱するタイプではなくて、ボタンでOn/Offだから、物が違う。最初は気づかなくて押しっぱなしで発熱せずに悩んだw

惜しいところは、本体が軽くて電源ケーブルのうねりに負けて取り回しづらい時ある。特にテーブルの上に置くときに、ケーブルの形状記憶に負けて向きが変わったりするのが怖かった。

そして、ハンダづけを一気に片づけるための相棒を今回作った。
それがこれ。初登場、息子の机での撮影。



板2枚とクリップ2個、釘4個で作った、固定台。
こんなのでもある違うので、治工具の大事さが良くわかる。
※他の方の作例を真似させてもらいました。ありがとうございます。
沖縄電気鐵道-浦添線- さん
Penguin Craftさん   :こちらのコメントが自作する決め手でした


ハンダ付け祭りのとっかかりは、LEDランプの改造。
100均のLEDランプをニコイチする。
光量の弱い長い方と光量の強い短い方。短い方は接触不良で突いたりつかなかったりして壊れかけたもの。
これらを合わせて、長いのを一つ作る。
※これも他の方の作例を真似させてもらいました。ありがとうございます。
 
白いのに穴をあけるのが大変だけどねじ込んで完成(たぶんすぐに壊れそう・・・)






充分でしょ。
難点は、フレキシブルパイプが弱っていて、立てても負けてぐんにゃりするところかなw



で、勢いに乗って、アンプのはんだ付けや、いらない基板からの部品取りをやっていった。
 
最後に、このブログを書くのに、最初に書いたUSBハンダごてのことを書こうと、写真撮って、コテ先の情報も載せようと思った。
結果がこれ


そうです、中のニクロム線?を引っ張ってしまって元に戻せません。
そして、もうこのこて先は使えない事が確定です。

最後の最後にへまをしてしまった・・・・orz
ググったけど、このこて先は販売してないみたいなので、Amzonで似たものを注文、500円!
上海問屋より安いや。配送は2週間先だけどね~



Raspberry Pi Zero W のPWM サウンド出力とノイズの改善 続き

前々回届いた小っちゃなステレオアンプをラズパイに繋いてみよう作戦を開始。

いままでスピーカー1個だったから気にせずラズパイからも片系だったけど、いらなくなったPC用のサウンドカードから取り外したイヤホンジャックを使って、今回はLRどちらも繋いでみた。



LRの出力確認のためにヘッドホンで聞くと・・・・・・・音が大きい!!
あれれ!?って、今まで使っていたスピーカーに繋ぐと、まぁそれなりには聞こえる。

これが、ヘッドホンとスピーカーの違いなのか?確かにそれぞれ用に出力は違ったような記憶はあるけど、素人にはわからないw

でもヘッドホンで聞く分は、これでも良いかなぁ。ちょっとホワイトノイズが気になるけどね。
例の出力用の回路を組めばよいのかな?

アンプレスならそれが一番良いからね。
と、新たな発見は置いておいて、

で、小っちゃいPAM8403アンプに配線してみた。出力の+-が逆というので、逆に配線。

ラズパイとの接続は、こんな感じ。






電源入れると、ポップノイズ?がひたすらでかい!ボッボッボッボッボッボッとずっと大きい音で鳴っていて、音楽流しても止まらないというか、音がぶちぶち切れて音楽聞けないorz

色々配線変えたりしたけど特に効果なし。
どうもアンプのL入力側のノイズがひどく、あと、出力側のマイナスを外すとノイズは減るが音は極端に落ちる。
アンプの不具合化と、もう一つも組み立ててみたけど同じだった。

安いアンプだから不良品に当たったかもしれない。
そう思いながら、試しにスマホを入力に使ってみた。

すると。


ん!?

変なノイズが出ない!
音を大きくしてもきれいに出てくる。ノイズなし。ホワイトノイズもあまりしない感じ。
入力無いと、ブゥーって小さい音するけど、これはよくあるノイズの音の覚えがある。


ちゃんと動いてたんですね、アンプさんごめんなさい。


試行錯誤5時間ぐらいして、ラズパイからの入力時のみ、おかしいということになった。

状態としては、入力がラズパイの時は、・色々なノイズで
・アンプの発熱・ラズパイから5V電力供給をさせると、0.1A→0.9Aぐらいに急激に向上
・GND関係のケーブルをいじると変動が大きい
という感じ。まぁ使えない状態。

100均のアンプだと、何の問題もなく使えるんだけど、これは何が違うのだろう。
素人にはこれ以上はわからんです。

それこそ、出力用の回路をきちんと組んでおいた方がいいのだろうか、
そうすると、100均アンプやヘッドホンで聞いているときの音が良いことはどう片付くのだろう。

ハロに組み込むことを考えていたので、アンプのサイズは小さい方が良いけど、こうなると100均アンプを使うのがベストの判断だなぁ

このアンプは、普通にステレオ用にするしかないかな。







開発用パーツの続き

今回は、さらに届いたものを加えた質より量作戦の内容w

最初は前回画像をアップし忘れたブレッドボード。
10個で200円・・・ブレッドボードって、elegooのセットに入っていた大きいやつが初めてだったんだけど、大きすぎて小さいの欲しいなぁと探していたら、これがあって、似たようなもので最安値のものを買った。200円で送料無料だからね・・・


品質は良くわからないけど、ブレッドボードって背面がシールということに気づいた。
縦横に連結用の凸凹があるので、それで連結すると画像のような国旗もどきもできる。

すでに使ってる画像はアップしている通り、普通に使えてるのでこれは良し。
惜しむべきは、17穴なので、ラズパイを直接挿せないところ。挿せていたら最強だった。

次は、一番最近届いた基盤。
これも10枚で195円。10枚で150円ぐらいのがあったけど、評価が良くない感じがしたので、少しだけ高いのにしてみたww
結果は、今回画像を大きいものでアップしているので見てみてください。
パターンずれとか、物が違うとか、変なところに穴があるとか・・・間違い探しができます。

まぁ、この手の基盤の独特の匂いがしたり、 少し反っていたりするけど、気にしなければ使えそう。
150円位のやつは、下の画像の左上の2枚の写真がAmzonに載ってたかな。


さて、基盤も来たので、電子工作に必要な最低限のものは、コンデンサ類かな。抵抗はelegooのセットに大量に入っていたからね。
それほど高くないので複数容量のセット品を購入するのはできるけど、使わないものが大量に残るの嫌だなぁ。手近なところにあるボードを見ると、必要な容量の物って、大体決まってそうな感じもする。
また調べなきゃなorz



開発用パーツ類

ラズパイでの工作を始めているけど、7末から今までにいろいろとパーツを購入してきた。
昨日、新しいのが届いたので、備忘録的に残しておこうと思う。

最初はこれ、Arduinoのキット。
何を始めるにしても、部品を集めるのが億劫になるタイプなので、安くてまとまっているものがあると助かる。いろいろなものを吟味して、elegooのキットに決めた。
ブレッドボードとかワイヤとかもついているので、初心者には助かる。

普通にLチカもできる(ボード上にLチカを確認できるLEDがついてるのは後から知ったw)
Windowsから直接操作できるので、GPIO使った動作はラズパイよりも、Arduinoの方がわかりやすかった。ラズパイは直接繋げたけど、結局Wifi経由に落ち着いた。

上記とか、ラズパイ買った直後に注文したのがこれら。

人感センサ、音声検出センサが2個、Arduino Nano
Ardiono Nano は、500円以下という値段に釣られて購入。まだ動作確認もしていない。
あと、写真撮り忘れたけど、ラズパイのカメラ互換機も1000円で購入。
時々画像に出ている小さなブレドボードも格安で購入。
音声検出センサは、音声認識に必要だろうと、訳もわからず買ったもの。多分使わないと思う。

で、昨日届いたのが、これら。3W出力のパワーアンプ2個。と、おまけのLEDライト

100均のアンプとの比較。こんなに小さい。
組み込みサイズを小さくするのにも便利そう。 これは、10個入りのを注文しようとしていたのだけど値上がりしたので2個のにした。
でもまた安くなってるよ。買い時難しい。
しかし、昨日届いたけど、72時間テレビ見てたので、全然試せてない。
どれだけの音で鳴るんだろうね。

で、個人的には今回の本命のUSBの電圧・電流を図れるやつ。
200円以下でもちゃんと測れます。正しいかどうかはわからないけど、おおよそ合ってそう。

これでラズパイの電力など測定して、内蔵化の時のバッテリを計算できるかもw



juliusの文法辞書作成

前回で音声認識と出力まで行うことができた。
速度の問題は、ラズパイの性能問題が大きいので後回し。

今回は、音声認識の向上ということで、辞書作成に励みます。

参考にさせてもらったサイトは以下です。

Juliusの使い方(version 4.4.2 対応版)~ ラズベリーパイ研究室

Raspberry Pi3×Julius(読みファイルと文法ファイル)

どちらも、mkdfa をコピーしているところがあるので、ここを省かない方が良い。(未検証)

あと、yomi2voca.pl で読み用の辞書ファイルを作成することを記載しているところは、
utf8からeucjpへの変換をかけているけど、ここから下の文法ファイルを作成する際は、文字コードの変換はしなくても動作したことを、一応書いておく。
文法登録は、辞書ファイルと文法ファイルの二つを作成する。
単語登録のファイルを作成して、yomi2voca.pl で、読み方の変換を行ってから作成したらちょっと楽
ファイル名は同一であることが必要

$ cd haro
$ cat haro.voca
% TITLE
ハロ    h a r o
% WO
を      w o
% PLEASE
音楽    o N g a k u
検索    k e N s a k u
おはよう        o h a y o u
こんにちは      k o N n i ch i w a
おやすみ        o y a s u m i
元気    g e N k i
時間    j i k a N
時刻    j i k o k u
終わり  o w a r i
ストップ        s u t o q p u
消して  k e sh i t e
アイカツ        a i k a ts u
% NS_B
[s]     silB
% NS_E
[s]     silE


文法ファイルの作成
$ cat haro.grammar
S       : NS_B TITLE_ PLEASE NS_E
S       : NS_B TITLE_ NS_E
TITLE_  : TITLE
TITLE_  : TITLE WO

参考サイトは「S」の行が先頭の一つだけ。
この場合、「ハロ」と声をかけても、必ず後ろに「元気」とか「検索」とかキーワードが入ってしまう。試しに上記のようにしてみたら、「ハロ」は単体として認識できた。

各ファイルの作成を実施
$ ~/julius/julius-4.4.2/gramtools/mkdfa/mkdfa.pl haro

起動は、単純に辞書ファイルを作成した時と違うので注意。
$ julius -C ~/julius/grammar-kit-v4.1/hmm_mono.jconf -input mic -gram haro -module

「ハロ」と言ってみた場合

<RECOGOUT>
  <SHYPO RANK="1" SCORE="-1939.878174" GRAM="0">
    <WHYPO WORD="[s]" CLASSID="3" PHONE="silB" CM="1.000"/>
    <WHYPO WORD="ハロ" CLASSID="0" PHONE="h a r o" CM="0.894"/>
    <WHYPO WORD="[s]" CLASSID="4" PHONE="silE" CM="1.000"/>
  </SHYPO>
</RECOGOUT>

「ハロ 検索」
<RECOGOUT>
  <SHYPO RANK="1" SCORE="-2968.890869" GRAM="0">
    <WHYPO WORD="[s]" CLASSID="3" PHONE="silB" CM="1.000"/>
    <WHYPO WORD="ハロ" CLASSID="0" PHONE="h a r o" CM="0.964"/>
    <WHYPO WORD="検索" CLASSID="2" PHONE="k e N s a k u" CM="0.477"/>
    <WHYPO WORD="[s]" CLASSID="4" PHONE="silE" CM="1.000"/>
  </SHYPO>
</RECOGOUT>

「ハロ 音楽」
<RECOGOUT>
  <SHYPO RANK="1" SCORE="-2288.977051" GRAM="0">
    <WHYPO WORD="[s]" CLASSID="3" PHONE="silB" CM="1.000"/>
    <WHYPO WORD="ハロ" CLASSID="0" PHONE="h a r o" CM="0.860"/>
    <WHYPO WORD="音楽" CLASSID="2" PHONE="o N g a k u" CM="0.958"/>
    <WHYPO WORD="[s]" CLASSID="4" PHONE="silE" CM="1.000"/>
  </SHYPO>
</RECOGOUT>

「ハロ ストップ」
<RECOGOUT>
  <SHYPO RANK="1" SCORE="-2542.952393" GRAM="0">
    <WHYPO WORD="[s]" CLASSID="3" PHONE="silB" CM="1.000"/>
    <WHYPO WORD="ハロ" CLASSID="0" PHONE="h a r o" CM="0.944"/>
    <WHYPO WORD="ストップ" CLASSID="2" PHONE="s u t o q p u" CM="0.978"/>
    <WHYPO WORD="[s]" CLASSID="4" PHONE="silE" CM="1.000"/>
  </SHYPO>
</RECOGOUT>

CLASSIDは、haro.vocaに記載した構文文字列の順番のよう。
これらをうまく使うと、2語以上の言葉もうまく制御できるだと思う。
それは次回で。

このあと、超気になるページを発見してしまった。非常に勉強になる。ここで使ってる声は良い!
Raspberry pi3をベースにしたAIスピーカをガッツリ作ってみた ~自作して分かった課題と対策~



Raspberry Piで音声認識と音声合成をはじめる

前回、PWMでの音声出力と音質の改善ができた。
ここから、目標の会話できるハロを目指して、音声認識と音声合成をやってみる。
人工知能は、その後。

今日の流れ。今回は、Webの情報メインで独自色がすくないから細かいことは書いていない。
1.Open Jtalkの導入
2.Juliusの導入
3.マイクとPWM出力について
4.実行スクリプト参考URL
簡単にできる!音声認識と音声合成を使ってRaspberrypiと会話
Raspberry Piで音声認識する人工知能をつくってみる

pythonスクリプトは、以下のサイトがコメントが適切でがわかりやすかった。
AIロボットも作れるのか?音声認識でロボットに仕事させる。

1.Open Jtalkの導入

これはググればたくさん出てくるし、特に難しくないのでの詳細は書かない。
今回のポイントは、音声を"mei" ではなくて、"tohoku"にしたこと。

参考URL:
まほろば Open JTalk の音響モデルを試す

tohokuが、落ち着いていていいかな、って思った。
ハロの声はおそらく再現はできない。でも、再現トライはいつかしてみよう。

2.Juliusの導入

音声認識のためのJuliusを導入
こちらもググると沢山出てくるので割愛

ここのポイント:
・ググると沢山出てくるけど、バージョン差異が多少なりある。
・お決まりパターンっぽいディレクトリ構成をとっていたりするので、自分みたいに好きにしたい人は要注意。

・OSDN・・・とかって思ってGitHUBから入手すると必要なものが抜けていたことがあったので、素直にOSDNから入手するのがベスト。

3.マイクとPWM出力について

PWMの出力との競合があったので、ちょっとだけ書いておく。

音声入力のためのマイクは、アナログでは難しい感じ。たくさんググって調べたけど全然出てこないので、素直にUSB入力がいいのだろう、という結論になった。
情報を公開してくれている方々のサイトから、安い小型のマイクで充分とのことでAmazonで購入。
ただし、500円ぐらいしたので、ラズパイに次ぐ高額部品になってしまった。


ここで悩んだポイントは、
PWM出力を先にやっていたので、マイク入力のデバイスがそのまま使えるか?ってところ。
でも、何をやっても(デバイス番号を指定しても)Juliusは起動時にデバイスが見つからないエラーとなってしまう。
結局諦めて、マイク入力のデバイス番号を「0」に設定した。
すると、当然、PWMの出力はエラーとなる。
$ aplay --quiet  /tmp/test.wav
aplay: main:788: audio open error: No such file or directory
$ mpg321 test.mp3
・・・
Can't find a suitable libao driver. (Is device in use?)


対策は、デバイス番号を指定してあげること
$ aplay -Dhw:1,0 --quiet /tmp/test.wav
$ mpg321 -a hw:1,0 test.mp3
これで、マイク入力と両立するようになった。

4.スクリプト

音声認識させて、それに対する回答を返すためにはプログラムが必要。
今回は、下記のサイトのスクリプトを参考にさせてもらいました。

pythonスクリプトは、以下のサイトがコメントが適切で、非常にわかりやすかった。ありがとうございます。
AIロボットも作れるのか?音声認識でロボットに仕事させる。


今日はここまで。
このままで実行していくと、音声認識時間+音声合成時間で、Raspberry Pi Zero Wだと5秒近くかかるので実用性に欠ける。
対策としては、Julius用の辞書作成と、音声合成部分の極小化。
もしかすると、クラウド使うかもしれない。そういった記事は沢山ある。
でも、前に書いた通り、全部持っていかれるのは嫌だという性格なので内部で何とかしたい。

まだまだ暇つぶしができそう。
これらができたら、ハロを分解して組み込みを考えないと。
それはそれで現状維持+アルファで難しそうだ。


Raspberry Pi Zero W のPWM サウンド出力とノイズの改善

ハロの改造計画の肝は、音声認識と音声出力。 動画追加

最近発売されている色々な機器みたいに聞いてしゃべると素敵。
でも、google先生に全部持っていかれるのは心外w

ということで、Raspberry Pi Zero W でPWMを使ったアナログ出力ができるようにした。

参考サイトは、以下。公開ありがとうございます。


Pi Zero PWM Audio

Raspberry Pi Zero 単体で Audio再生方法

で、出力用の回路は作れない(というか部品集めが面倒)ので、以下で構成した。

Raspberry Pi Zero W
100均アンプ
100均スピーカー



100均アンプの電源もRaspberry Pi からもらってシンプル化w

mpg321を入れて、音声出力の確認で、ちゃんと音が出るのは確認できたけどノイズがひどい。
100均アンプとスピーカーのせいだと思うけどね・・・ってそれにしてもひどい。

これに、OpenJTalkを使って音声合成で出力させる。
まぁ、この辺りは、google先生で検索した結果のどれでも問題なくできます。
音声は、Meiではなくて、tohoku-f01も利用させてもらってます。

さてさて、本題のノイズがひどい件。
これの答えをgoogle 先生で見つけました。

Analogue audio redux
大元というか始まりはここ Analogue audio testing

/boot/config.txt に以下を追加するだけ。

audio_pwm_mode=2


劇的にノイズが減ります!
凄いです。ありがとう、 jdb さん, cool! GJ です。




PWMの音声出力って平凡な話みたいなのでブログ書くつもりなかったけど、この新しいドライバについて本当に感動したから書いちゃいました。

おまけ、音質向上のおかげで、sambaも接続してMP3ライフも充実化w
ユーザ名も指定したいので下記サイトが参考になります。ありがとうございます。
Raspberry piにNASをマウントした時の覚書 NoTASKさん thanks!

sudo mount -t cifs //192.168.1.XX/share /mnt/nas -o username=XXXXXX,password=XXXXXX,iocharset=utf8

ハロ

やはりというか、出ましたね。

AI搭載「ハロ」'18年発売。ガンダムの話ができ、BTスピーカーにも

7,8月に買ったRaspberry Pi Zero W やArduinoは、実はこれ目的だったんだけどね。

1/4 マスコットロボ ハロが家にあって、これでAIさせたら面白いかなぁって思ってた。
ヤフオクで新しいハロ(分解検証用)も買ったのになぁ、
先を越された、というよりも、みんな同じことを考えているんだと思った。

新しいハロは直径19cm らしい。1/4 マスコットロボは10cmぐらいなので、新しいハロは相当大きな感じがするんだと思う。

新型が出る前に、旧型ハロをマグネットコーディングして少しでも戦えるようにするか・・・
酸素欠乏症親父が作ったパーツみたいに投げ捨てられなければいいけどw



 うちの初代青ハロ(長男)、と、分解用に後から来た次男の普通のハロ。
右下は Raspberry Pi Zero W ちょうど入りそうな大きさなのよね・・・







家庭用カレンダーunicale2の構築とSELinux

家族用のカレンダーを作る。クラウド使うのが良いのだけど、ここは家庭内ローカル環境で構築。

入れるのは、unicale2
ググって見つけて、シンプルで良いかなって思った。

導入を簡単に、紹介

ちなみにSELinuxが有効な状態のまま進めます。

# getenforce
Enforcing

■unicale2の入手とyum update

# wget http://www.unicale.com/downloads/unicale_204
# llw-r--r--. 1 root root  287635  9月  6 21:46 unicale_204

zipなので一応名称を変更しておく
# mv unicale_204 unicale_204.zip
# unzip unicale_204.zip
# ll
drwxr-xr-x. 9 root root    4096  2月 27  2014 unicale_204
-rw-r--r--. 1 root root  287635  9月  6 21:46 unicale_204.zip

unicaleのマニュアルから、Webサーバへunicaleのフォルダをコピーということで、/var/wwwを確認
# cd /var/www
bash: cd: /var/www: そのようなファイルやディレクトリはありません

がーん、入ってなかった。
そういえば、最近アップデートしてないので、yum updateをすることに(脱線するなぁ)

カーネルとかアップしたくないので、ちょっと編集
# vi /etc/yum.conf
で、下記を追加
exclude=kernle* centos*
# uname -a
Linux mfileserver 4.3.3-1.el7.elrepo.x86_64 #1 SMP Tue Dec 15 11:18:19 EST 2015 x86_64 x86_64 x86_64 GNU/Linux
# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core) 
# rpm -qa | grep "^kernel" | sort
kernel-3.10.0-514.10.2.el7.x86_64
kernel-headers-3.10.0-514.26.2.el7.x86_64
kernel-ml-4.3.3-1.el7.elrepo.x86_64
kernel-ml-devel-4.3.3-1.el7.elrepo.x86_64
kernel-tools-3.10.0-514.10.2.el7.x86_64
kernel-tools-libs-3.10.0-514.10.2.el7.x86_64
# yum clean all
# yum -y update
  検証中                  : 1:oci-systemd-hook-0.1.4-9.git671c428.el7.x86_64                                    195/195 

minimumインストールなのに195も更新される。いろいろ入ってるなぁ

# uname -a
Linux mfileserver 4.3.3-1.el7.elrepo.x86_64 #1 SMP Tue Dec 15 11:18:19 EST 2015 x86_64 x86_64 x86_64 GNU/Linux
# uname -ayum -y updateclean allrpm -qa | grep "^kernel" | sortcat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

アップデートするとおかしくなるwifiも確認。一応OKそう。
# nmcli d
デバイス    タイプ    状態      接続
docker0     bridge    接続済み  docker0
virbr0      bridge    接続済み  virbr0
enp3s0      ethernet  接続済み  enp3s0
wlp2s0      wifi      接続済み  nuc5ppyh-1
lo          loopback  管理無し  --
virbr0-nic  tun       管理無し  --

そして、念のためリブートしてから、やっとhttpdのインストール
# yum install -y httpd
# cd /var/www
# ls
cgi-bin  html
# pwd
/var/www
# systemctl start httpd

■ファイアウォール設定追加

ところが、他のPCからWebサーバへのアクセスができない。

こういう時の原因調査のとっかかりは、(最初に確認した有効無効関係なく)SELinuxとファイアウォールと決まってる。
SELinuxがEnforcingなのをgetenforceで確認して、ログ参照。※PermissiveならSELinuxは関係ない。
audit.logには、拒否メッセージがなかったので、SELinux、ではなくて、firewalld が原因でしょう。

ということで、http アクセスの許可を追加
# firewall-cmd --permanent --zone=public --add-service=http
success
# firewall-cmd --reloa
succes

これで、httpdへのアクセスはできるようになった。

■SELinuxのセキュリティポリシー設定追加

そろそろ面倒くさくなってきたので、超はしおって、メモ記録
/var/www/html/unicale に /root/unicale_204 をコピー
/var/www/html/unicale以下のファイルに対して、httpdのアクセス権限が存在しないのでエラーとなる。つまり、(SELinuxで使う)ファイルコンテキストがおかしい。単純にコピー、じゃなくて、mvしたらこうなる、いい例。
# ausearch -m AVC | grep 'php' | audit2allow -a
#============= httpd_t ============== 

#!!!! The file '/var/www/html/unicale/index.php' is mislabeled on your system.
#!!!! Fix with $ restorecon -R -v /var/www/html/unicale/index.php
allow httpd_t admin_home_t:file { getattr read }; 
# ls -alZ
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 .
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 ..
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 MyController.php
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 cheeta
・・・

いったん、SELinuxをPermissiveモードに変えて
ラベルの再設定
# setenforce 0
# restorecon -R -v /var/www/html/unicale/*
restorecon reset /var/www/html/unicale/MyController.php context unconfined_u:object_r:admin_home_t:s0->unconfined_u:obje
ct_r:httpd_sys_content_t:s0
・・・ 

SELinuxをEnforcingに戻しておく。ファイルコンテキストを確認する。
# setenforce 1
# getenforce
Enforcing
# ls -alZ
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 . 
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 ..
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 MyController.php
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 cheetan 

ファイルコンテキストが変わっていることがわかる。まぁ、audit2allowの書いてたものと違うけど気にしない。

■コードの修正各PHPファイルを、chmod 666 ではなくて、777で設定。
これで大体動いたけど、PHPの問題?で
&$c とかなっているところを $c にしないと動作しなかったです。

あと、レイアウトやデザイン変更をやったけど、もう書くの疲れたし、忘れたよ(;´・ω・)

(2017/10/1追加)
動いた~と思ったものつかの間、データの追加ができなかった。
/var/www/html/unicale/data/d_data.txt
へhttpd_dが書き込めないというSELinuxのメッセージ。

audit2allow すると、以下の対策。
 #============= httpd_t ==============

#!!!! This avc can be allowed using the boolean 'httpd_unified'
allow httpd_t httpd_sys_content_t:file write;

でもね、なんかWeb系ってこんなことしてたらいけない気がして、Setroubleshootを見てみた。
※こんなこと、ってのは、httpd_sys_content_t のラベルにhttpd_tの書き込み権限を追加するってことは、httpd_sys_content_tのラベルを持つファイル全部(unicale全部とか他のコンテンツ)への書き込みができるようになるってこと。これってhttpdがハックされた書き換えできちゃうってことなので、良くないよね!

# sealert -l 6c17b48a-2ce8-43e2-8942-d34145624c79
SELinux is preventing /usr/sbin/httpd from write access on the file d_data.txt.

*****  Plugin httpd_write_content (92.2 confidence) suggests   ***************

If you want to allow httpd to have write access on the d_data.txt file
Then 'd_data.txt' のラベルを変更する必要があります
Do
# semanage fcontext -a -t httpd_sys_rw_content_t 'd_data.txt'
# restorecon -v 'd_data.txt'
*****  Plugin catchall_boolean (7.83 confidence) suggests   ******************

If allow httpd to unified がしたい
Then 'httpd_unified' boolean を有効にすることにより、 これを SELinux に伝える必要があります。
詳細情報については、'None' man ページをご覧下さい。
Do
setsebool -P httpd_unified 1

*****  Plugin catchall (1.41 confidence) suggests   **************************

If httpd に、 d_data.txt file の write アクセスがデフォルトで許可されるべきです。
Then バグとして報告してください。
ローカルのポリシーモジュールを生成すると、
 このアクセスを許可することができます。
Do
allow this access for now by executing:
# ausearch -c 'httpd' --raw | audit2allow -M my-httpd
# semodule -i my-httpd.pp


Additional Information:
Source Context                system_u:system_r:httpd_t:s0
Target Context                unconfined_u:object_r:httpd_sys_content_t:s0
Target Objects                d_data.txt [ file ]
Source                        httpd
Source Path                   /usr/sbin/httpd
Port                          <Unknown>
Host                          mfileserver
Source RPM Packages
Target RPM Packages
Policy RPM                    selinux-policy-3.13.1-102.el7_3.16.noarch
Selinux Enabled               True
Policy Type                   targeted
Enforcing Mode                Enforcing
Host Name                     mfileserver
Platform                      Linux mfileserver 3.10.0-514.26.2.el7.x86_64 #1
                              SMP Tue Jul 4 15:04:05 UTC 2017 x86_64 x86_64
Alert Count                   16
First Seen                    2017-09-06 23:05:24 JST
Last Seen                     2017-10-01 02:31:08 JST
Local ID                      6c17b48a-2ce8-43e2-8942-d34145624c79
Raw Audit Messages
type=AVC msg=audit(1506792668.710:3376): avc:  denied  { write } for  pid=29763 comm="httpd" name="d_data.txt" dev="dm-0" ino=207523170 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:httpd_sys_content_t:s0 tclass=file
 
Hash: httpd,httpd_t,httpd_sys_content_t,file,write

赤字の部分にビビッと来た。こういうのを待っていた。
httpd_sys_content_t は、httpdが書き込みできないコンテンツタイプ
httpd_sys_rw_content_t は、その名前の通り書き込みできるコンテンツタイプ(だと思う)

指示に従って変更、パス名はきちんといれないと設定できない(のを知らずに、何回か失敗したw)

# semanage fcontext -a -t httpd_sys_rw_content_t /var/www/html/unicale/data/d_data.txt

#restorecon -v d_data.txt
restorecon reset /var/www/html/unicale/data/d_data.txt context unconfined_u:object_r:httpd_sys_content_t:s0->unconfined_u:object_r:httpd_sys_rw_content_t:s0 

 これで、書き込めるようになりました。

スマホ充電スタンドの自作

もうすぐ夏季休暇も終了。
残る課題は、居間のエアコンの掃除と、自分の部屋のスマホ充電環境の改善。

エアコンは掃除するだけなので、今日はスマホ充電台の作成。

充電台で問題になるのは、大きく3つ
・スマホを立てる方法
・ケーブル類の整理
・充電器の整理

今までは、写真のような靴箱を再利用してた。

箱の中に充電器やコンセントを格納して、充電ケーブルだけを穴から出して使っていた。
作った当初は便利だったけど、紙だから傷んできたのと、数の増えてきたスマホやPadが立てられなくて置き場所に困るといった状態になった。

で、 作ったのがこれ、どこかで見た、100均の皿立てを使ったスマホ充電台のオリジナルバージョン。
Padもスマホも3DSも充電できる!立てて収納できる! 便利ですよ~たぶん。(使用期間0.5日なのでわからないw)


では、制作過程を。

材料は、
・100均の皿立て x2
・100均のまな板 x2
・木工ボンド
・ドリル(直径8mm)


皿立ての棒に合わせて、まな板に穴を開ける
直径8mmの穴。

実際に皿立ての部材を当てて穴位置を決めたけど、それでもずれてハメづらかった。
皿立ての棒を差し込んで、木工用ボンドで接着。
箱みたいに端っこになってるけど、おしゃれにするならもう少し内側でパルテノンみたいな感じでもOKかと思う。

天板は、穴をあけて、ダボで止めておくだけ。
こうしておかないと、中に入れた充電器やコンセント類をいじるのが大変になる。

ここで、天板の皿立ての付け方で子供と協議。
自分が押している並行バージョン
子供押しの斜めバージョン
今回は、こちらに決定。

充電器類を配置。

ケーブルは、柱に巻いて長さ調節できる!
けど、横出し。少しとっ散らかってしまう。

本当は天板に穴をあけて、そこからケーブルを出したいのだけど、なかなかデザインできない。変な穴をあけておかしくするもの嫌なのでとりあえずこのまま。
これで完成!

カメラの充電もついでにしておこう。

100均の部材で432円+アルファで作成できた。
家に余っている木材でも作れるけど、1x4材とかなので厚みが出てイケてないし、何よりも寸法で悩むのが面倒。

100均の材料で作る場合は、全体の寸法だけ考えて購入して適当に組み合わせるだけでできるので、非常に楽。

「切らなくていい」ってが一番の楽々ポイントだと思う。

今年の夏休みの工作は、ここまでかな・・・
明日には、Arduinoのキットが届くけど・・・・
raspberry piの部材は8末に届くとか・・・
エアコン掃除は、特にトピックがなければ書かないぞ、っと。



白物家電ハック:エアコン編

最近のマイブーム、家電ハックw

半田ごても使えるようになってきて、ますます拍車がかかっている。

今日のネタではないけど、動かなくなったUSB扇風機は、USBケーブルの断線とかで余っているUSBケーブルに付けなおすだけで動作させたりもしている。

今日は、家の中で、個人的に問題になっていた、自分の部屋のエアコンのリモコンが効かない課題の解決。

リモコンは、携帯のカメラで確認したら正常動作しているようだったので、受信側の問題。これの解決をググると、赤外線の受信モジュールが壊れる事象があって、赤外線受信モジュールだけを交換すればよいらしい。

と、いうことで、頑張ってエアコンの赤外線受光部の修理を開始。

初のエアコンカバー外しもチャレンジw

とかなんとかを台に乗って作業していたので、うっかり写真を撮り忘れてた。

で、
いきなり、赤外線受信モジュールの画像へ飛びますw、
これがエアコンから取り出した赤外線受信モジュール。

黒い台の上で折り曲げられていて、エアコンの前面に出るようになっています。
かなり傷んでます。
 

さて、赤外線受信モジュールを基盤から外して、新しいのに付け替えようと思ったのですが、都合上ぶっつりと切りました。


理由は、これ。
PC用のTVカードのリモコン受信ケーブルから抜き出した赤外線受信モジュール。
脚が短くて、そのままではエアコンの基盤まで届かない!

こいつを、元のモジュールのピンに溶接しました。

どうでしょうか?右端の接続が甘いですね。

取り付けるとこんな感じ。


試験運用もばっちり、リモコンからの指令を全部きちんと受け付けます。
これは、我ながら凄い!
これでエアコン直接操作を回避できる!


ところで、画像をXperia XZで撮っていたけど、下から2枚目から画像を普通のデジカメ Nikon S8200に変えました。Xperia XZは、どうやってもマクロ系の撮影でピントが合わないし、あっても画像が荒いし、で、なんだか使えません。

拡大しなければ、見た目は奇麗なんですけどね~
OSをAndroid7にすれば少しは解消されるらしいけど、ゲームが動かなくなるらしいので却下
なんとかしてください > Sonyさん