2025年12月24日水曜日

OpenAIのwhisperで、処理した音声認識テキストを表示するアプリ(Qt版)

https://github.com/gh6141/QtMp3Srt.git 

OpenAIのwhisperで音声認識処理すると.srtというファイルができますが。これと音声ファイル(mp3)を一緒のフォルダに置いて使えるようにしてみました。ちょうど、映画の字幕のような感じで表示できます。-smallのオプションで、処理したものだと、たまに認識が間違って、若干ずれることもありますが、日本語以外等でいろいろ使えそうです。

2025年12月22日月曜日

灯油残量 WIFI OLEDで表示

 ewp32-c3を表示用に使ってみた、センサーからのデータを蓄積しているraspiからWIFIで読み出すようにした。

 とりあえず、補正計算した残量に加えて、気温・気圧表示し、気圧変化のグラフも表示させてみた。スイッチオンで手軽に見ることができて便利。降圧コンバータが容量大きすぎてもったいないので、これは、12Vバッテリーを5Vモーターでドリルに使うことにした。代わりに小型のコンバータにして、さらに小さいケースに後日変更。
  ※灯油残量とは関係ないけれど、苗床ヒーターの温度調整Esp32の温度データもついでに表示できるように、コードを追加した。

※その後、コードにSSIDを3つ登録して、電波が一番強いところに接続できるようにしました。
※変換のための計算パラメータも、raspiにあるデータに追随するようにした。また、raspiのURL、SSIDとパスワードなどもPreferencesに保存可能にした。(アクセスエラーのとき、設定できるようにサーバモードになるようにした。)


2025年12月21日日曜日

pic16f628AによるDFplayer改良

 EEPROMで、どの番号まで再生したか、不揮発メモリに記録できるようにした。フォルダは01のみとした。以前のフォルダ番号用スイッチを制御用(1回タッチで番号を進める、2回タッチで番号を減らす)とし、ファイル番号用スイッチは、1回目の連続タッチで10の位、2回目の連続タッチで1の位を指定して入力できるようにした。(ただし、10未満は、1回目のタッチを10回タッチすると0になるようにした。)

dfPlayer、しかもPIC利用だとやはり、かなり制限があって、コーディングも難しかった。

2025年12月19日金曜日

OpenAIのWhisperがローカル実行でかなりの認識率

 最近は、音声認識が、無料でしかもローカル実行で正確に認識できるのには驚きました。コマンドラインで実行できるので、アプリの中で活用できてとても便利だと思います。

バッチファイルです。途中のパスを通すところは、ffmpegのあるパスです。

radio2text.bat

.m4aなど、いったん.wavに変換してから処理しています。
LANGはenが英語、jaが日本語 --languageないとどちらも出します
--output_format srt で時間付き字幕

Qt使えば
if (line.contains(QRegularExpression("[ぁ-んァ-ン一-龯]"))) {
    // 日本語
} else {
    // 英語
}
のように分けたりもできそうです。

※なお、準備としては ffmpeg以外に、python3.9以上で
pip install -U openai-whisper
をインストールするだけで動くようです。

2025年12月17日水曜日

ESP32灯油残量センサー 実験

まだ、測定値が安定しないので、新たに容量カウント補正用のセンサ(タンク入口までの短い線)を追加して、しばらくデータをとってみることにした。追加PINはGPIO15。esp32から外に出ている線がぬれるだけで、測定値に影響するので、補正できないか試す予定。 
※その後、測定用のCPSをc1、補正用のCPSをc2とすると、容量がカウントの逆数なので、(1/c1-2.05/c2)*10^5*係数a+切片bで近似すると、比較的うまくいくようだった。残量との差をエクセルで計算して、分散が最小になるように、aとbを調整してみた。この値をグラフにしてみると、ほぼ湿度と逆相関のようだったので、最終的に(上記の値)+51-0.6*湿度とするとさらに近似できそうだった。(このときも分散を見ながら手作業で調整。2次の項も入れてみたがかえってよくなかった。)
 これでも、変動が多いけれど、おそらく空気中の湿度というより、表面の水滴などが影響しているのでないかとも予想?されます。(湿度と相関あっても、完全な相関でないので)そこで、平均すればあるていど変動を抑えられるかと思い、移動平均的な計算を入れることにした。ChatGPTによると、 Value=RawValue*0.07+PrevValue*0.93のように前回データとその時の測定値に重みを付けながら足していくといいらしい。これで、しばらく様子をみることにした。
 今のところ、この移動平均を取り入れたら、以下のグラフ(赤い線)のようになり、わりと実測値に近くなった気がした。
 ChatGPTによると指数移動平均というらしい。低い周波数(残量の変化はかなりゆっくり進むので、あうらしい)を通すフィルターと同じ効果あるのだそう。ある意味LPFのようなものだとか。
※ただ、その後、最初のほうのデータにより、前半の状況が変わってくることもあるようなので、まだ十分とはいえないよう。
※変換式のパラメータをWebで変更できるようにして、実測値と計算値の分散が最小なるようにときどき調整している。残量が少なくなってきたときのほうが、データが多く蓄積してくるので、平均化されて誤差は減っている気もする。大事なのは、灯油がなくなりつつある頃の状況を知ることなので、そういう意味では、なんとか使える?かも。


