作ってみた

672件
音声対話のための音声合成・音声認識エンジン、speech.cppを作ってみた話 未読

音声対話のための音声合成・音声認識エンジン、speech.cppを作ってみた話

ggmlで動く音声合成と音声認識のエンジン、speech.cppを作りました。公式の実装と段階ごとに比較して同じ結果を出すこと、会話に間に合う速さ、MacとWindowsとLinuxで実行ファイル1つで動くことを目指した話と、ほかの実装との比較をまとめます。

2週間ぶり
JevでVJアプリを作ってみた 未読

JevでVJアプリを作ってみた

English ver: Jev VJ · in Lotusland インターネットの皆様と同じく、僕もJevのデモを作りました。 JevをVJのアシスタントとして使うアプリです: I made a #Jev VJ demo.Jev listens to what I say, suggests the matching video clips to me, then I manually switch them.I wrote a list of clips & effects with short description beforehand, so it can pick the bes…

1週間ぶり
【Linuxユーザー向け】 Linux版Time Machineが欲しかったのでBtrfs用UIを作ってみた話 【ツール紹介】 未読

【Linuxユーザー向け】 Linux版Time Machineが欲しかったのでBtrfs用UIを作ってみた話 【ツール紹介】

btrfsのスナップショットから、ファイルの過去の版をブラウザで辿って復元できるツール「btrfs-timeline」を作ったので紹介します

6年ぶり
Arduino Uno QでAIロボットカーを作ってみた #1 未読

Arduino Uno QでAIロボットカーを作ってみた #1

前回はArduino Uno Qにメディアキャリアボードを取り付けて、接続したMIPIカメラでの物体認識 を行いました。これまでArduino Uno Qで試してきたものを統合してAIロボットカーを製作してみます。 これまでの振り返りです。 Arduino Uno Qを触ってみました Arduino Uno QでLチカの状態をブラウザにリアルタイム表示する Arduino Uno Qでモーションセンサーを使ってみた Arduino Uno Q メディアキャリアボードでカメラを接続する 要件定義 ゼロから組み立てるよりはArduino App Labのインスピレーションのプロジェクトを流用することを考えます。先日まで実験していたESP32S3 Senseの物体認識でロボットカーを動かすものと同様なものを製作してみます。 AIロボットカーの要件は以下の通りです。 何らかの物体を認識したら前進する。 物体を認識できていない場合は停止する。 最初はシンプルな機能にして、徐々に機能を拡張していきます。 開発方針 ベースとなるプロジェクトはメディアキャリアボードの時に動かしてみたDetect Objects on Cameraが良さそうです。このプロジェクトはカメラ画像からの物体認識とWebUIによるモニタリングや制御ができます。このプロジェクトはLinux側(Python)だけで動作しており、MCU側は使用していないためスケッチはありません。このため次のように進めてみます。 ベースとなるDetect Objects on Cameraを動かす。 MCU側のスケッチを作成し、モータードライバを制御できるようにする。 Brigde機能で、Linux側のPythonスクリプトからMCU側のスケッチに物体認識結果を送信する MCU側のスケッチで物体認識結果に合わせてモーターを制御する。 PythonからMCU側への通信はこれまで試してきた内容から、Bridgeを使えば良いはずです。要件も前進と停止だけですので、MCUに渡す情報は0か1かの世界です。 MCU側のスケッチの作成 ESP32S3 Senseで実験しているロボットカーを流用しますので、モータードライバは秋月電子のDRV8835モジュールを使用します。PWM制御で回転数を制御しますので、PWMが使用できるArduino Uno Qの端子を使用します。 今回は以下の表のように設定しました。 DRV8835ピン 接続先 説明 VM 単3電池 (+) モーター電源(約3V) AOUT1 モーターA(+) 左輪モーター AOUT2 モーターA(-) 左輪モーター BOUT1 モーターB(+) 右輪モーター BOUT2 モーターB(-) 右輪モーター GND 単3電池 (-) & Uno Q GND 共通グラウンド(必ず共通接続) VCC Uno Q 3.3V ロジック電源 MODE GND IN/INモード(常時GNDに接続) AIN1 Uno Q D3 (PWM) 左モーター 前進 AIN2 Uno Q D9 (PWM) 左モーター 後退 BIN1 Uno Q D10 (PWM) 右モーター 前進 BIN2 Uno Q D11 (PWM) 右モーター 後退 ここではモーターの配線は行なわず、スタンドアロンテストとしてモータードライバをLEDに見立ててテストを進めます。 MCUに接続されているRGB LEDは2個ありますので、LED3をモーターA、LED4をモーターBとし、モータードライバの入力ピンのIN1がHIGHは赤、IN2がHIGHは青、両方ともLOWの場合は消灯となるスケッチを作成します。 Arduino App Labで以下のsketch.inoを作成しました。 /* * Uno Q Robot Car -- MCUスケッチ */ // DRV8835 ピン設定 const int MOTOR_L_IN1 = 3; // D3 (PWM) const int MOTOR_L_IN2 = 9; // D9 (PWM) const int MOTOR_R_IN1 = 10; // D10 (PWM) const int MOTOR_R_IN2 = 11; // D11 (PWM) const int DRIVE_SPEED = 200; // 前進(LED点灯: 赤) void moveForward() { analogWrite(MOTOR_L_IN1, DRIVE_SPEED); analogWrite(MOTOR_L_IN2, 0); analogWrite(MOTOR_R_IN1, DRIVE_SPEED); analogWrite(MOTOR_R_IN2, 0); // アクティブLOW(LOWで点灯) digitalWrite(LED3_R, LOW); digitalWrite(LED3_B, HIGH); digitalWrite(LED4_R, LOW); digitalWrite(LED4_B, HIGH); } // 停止(LED消灯) void stopMotors() { analogWrite(MOTOR_L_IN1, 0); analogWrite(MOTOR_L_IN2, 0); analogWrite(MOTOR_R_IN1, 0); analogWrite(MOTOR_R_IN2, 0); digitalWrite(LED3_R, HIGH); digitalWrite(LED3_B, HIGH); digitalWrite(LED4_R, HIGH); digitalWrite(LED4_B, HIGH); } void setup() { pinMode(MOTOR_L_IN1, OUTPUT); pinMode(MOTOR_L_IN2, OUTPUT); pinMode(MOTOR_R_IN1, OUTPUT); pinMode(MOTOR_R_IN2, OUTPUT); pinMode(LED3_R, OUTPUT); pinMode(LED3_B, OUTPUT); pinMode(LED4_R, OUTPUT); pinMode(LED4_B, OUTPUT); stopMotors(); } void loop() { startMotors(); delay(500); stopMotors();  delay(500); } スケッチを作成したらArduino App LabでRUNを実行します。 物体認識はそのまま動作しつつ、LEDが指示した通りに点滅し続けます。デュアルプロセッサであることがよくわかる動きです。 Pythonとスケッチを連携する ここでBridgeを使用してPythonとスケッチを連携します。物体を認識したらMCU側のLEDが光るようにします。 Python側は以下のように追記しました。(主要な部分のみを記載) def update_motor(should_move: int): global current_state new_state = 1 if should_move > 0 else 0 if new_state != current_state: current_state = new_state try: bridge.call("motor_state", new_state, timeout=5) except Exception as e: print(f"Bridge call error: {e}") def send_detections_to_ui(detections: dict): global last_detection_time total_detected = sum(len(items) for items in detections.values()) if total_detected > 0: last_detection_time = time.time() update_motor(1) スケッチ側は以下のように追記しました。(主要な部分のみを記載) String rpc_motor_state(int state) { if (state > 0) { moveForward(); } else { stopMotors(); } return "{\"ok\":true}"; } // Bridge 通信の開始とRPC登録 Bridge.begin(); Bridge.provide("motor_state", rpc_motor_state); 再度App LabでRUNを行い、新しいプログラムを書き込みます。 無事に動作することが確認できました。 物体が認識できないときに停止する ただし、ここで問題がありました。物体を認識していないときもLEDが点灯したままになってしまいます。認識した場合は通知が来ますが、認識できなくなったときは通知はありません。このためウオッチドッグタイマーを設定して0.5秒間隔で認識できているかどうかをチェックするように改良しました。 今回はpythonで行っています。 # 0.5秒間検知が途切れたら停止と判定 TIMEOUT_SEC = 0.5 def watchdog_loop(): global last_detection_time, current_state while True: if current_state == 1 and (time.time() - last_detection_time > TIMEOUT_SEC): update_motor(0) time.sleep(0.05) この修正で物体を認識しているときだけLEDが光るようになりました。 モータードライバを接続する スタンドアロンでテストが完了しましたので、ロボットカーの筐体にArduino Uno Qやカメラを組み込みます。モータードライバもArduino Uno Qに接続します。 ロボットカーの動作確認 ロボットカーの動作確認を行います。いきなり暴走する可能性もありますので、車輪が宙に浮く状態にしてモーター電源を投入します。物体認識を行うとLEDが点灯し、モーターが回転しました。 これで要件通り物体が認識したら前進し、認識できない場合は停止するロボットカーができました。 まとめ 今回は非常にシンプルな機能に限定していますが、WebUIにリアルタイムで表示されているような物体の種類や、位置といった情報もPython側では取得できています。次回はこれらをMCU側に連携して少し高度な動きを試してみます。 Bridgeで複数の情報を引き渡すにはJSON文字列にして送信すればよいことはこれまでの実験からもわかっているので、難しくはなさそうです。あとはアイデア次第です。 Arduino App Labを使うとLinux側とMCU側の連携も容易で再利用可能なパーツであるBrickも揃っています。インスピレーションにある豊富な事例を参考にして独自のものも作成しやすいはずです。 また、Arduino Uno Qは小型で機器に組み込みやすく、ヒートシンクも今のところは不要そうですし、消費電流もそんなに大きくないため、電源周りも楽だと思います。ひとつ残念な点はメディアキャリアボードにネジ穴が無いことです。そのため今回のロボットカーではネジでの固定ができていません。キャリアボードの下にコネクタだけのボードを接続してネジ止めができるようにすると良いかもしれません。 なお、本プロジェクトのソースコードはGitHubに置いてありますので参考にしてください。