2025年12月15日月曜日

Qtで最下行へスクロールする方法について

 Qtでは、行数が多くなると最下行へのスクロールが難しい仕様?のようです。

 実際のWigetの行サイズとかもあり、すべてを反映して正確なスクロール量を割り出すのが難しいという問題もある?ちょうど、エクセルなどで印刷イメージと編集画面で微妙にずれたりするのと同じ困難さかもしれませんが。

 こういうときは、泥臭い方法で、実際に繰り返し試しながらスクロール量を割り出すしかないのかもしれません。その旨、ChatGPTに伝えたところ、以下のコードを作ってくれました。なんとか、うまくいきました。

void KakeiboTable::scrollDown(){
    QScrollBar* bar = view->verticalScrollBar();
    if (!bar) return;
    int lastMax = -1;
    QTimer* timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, [=]() mutable {
        int curMax = bar->maximum();
        bar->setValue(curMax);
        if (curMax == lastMax) {
            timer->stop();
            timer->deleteLater();
        }
        lastMax = curMax;
    });
    timer->start(0);
}

2025年12月11日木曜日

Unityで縦列駐車シミュレーションをつくってみた

 WebGLで縦列駐車のシミュレーションできるようにしてみた。実車の運転前に、シミュレーションでコツをつかんでおくと役立つかもしれません。

https://github.com/gh6141/Parking.git(source code)

https://gh6141.github.io/WebGL-Parking/(シミュレーション)

上下左右の矢印で操作し、Spaceでブレーキです

※Github PageでWebGLを使うには、zip圧縮はしないほうがいいようです。パフォーマンスレベルはできるだけLow側にするとうまく動作するようです。

2025年12月10日水曜日

釣り竿アンテナの接触不良対策

 釣り竿アンテナ(カーボン)に銅箔テープを貼ったものをアンテナとして使っていましたが、接続部がどうしても接触不良起こしやすく、SWRも安定しにくくなってきたので、試しに金属クリップを使ったら比較的調子がよくなり59+レポートもらえるようになりました。境目よりなるべくぎりぎり上のほうをはさむとうまくいくようです。

関数解析(宮寺功著)

 文庫本で関数解析が読めるということで購入してみました。早速、壁にぶつかりましたが。

P40 定理2.2で、(x,y)=||(x+y)/2||^2-||(x-y)/2||^2+i||(x+iy)/2||^2-i||(x-iy)/2||^2の定義で(x,y)=(y,x)の共役 が言えるのかどうか? ||x+y||^2+||x-y||^2=2||x||^2+2||y||^2を使うとうまくできるようです。

注意が必要なのは、(x,y)=||(x+y)/2||^2-||(x-y)/2||^2+i||(x+iy)/2||^2-i||(x-iy)/2||^2の共役をとるとき、|| ||のなかにあるiの符号は変えてはいけないということ?うっかりけてしまいそうですが、外側のiは符号変えてもいいですが、ここがたぶん注意点?

Unityを久しぶり少し使ってみました

基本的なことを忘れていて思い出すの時間はかかりましたが、以前作りかけていたものを少しだけ手を加えてみました。文字式の計算を動物キャラクタで、できないか、試しに作ってみたものです。導入等に使えないかと。 使う機会もないので、まだ中途半端の状態ですが。同類項=同じ種類の動物を重ねて計算します。+ーゼロだと爆発して消えるようにしています。

https://github.com/gh6141/WebGL_MathBoxSrc2.git(code)

https://gh6141.github.io/WebGL_mathBox/(WebGL)

こういうゲームでも誰か作ってくれれば、文字式や方程式の抽象概念も多少は理解促進の助けになるのでないかと思っていますが。

2025年12月6日土曜日

ESP32+BME280 bottleコードの調整

 ESP32からのデータをbottleで表示するコードを少し調整。スマホでの表示が見ずらいので少し調整してみたのがこちら


2025年12月3日水曜日

ESP32にBME280追加

 キャパシティのカウントに、温度影響などあれば、補正の可能性もあるかと思い、温度等もロギングすることにしてみた。ついでも、気圧、湿度も計測できるセンサが安く入手できたのでつないでみた。ロギングはbottleサーバで行い、PCから確認できるようにした。esp32のコードもそれに合わせて書き換えた。

補足:容量カウントのピンはGPIO4からノイズが少なめのGPIO12に変更した。また、容量カウントは、WIFIやBME280の起動前に行い、ノイズの影響を除くようにコードを修正。シリアル通信も同様の理由で削除(2025.12.5)(ChatGPTのよると、GPIO12,GPIO33,GPIO32,GPIO13,GPIO15の順でノイズが少ないらしい)

SparkFunBME280というライブラリを追加する必要があります。

BME280のI2C接続図

 アクリルだと、紫外線で脆くなるだろうと考え、塩ビパイプをヒートガンで平面にしたものを加工して作ってみた。

Web確認すると推移グラフもチェックできるようにした(2025.12.6)
(12/7)湿度が容量に影響しているような様子も見られ、もう少し分析が必要と思われる。
(12/8)湿度との相関もはっきりしないところもある。タンク内と外では湿度が同じでないことも影響しているかもしれないので、補正も難しさがありそう。