2日ぶり
KERIgoKBD のキーマップ表示・編集アプリを作ってみた 未読

KERIgoKBD のキーマップ表示・編集アプリを作ってみた

はじめに こんにちは、子供から風邪をもらって、シルバーウィークが療養で消えかけているけりです。 風邪と闘いながら、自作キーボード KERIgoKBD の キーマップ表示・キーマップ編集アプリ「KERIgoKBD Studio」 を作ったので紹介します。

3か月ぶり
往年のフル Flash のような全編 SVG の Web サイトを作ってみた話 未読

往年のフル Flash のような全編 SVG の Web サイトを作ってみた話

お盆休みを使って誰の役にもたたない自己満足の全編 SVG の Web サイトを作ってみた やー楽しかったw 昔からやりたかったんですよ🤭 ばうあーらぼ lab.girigiribauer.com まずは概要だけ。 作品集やアトリエではなく、あくまで 工夫のログ という位置付け 文章系は『ばうあーろぐ』に書き、コンテンツ系は『ばうあーらぼ』に書く 往年のフル Flash と同じく読み込んだら全面で展開してくれるやつ History API とかがあるので、ちゃんと詳細でも URL が割り振れる SVG だから iPhone でも動く! (動作確認済み) とりあえず5つ分公開したけど、順次工夫をメモりたかったら追加したい アクセスしたら index.html じゃなくて index.svg ですよ? イケてませんか?クールでしょ?w もやもや 頭の片隅にずっとやりたいなー、でもそんなことやってる暇ないよなー、というのがずっと残っていて、 着手しはじめちゃったらそれなりに時間もかかるので、忘れようと思っていたものが、 ある日突然大きくなってきてました。 よくよく考えてみると、実装コストも今下がってきてるし、工夫をメモることの意義も高まってきてるので、 お盆休みにやってしまえばいいのでは?という気持ちになってきて、とうとうやってしまいました。 (他にやるべきタスクは山ほどあったのに…) 各種トレードオフ SVG で Web サイトを提供するにあたって、色々なトレードオフがありました。 og:image が設定できない(OpenGraph 系のメタタグが設定できない) viewport がない SVG には 要素と 要素しかない 検索エンジンへの対応 だいぶマシになったとはいえ、ブラウザごとの差異が HTML より大きい 以下でそれぞれ詳しく。 og:image をはじめとした OpenGraph 系のメタタグもない HTML ではないのでメタタグがないんですよ。

1か月ぶり
プニモフ銀ランを買った!初めてプラモデル作ってみた!!! 未読

プニモフ銀ランを買った!初めてプラモデル作ってみた!!!

買ってしまった・・・ ぷにもふの存在を知り、ふにもふのことしか考えられなくなってしまったので買ってみました プニモフ 銀ランですね!!かわいいね!! これまでプラモデルを作ったことがなかったので作り切れるのか少し不安でしたが・・・しかしぷにもふのことしか考えられなくなってしまっているので気づいたら買っていました

4日ぶり
学生ロケットで動翼を作ってみた 未読

学生ロケットで動翼を作ってみた

学生ロケットC99Lの動翼によるロール制御に向けて、ESP32-S3を中心とするミッション基板、自作エンコーダ、電源冗長化、差圧計測などの設計・製作を紹介した記事。

2か月ぶり
AI Slopを防ぐために、"Ask Question"を自作して都度自分にレビューさせる管理職 as a Serviceをやってみた 未読

AI Slopを防ぐために、"Ask Question"を自作して都度自分にレビューさせる管理職 as a Serviceをやってみた

📝 この記事は、前作『私がやっているClaude Code(ターミナル)から、全てのデスクワークを完結させる活用法』 の続編にあたる。前作が母艦の全体像なら、こちらはその中の一点、「エージェントが人間に判断を仰ぐ瞬間」だけを取り出して設計する話だ。 続きをみる

4日ぶり
RAG用の手動チャンクUIのたたき台をJavaScriptで作ってみた 未読

RAG用の手動チャンクUIのたたき台をJavaScriptで作ってみた

RAG開発時、チャンクを自動的に行っているようではセマンティックな埋め込みベクトル検索などは厳しい。 そこで、チャンクサイズを手動で設定できる余地を作る。 今回はそのたたき台となるJSとHTMLを用意した。 HTML Chunk Editor Sample body{ font-family:sans-serif; margin:30px; } #editor{ border:1px solid #999; padding:15px; min-height:180px; white-space:pre-wrap; user-select:text; } チャンクエディタ試作 今日は良い天気です。 明日は雨です。 明後日は晴れです。

3週間ぶり
Strava MCPを使って自分のレースとトレーニングを分析させてみてトレーニング計画を作ってみた 未読

Strava MCPを使って自分のレースとトレーニングを分析させてみてトレーニング計画を作ってみた

Strava MCPをClaude Codeに繋いで、横浜往復ライドと2025年小松鉄人レースを分析させた記録です。3つの情報源を突き合わせたら、自分でも気づいていなかった「失点の所在」が数字で出てきました。

1週間ぶり
Claude Code Channels で Discord 用のボットを作ってみた 未読

Claude Code Channels で Discord 用のボットを作ってみた

Claude Code Channels を使って Discord 用のボットを作ってみた。 ボット自体は10年ほど前にも、Fire TV で Node を動かして Slack から使えるものを作って遊んでいた。 しかし、AI 時代のボットはちょっと違う。

2週間ぶり
8ポートRS232変換ボードを作ってみた 未読

8ポートRS232変換ボードを作ってみた

8ポートのRS232 to USBの変換ボードを作ってみたので紹介 仕様# 8ポートRS232(RJ45、いわゆるCisco配列) USB-C(USB2.0)搭載、バスパワー駆動 通信インジケーター付き 回路図# レポジトリ# 基板のKicadデータはGithubにて公開しています。 https://github.com/aki32585/CH348Q-8Port-RS232 経緯とか# 自作のシリアルコンソールサーバーを作るために開発したボードです。コンソールサーバーは中古相場でも比較的値段が高く、中々手を出すには難しい金額です。そこで自作のコンソールサーバーを作るべく基板を起こしました。 要件として、Win\Linuxで動作すること、USBバスパワーのみで動作すること、そして何より安価に製作出来ることを設定しました。また、コネクタにはネットワーク機器では一般的なRJ45を使用し、配列はCisco互換としています。 使用部品# USB-UART変換にはWCH製CH348Qを使用しています。ワンチップで8ポート分のUARTを喋る事ができ、周辺部品も水晶発振子とパスコン、抵抗のみです。なおかつ1個約6$と、比較的安価です。安定と信頼のFTDI製チップを使いたいとは思いますが、初回の試作ということもあり、中華チップを採用しました。WCHというとCH32Vマイコンシリーズが有名ですが、互換品マイコンや格安CiscoケーブルにCH340が使われている事も多く、比較的見かけるメーカーかもしれません。 UART-RS232にはSP3232という、MAX3232の互換品を8ポート分(2回路入 * 4)用意しました。 RJ45は8ポートがまとまったタイプをLCSCで見つけ使用しています。 その他電源や入出力周りですが、電源はUSB-Cから5Vをレギュレーターにて降圧、USBの保護としてUSBスイッチICであるCH217K、サージ対策のCH412Kを使用しました。こう見るとWCH製のチップが多いですね。 CH217Kは個人的にお気に入りのUSBスイッチICです。過電流保護やENピンによるON/OFFに対応しており、安価で秋月電子にも取り扱いがあるため入手性も良いです。 接続# メーカーよりドライバをインストールし、接続すると以下のように8ポート分のCOMデバイスとして認識されます。 今後など# 実際にデバイスと接続し、動作することは確認出来た為、自作シリアルコンソールサーバ完成に向けて、サーバー側ソフトウェアの構築へ入りたいと考えています。また、FTDIチップ版も作成したいですが、FTDIは4ポート対応が最大のようで、8ポート搭載するには別途USBハブICを載せる必要が発生するため、先になりそうです。 NT京都2026に出展しました# 3/21にNT京都へ仲間と参加しました。その中で私の製作した今回の変換ボードと「モバイルバッテリーのスリープを防止する基板」を出展しました。比較的ニッチな需要を満たす基板でしたが、興味を持っていただけ、大変感謝しております。当日ご覧いただいた皆様、ありがとうございました。

3年ぶり
Qiita:Claude Code と一緒にメモアプリを TDD で作ってみた 未読

Qiita:Claude Code と一緒にメモアプリを TDD で作ってみた

2026-5-17 Qiita:Claude Code と一緒にメモアプリを TDD で作ってみた Category: これは、私の初めてのClaude codeによるバイブコーディングの記録です。 日頃はテクニカルライターとしてマニュアルばかり書いていて、ほとんどプログラミングはしないのですが、Claude Codeなどによるバイブコーディングの評判があまりにも高く、ちょっと無視できなくなってきたので自分でも試してみることにしました。 Qiita >

2週間ぶり
🔖 スリップを作ってみたらいい感じ/戦争の影響 未読

🔖 スリップを作ってみたらいい感じ/戦争の影響

Claudeに書誌に挟むスリップを作るHTMLフォームを作ってもらった(印刷用CSS完備)ので、試しに印刷してみたらいい感じ。A4用紙から8枚取れる。技術書ライブラリーで技術系同人誌の委託販売をテスト的にやってみるのだ。イラン情勢が好転する兆しもなく、カルビーがポテトチップスなどの包装の印刷を白黒にすることを取引先に通知したとのこと。なるほど、インクの調達が…

1日ぶり
Bluesky カスタムフィード「ハッピーアイスクリーム」を作ってみた🍨 未読

Bluesky カスタムフィード「ハッピーアイスクリーム」を作ってみた🍨

はじめに Bluesky にて「ハッピーアイスクリーム」というカスタムフィードを公開しました。 同じ1秒の間に、同じ内容を、異なる複数のユーザーが投稿した偶然の一致を集めています。 ハッピーアイスクリーム ハッピーアイスクリームとは 同名のゲームが小学生の頃に流行っていたのを思い出したので作ってみました。 Google 検索のサジェストによるともう死語になってるみたいですね。 ゲームのルールは、2人が同時に「ハッピーアイスクリーム!」と言えたらアイスを奢ってもらえる、というものです。 赤の他人が偶然まったく同じ言葉を同じタイミングで呟いている、という状況がそれに近いと感じて着想しました。 フィードの抽出条件 日本語の投稿(langs フィールドに ja が含まれるもの) 同じ1秒以内に投稿されたもの テキストが完全一致(3文字以上) 異なる2人以上のユーザーによる投稿 他の投稿への返信は除外 技術的な話 Bluesky カスタムフィードの仕組み Bluesky では、AT Protocol という仕様に基づいて、誰でも自由にカスタムフィードを公開できます。 カスタムフィードを作るには、大きく2つのパーツを実装します。 インデクサー(firehose consumer) Bluesky が公式に提供しているリアルタイムストリームに接続し、全世界の投稿を受信します。 受信した投稿の中から条件に一致したものをデータベースに保存します。 フィードジェネレーター Bluesky ユーザーがカスタムフィードを開いたとき、Bluesky のサーバーからリクエストが届きます。 そのリクエストに対して、保存しておいた投稿の識別子(AT-URI)のリストを返すだけです。 ポイントは、フィードジェネレーターが返すのは投稿の中身ではなく識別子だけ、という点です。 投稿のテキストや画像は Bluesky 側が AT-URI をもとに取得するため、フィードジェネレーターは「どの投稿を並べるか」だけを決めればよい設計になっています。 インデクサー:投稿の受信と保存 インデクサー:投稿の受信と保存 フィードジェネレーター:フィードの返却 フィードジェネレーターの登録 フィードジェネレーターを Bluesky 上のフィードとして公開するには、自分の Bluesky アカウントに app.bsky.feed.generator というレコードを書き込む必要があります。 このレコードに「フィードジェネレーターサーバーの URL」と「フィード名」を登録することで、Bluesky アプリ上にフィードが表示されるようになります。 フィードジェネレーターサーバー側は以下の3つのエンドポイントを実装しています。 エンドポイント 役割 GET /xrpc/app.bsky.feed.getFeedSkeleton 投稿の AT-URI リストを返す(メイン) GET /xrpc/app.bsky.feed.describeFeedGenerator フィードのメタ情報を返す GET /.well-known/did.json このサーバーが正規のフィードジェネレーターであることを証明するドキュメント 3つ目の did.json は DID(Decentralized Identifier) という AT Protocol の識別子の仕組みに関わるものです。 did:web:feed.example.com のような形式で、特定のドメインがこのフィードの運営者であることを示します。

3週間ぶり
PHPでライブ同時翻訳ツールを作ってみた 未読

PHPでライブ同時翻訳ツールを作ってみた

SDL3のラッパーを作った理由は、もともとコレがやりたかったためです。PHPカンファレンス小田原で同時翻訳システムが動いてて、「すげー、俺も作ってみて〜」ってなったのが発端です。

1日ぶり