Show HN: Strands エージェントを活用した AI パワーズビッグマウス・ビリーバス、BillAI Bass

2026/07/14 3:18

Show HN: Strands エージェントを活用した AI パワーズビッグマウス・ビリーバス、BillAI Bass

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

本テキストは、「BillAI Bass Builder Guide」を提示しており、Strands Agents を雙方向ストリーミング(BidiAgent)技術と組み合わせ、Raspberry Pi 5 および Amazon Bedrock を通じた Amazon Nova 2 Sonic と連携させることで、Big Mouth Billy Bass の実装をリアルタイム AI ボイスアシスタントへと変換します。元々は

billy-b-assistant
プロジェクトから再構築されており、このガイドによってユーザーは、ロボティクスまたは溶接の経験がない者であっても、リアルタイムオーディオストリームに直接動作を連動させた、頭部の左右回転、口パク同期、尻尾の振れ運動を含む機能を備えた動作可能な玩具を作成することができます。

このビルドには、約 240 ドルの総投資が必要であり、必要な部品には Raspberry Pi 5(8GB)、USB マイク、スピーカー、モータードライブ、および必要な電子機器が含まれます。主な設定ステップには、Nova モデルにおける雙方向ストリーミングのために AWS IAM パーミッションを設定すること、SD カードに Linux イメージをフラッシュすること、MX1508 ドライバ経由で Pi とモーター間の接続を溶接すること、オーディオコールバックおよびモーター制御を処理する「脳」ソフトウェアの組み立てが含まれます。

複雑な組立プロセスを簡素化するために、このガイドは段階的な実行、デバッグ、ハードウェア特定のために AI コーディングアシスタントの使用を推奨しています。動作した後には、魚の個性をカスタマイズし、ウェイクワード検出(例:"Hey Billy")を実装したり、systemd を通じた起動自動化を行ったり、AWS IoT Core X.509 証明書を用いてセキュリティを向上させるなどすることができます。その結果として、このプロジェクトは高度な技術的な前提条件なしにリアルタイム AI オーディオストリーミングおよびハードウェア統合の試行を行うための、アクセスしやすい低コストな教育プラットフォームとして機能します。

本文

BillAI Bass Builder ガイド:双方向ストリーミング機能付きの実装

Strands Agents の双方向ストリーミング機能と Amazon Nova 2 Sonic を搭載、ラズベリーパイ上で動作する「話せる魚」プロジェクトです。


🦈 プロジェクトの概要

  • コンセプト: ビッグマウス・ビリー・バスをリアルタイムの音声アシスタントに変換する。
  • 動作内容:
    • ユーザーが話しかけると、魚も応答します。
    • 頭を振り回し、口は自分の声に**リプシンク(唇の動き同期)**を行います。
    • 尾をふって強調表現を加えます。
  • 技術スタック:
    • ハードウェア:ラズベリーパイ 5 (Strands Agents の BidiAgent を実行)
    • AI モデル:Amazon Nova 2 Sonic (Amazon Bedrock上のリアルタイムオーディオ処理)
  • 初心者向け: 経験不要。溶接やロボティクス知識も不要です。
  • 基盤: 優れた
    billy-b-assistant
    プロジェクトを Strands 上で再構築。

📦 リポジトリの構成要素

ファイル名内容と役割
README.md
本ガイドです。上から順に作業してください。
billy.py
完成したスクリプト。話せる魚を起動します。
motors.py
モーターテスト用。配線検証のために必ず先に実行してください。
asoundrc.example
ALSA 構成ファイル。USB ミックとスピーカーをデフォルトに設定します。
requirements-frozen.txt
依存関係の固定版
pip install -r
で正確な環境を作成してください。
iot-identity/
オプション(セキュリティ向上用)。X.509 証明書認証の構成テンプレートなど。

🤝 AI アシスタントとの共作方法

このプロジェクトは AI コードアシスタントと共同作成することを強く推奨します。Claude Code などを使っている場合、以下の指示を AI に与えて進めてください。

指示例: "私はこれを作ろうとしています。一つずつステップ带我ってください。次のステップを与える前に、私が確認することを待ってください。"

🤝 AI による構築支援のメリット

AI は以下の点であなたのパートナーになります:

  • エラーの解決: 恐ろしい長さの Python Traceback でも、意味のある一行だけでエラーを特定してくれます。
  • 画像の確認: モーターや配線の写真を撮って送信できます(例:
    ~/Downloads/IMG_1234.jpg
    )。
  • わからないことは尋ねる: 「X について何も知りません」と返ってきたら、AI は後退して解説してくれます。
  • 事前確認: 溶接や切断など自信がないことを事前に聞いてくれます。

ガイドの隙間に出会った場合は AI に相談し、エラーメッセージがあれば乗り越えられます。


🛒 買い物リスト

アイテム用途参考価格
ビッグマウス・ビリー・バス魚本体(現在販売中の"Gemmy"バージョン)。モダン版の 2 モーター構成を前提。~$30
ラズベリーパイ 5, 8GB脳。4GB でも動作します。~$80
27W USB-C PD ポワーサプライ電源。スマホ充電器では不可(電力制限防止)。公式または RasTech GaN 推奨。~$15
ラズベリーパイ 5 アクティブクーラーヒートシンク&ファン。熱対策必須。~$10
MicroSD カード, 64GBPi のストレージ(Transcend など)。~$12
USB ミニスピーカービリーの声(例:HONKYOB)。~$15
USB ネッキングマイクビリーの耳(例:CGS-M1)。~$13
MX1508 デュアル H ブリッジモータードライバーPi がモーターを安全にドライブするインターフェース。予備も有用。~$9
Dupont ジャンパーワイヤーキット (120pcs)ドライバーボードと Pi を接続(実際は female-to-female 約 6 本使用)。~$7
ハンダ付けアイロンキット (60W)合計 10 の接合部を固定するために必要。~$20
フラットカッターワイヤーの切断と被覆剥離(例:KATA)。~$9
JST XH コネクタキットオプション。整理整頓には有用ですが必須ではない。~$9

⚠️ 別途必要なもの

  • PC: SD カードをフォーマット・イメージ焼き込み用(Mac/Windows/Linux)。企業向けラップトップは USB ストレージブロックされる場合があるためホームマシンの使用推奨
  • SD アダプター: microSD を PC に接続するために。
  • AWS アカウントと支払い手段: 個人利用用。IAM ユーザー作成時に必要。
  • 工具・消耗品: テープ(電気用またはスコッチ)、小型プラスドライバー、家庭 WiFi。

✅ プレリクワイス(ビルド当日の前)

1. AWS / Amazon Bedrock のセットアップ(最小権限)

💸 AWS アカウントがない場合の対応

  • 新規アカウントには通常 $100 クレジットが付与され、Bedrock はフリープランで使用可能です。
  • 注意点: 音声チャットは安価(分あたり約 1 セント)ですが、クォータ制限や有効期限に注意してください。

⚠️ フリープランの重要な注意点

  1. クォータ制限: 新しいアカウントは初期クォータが「0」の場合あり。
    ValidationException: Operation not allowed
    エラーが出たら AWS サポートへ要望を出すか有料プランへのアップグレードが必要です。
  2. 有効期限: アカウントは 6 ヶ月後に自動終了します。常駐用途の場合は有料プランへ早期アップグレードしてください。

🔐 セキュリティの重要性

  • AWS キーを Pi の平文ファイルとして保存します。
  • デモ用や貸し出し用として放置された場合、キーが漏洩すると他人があなたのアカウントでチャットしたり(悪用)するリスクがあります。

🛠️ セットアップ手順

ステップ 1:モデルアクセスの有効化

  1. AWS コンソールのリージョンを
    us-east-1
    (バージニア州北部) に設定。
  2. Amazon Bedrock → Model access で、**Nova 2 Sonic (
    amazon.nova-2-sonic-v1:0
    )**へのアクセス権限を取得。

ステップ 2:専用 IAM ユーザーの作成

  1. IAM > Users > Create user を実行(例:
    billy-bass
    )。
  2. 「ユーザーに AWS マネジメントコンソールのアクセスを提供」は選択しない。 (ロボットはログインしません)。

ステップ 3:Nova Sonic のみ許可するポリシーの作成

  1. ユーザー > Permissions > Create inline policy で JSON を設定。
  2. 貼り付ける内容:
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "BillyTalksToNovaSonicOnly",
          "Effect": "Allow",
          "Action": "bedrock:InvokeModelWithBidirectionalStream",
          "Resource": "arn:aws:bedrock:us-east-1::foundation-model/amazon.nova-2-sonic-v1:0"
        }
      ]
    }
    
  3. ポリシー名を
    billy-nova-sonic-only
    と付け、保存。

解説: これにより、S3 や EC2 などへのアクセスは禁止され、Nova Sonic のみの利用に制限されます。

ステップ 4:アクセスキーの作成

  1. Security credentials > Create access key を実行(Application running outside AWS)。
  2. Key ID と Secret Access Key は安全な場所にコピー。後で Pi にアップロードします。

ステップ 5:使用予算アラートの設定(推奨)

  • Billing > Budgets で $10/月の予算を作成し、メールアラートを設定します。漏洩防止のためです。

2. コードペースト時の注意点

SSH でコードを貼り付ける際によくあるエラーと対策:

エラータイプ原因修復方法
IndentationErrorペースト時に先行スペース(インデント)が余計に追加された
sed -i 's/^  //' yourfile.py
または再貼り付け
SyntaxErrorカンマの欠落や「smart quotes」への文字化け手動で修正、または文書と照合

✅ コード実行前のチェック習慣

Python ファイルを作成後、実行する前に以下のコマンドを必ず確認してください:

python -m py_compile yourfile.py && echo OK

OK
と表示されない場合はエラーあり。 エラーメッセージを AI に貼り付けて相談してください。


第 1 部 — 脳(ラズベリーパイの設定)

💡 戦略:先にソフトウェア構築

魚を開く前に、裸の Pi で音声アシスタントが動作するか確認することにより、デバッグを容易にします。

1.1 SD カードのフラッシュ

PC から Raspberry Pi Imager を使用してイメージを焼きます。

  • Device: Raspberry Pi 5
  • OS: Raspberry Pi OS Lite (64-bit) ⚠️
    • "Trixie"ベースがPython 3.13(Nova Sonic 推奨)。
    • 古い"Bookworm"は Python 3.11(非推奨)。
  • 理由: "Lite"版は GUI と Wayfire パネルがないため、
    ~/.asoundrc
    が破損する問題を回避できます。

OS カスタマイズ設定(イメージ焼込み時の選択肢)

  • ホスト名:
    billy
  • ユーザー名/パスワード: 覚えましょう
  • WiFi: ネットワーク名とパスワードを正確に入力
  • Services: SSH を有効化

1.2 最初の起動

  • MicroSD を Pi に挿入し、USB-C 電源を接続。
  • 2-3 分待機(OS リサイズと WiFi 接続完了)。
  • PC ターミナルで SSH 接続:
    ssh yourusername@billy.local

注意点:

  • 初回接続はリセットされる場合があります(設定完了のため)。1-2 分待ってから再接続。
  • REMOTE HOST IDENTIFICATION HAS CHANGED
    と出る場合は、SSH キーの再確認が必要ですが、通常は期待される動作です。

1.3 システムパッケージの更新

sudo apt update && sudo apt full-upgrade -y
sudo apt install -y python3-dev portaudio19-dev swig git
  • portaudio19-dev
    : マイク/スピーカーアクセス用
  • swig
    : GPIO ライブラリビルド用(後続エラー防止のため)

1.4 オーディオデバイスの設定

USB メックとスピーカーを接続後、以下のコマンドでデバイスを確認・設定します。

arecord -l    # マイクロフォンの一覧確認(カード名をメモ)
aplay -l      # スピーカーの一覧確認

⚠️ 重要な構成ルール

  • カード名を使用し、番号は使用しないでください(再起動でシャッフルするため)。
  • 設定ファイル (
    ~/.asoundrc
    ) を作成
    :
    pcm.!default {
        type asym
        playback.pcm "plug:hw:UACDemoV10"   # スピーカー名に書き換える
        capture.pcm "plug:hw:Device"        # マイック名に書き換える
    }
    ctl.!default {
        type hw
        card UACDemoV10                     # スピーカーのカード ID に変更
    }
    
  • 保存後、内容を確認(
    cat ~/.asoundrc
    )。
  • テスト録音:
    arecord -d 3 -f S16_LE -r 16000 test.wav && aplay test.wav
    • 16000 Hz は Nova Sonic のレートに合わせるため意図的。

1.5 Python 環境と Strands のインストール

python3 -m venv ~/billy/.venv
source ~/billy/.venv/bin/activate
pip install "strands-agents[bidi,bidi-io]" gpiozero lgpio
  • プロンプトに
    (.venv)
    が出るまで環境が有効であることを確認。
  • SSH で接続し直した場合は、毎回
    source
    コマンドを実行する必要があります。

1.6 AWS 資格情報の設定(平文ファイル化)

個人アカウントのキーは絶対に使わないでください。専用ユーザーのキーのみ使用します。環境変数より永続的なファイルを推奨します。

mkdir -p ~/.aws
nano ~/.aws/credentials

貼り付ける内容:

[default]
aws_access_key_id = YOUR_KEY_ID
aws_secret_access_key = YOUR_SECRET

[default]
region = us-east-1
  • ファイル権限を
    chmod 600
    に変更します。

1.7 最初の会話テスト 🎉

nano ~/billy/billy.py

(以下のコードをコピー&ペースト)

import asyncio
from strands.experimental.bidi import BidiAgent, BidiAudioIO
from strands.experimental.bidi.models import BidiNovaSonicModel

model = BidiNovaSonicModel(
    model_id="amazon.nova-2-sonic-v1:0",
    provider_config={
        "audio": {
            "input_rate": 16000,
            "output_rate": 16000,
            "voice": "matthew",
            "channels": 1,
            "format": "pcm",
        }
    },
)

agent = BidiAgent(
    model=model,
    system_prompt=(
        "You are Billy, a wisecracking animatronic singing bass mounted on a "
        "wooden plaque. Keep responses short, punchy, and conversational."
    ),
)

audio_io = BidiAudioIO()

asyncio.run(agent.run(inputs=[audio_io.input()], outputs=[audio_io.output()]))

実行:

python -m py_compile ~/billy/billy.py && echo OK
python ~/billy/billy.py

エラー対策:

  • AccessDeniedException
    : Bedrock 権限不足またはリージョン違い (
    us-east-1
    確認)。
  • no AWS credentials found
    : ステップ 1.6 の設定漏れ。
  • OSError: Invalid sample rate
    : ASoundRC の不備(カード名確認)。
  • ビリーが自分を中断する:マイクをスピーカーから離し、音量を下げる(物理配置の問題)。

第 2 部 — 身体(魚を開く)

2.1 サルジー 101(開腹準備)

  • バックプレートのネジをはずし、内部構造を確認。
  • モーター: 2 つのモーター搭載タイプを想定(口用 1 つ、回転用兼用 1 つ)。
  • 不要部品: オリジナルスピーカー、ピエゾブザー、コントロールボード、センサー類は外します。

2.2 切断とラベル付け

  • ワイヤーと元の配線を解放し、「MOUTH(口)」、「BODY(体/回転)」「BUTTON(ボタン)」 とテープで即座にラベル付け。
  • ボード自体は外しますが、ワイヤーの接続状態を明確にするためです。

第 3 部 — 脳と身体の接続

3.1 モータードライバーへの配線

Pi の GPIO ピンは直接モーター駆動できず、MX1508 ドライバーボードが必要です。

  • 2 チャンネル(A, B)あり。
  • 合計 10 箇所のハンダ接合が必要(溶接初心者でも 3 分の動画で完了します)。

3.2 ワイヤーの色マップと準備

以下に対応させるための配線図を厳守してください:

ワイヤー色ドライバー端子機能
Yellow+5V パワー
Blackグランド
WhiteIN1口モーター(方向 A)
GreyIN2口モーター(方向 B)
PurpleIN3体/回転モーター(A)
BlueIN4体/回転モーター(B)

3.3 溶接と品質管理

  1. ワイヤーをピン穴に通し、先を曲げて保持。
  2. ハンダで固定後、ワイヤー自体も熱して再固定します(完全な密閉)。
  3. テスト: 強く引っ張ったり揺らしたりして、ハンダが剥がれないか確認。

3.4 Pi への接続 (GPIO ピン割り当て)

Pi の GPIO ヘッダー上のピン番号:

ワイヤーピン番号場所
Yellow (+)pin 4エッジ行(2 箇所目)
Black (−)pin 6エッジ行(3 箇所目)
White (IN1)pin 9内側行(5 箇所目)
Grey (IN2)pin 11内側行(6 箇所目)
Blue (IN4)pin 13内側行(7 箇所目)
Purple (IN3)pin 15内側行(8 箇所目)

パターン確認:

Yellow-Black
が外側、
White-Grey-Blue-Purple
が内側。これで正しい。

3.5 アクティブクーラーの取り付け

  • サーマルパッドを外し、ヒートシンクとファンを Pi に固定。
  • ファンケーブルを FAN ソケットに接続。
  • vcgencmd measure_temp
    で温度確認(60°C 未満)。

3.6 モーターテスト

sudo shutdown now
# 起動後 SSH 接続し、venv を有効化
nano ~/billy/motors.py

(以下のコードをコピー&ペースト)

import time
from gpiozero import OutputDevice, PWMOutputDevice

mouth = PWMOutputDevice(17)
head = OutputDevice(22)
tail = OutputDevice(27)

print("m = mouth (1s)  h = head (1s)  t = tail  b = both  q = quit")

while True:
    cmd = input("> ").strip().lower()
    if cmd == "q": break
    elif cmd == "m":
        mouth.value = 1.0; time.sleep(1.0); mouth.value = 0
    elif cmd == "h":
        head.on(); time.sleep(1.0); head.off()
    elif cmd == "t":
        tail.on(); time.sleep(0.3); tail.off()
    elif cmd == "b":
        head.on(); time.sleep(0.3)
        for _ in range(4):
            mouth.value = 1.0; time.sleep(0.25); mouth.value = 0; time.sleep(0.15)
        time.sleep(0.2); head.off()

mouth.value = 0; head.off(); tail.off()
  • m
    ,
    h
    ,
    t
    を入力し、それぞれモーターが動くか確認。

トラブル対策:

  • 動作しないものがある: ワイヤーとピン番号の対応が違う(ソフトウェア側で番号を書き換える)。
  • 「頭」と「尾」が同じ物: 逆転している場合あり。両方動けば OK。
  • 口が弱く、尾が強すぎる: モーター特性の問題。Pi ヘッダー上の口モーター用ワイヤーを交換することで改善(強い方向に合わせる)。

第 4 部 — 融合(話せる魚)

リプシンクさせるためのコード:

  • 問題: Nova Sonic は速いため、データ到着時に口を開けても間に合わない。
  • 解決: オーディオ再生のコールバック内で音量レベルを検知し、それに応じて口を動かす。頭は「話している間」だけ上げ、尾は強調部分で振る。

🚀 完成スクリプト (
billy_final.py
)

import asyncio
import math
import time
from array import array
from gpiozero import OutputDevice, PWMOutputDevice
from strands.experimental.bidi import BidiAgent, BidiAudioIO
from strands.experimental.bidi.io.audio import _BidiAudioOutput
from strands.experimental.bidi.models import BidiNovaSonicModel
from strands.experimental.bidi.types.events import (
    BidiInterruptionEvent, BidiResponseCompleteEvent, BidiResponseStartEvent,
)

# モーター設定
mouth = PWMOutputDevice(17)
head = OutputDevice(22)
tail = OutputDevice(27)

# 調整パラメータ(必要に応じて変更)
MOUTH_OPEN = 0.04   # 口が開く音量閾値
EMPHASIS = 0.3      # 尾を振るための強調音量閾値
COOLDOWN = 1.2      # 強調振りの間隔
SILENCE = 1.5       # 話が終わってから頭が下がるまでの時間

class BillyBody(_BidiAudioOutput):
    """オーディオ再生と身体制御を統合したクラス"""
    def __init__(self, config):
        super().__init__(config)
        self.level = 0.0
        self.last_loud = 0.0
        self._tail_until = 0.0

    async def __call__(self, event):
        await super().__call__(event)
        # 会話イベントが発生したら尾部振りを開始(または終了)
        if isinstance(event, (BidiResponseStartEvent, BidiResponseCompleteEvent, BidiInterruptionEvent)):
            self.flap()

    def flap(self, seconds=0.4):
        self._tail_until = time.monotonic() + seconds

    @property
    def tail_now(self):
        return time.monotonic() < self._tail_until

    # オーディオボリュームからレベルを算出
    def _callback(self, in_data, frame_count, *args):
        data, flag = super()._callback(in_data, frame_count, *args)
        samples = array("h", data)
        if samples:
            self.level = math.sqrt(sum(s * s for s in samples) / len(samples)) / 32768.0
        else:
            self.level = 0.0
        return (data, flag)

# AI モデル設定
model = BidiNovaSonicModel(
    model_id="amazon.nova-2-sonic-v1:0",
    provider_config={
        "audio": {
            "input_rate": 16000,
            "output_rate": 16000,
            "voice": "matthew",
            "channels": 1,
            "format": "pcm",
        }
    },
)

agent = BidiAgent(
    model=model,
    system_prompt=(
        "You are Billy, a wisecracking animatronic singing bass on a wall plaque. RULE ONE: never say more than one short sentence at a time. 5 to 12 words, then stop and let the human talk. Fish puns are your love language - work them in shamelessly and often."
    ),
)

audio_io = BidiAudioIO()
body = BillyBody({})

# 本体的なループ処理
async def body_loop():
    last_flap = 0.0
    smoothed = 0.0
    while True:
        now = time.monotonic()
        
        # 口の開閉制御(音量に合わせて滑らかに)
        smoothed = 0.6 * smoothed + 0.4 * body.level
        if smoothed > MOUTH_OPEN:
            mouth.value = min(1.0, 0.5 + smoothed * 3)
            body.last_loud = now
        else:
            mouth.value = 0
        
        speaking = (now - body.last_loud) < SILENCE

        # 強調振り(音量ピーク時に)
        if body.level > EMPHASIS and now - last_flap > COOLDOWN:
            body.flap()
            last_flap = now

        # 頭と尾の制御
        if speaking:
            head.on()
            tail.off()
        elif body.tail_now:
            head.off()
            tail.on()
        else:
            head.off()
            tail.off()

        await asyncio.sleep(0.05)

async def main():
    print("Billy is ALIVE... (Ctrl+C to stop)")
    try:
        await asyncio.gather(
            agent.run(inputs=[audio_io.input()], outputs=[body]),
            body_loop(),
        )
    finally:
        mouth.value = 0
        head.off()
        tail.off()

asyncio.run(main())

実行:

python -m py_compile ~/billy/billy_final.py && echo OK
python ~/billy/billy_final.py

動作確認ポイント:

  • 応答時:頭が上がり、口が開いてリプシンクし、終了後 1.5 秒後に頭が下がる。
  • 強調時:尾をふって動きが激しくなる。
  • トラブル対応:
    • 「頭が上がらない」:
      SILENCE
      の値を下げる(判定時間短縮)。
    • 「尾が振らない」:
      EMPHASIS
      を下げる(閾値引き下げ)。
    • 「口が休むときも動く」:
      MOUTH_OPEN
      を上げる。
    • 「ビリーが長文になる」: システムプロンプトを厳格に。

🎨 発展とカスタマイズ

  • 人格変更: システムプロンプトを書き換えて、海賊や IT ズーマンなどに設定可能。
  • ツールの追加: Strands ドキュメントを見て、天気を聞くなどのツールを実装可能。
  • ボタン実装: GPIO ピン(黄色/緑ワイヤー)を接続し、起動/停止ボタン化。
  • ウェイクワード: Porcupine を使用し、「Hey Billy」で起動。

🔐 高度なセキュリティオプション:AWS IoT Core

現在の実装は平文アクセスキーを使用していますが、プロダクション環境ではX.509 証明書による認証が推奨されます(

iot-identity/
フォルダ参照)。

  • 利点: 盗難された Pi でも IAM クレデンシャルは期限切れとなり、再発行で即座に無効化可能。
  • セットアップ: CloudFormation テンプレートと IoT SETUP ワークフローを使用。

🧯 トラブルシューティング速查

症状原因修復方法
IndentationError
ペースト時のスペース追加
sed -i 's/^  //' file.py
billy.local
解決できない
WiFi パスワード错误或 mDNS 無効ルーターから IP 取得して SSH
AccessDeniedException
Bedrock モデルアクセス未許可AWS コンソールで権限追加
オディオ不発
~/.asoundrc
の欠落またはカード名错误
arecord -l
で名前確認後再設定
モーターが動かないGPIO ピン配線错误
motors.py
でピンの交換テスト
Pi が過熱アクティブクーラー未設置冷却システムをインストール

同じ日のほかのニュース

一覧に戻る →

2026/07/14 7:19

『アジア最浄の村』が日曜日観光客禁止に

## Japanese 翻訳: 2026 年 1 月以来、インディアのメガラヤ州にある約 600 人の居住者がいるモーリャン・オン(Mawlynnong)村では、「真の村の生活」を再建する目的として、日曜日の昼間の観光客に対する厳格な禁止措置を導入しています。1902 年に設立された教会が存在し、人口の推定 100% がクリスチャンであるこのコミュニティは、日曜日には単一の道路への入口を黒い金属製のゲートで閉鎖して、 uninterrupted な礼拝を保証しています。以前からほとんどの観光関連事業所が日曜日の営業停止を選択していました(レストランは 2 カ所のみ営業)ましたが、公式な禁止措置により、今では店舗や一日利用施設が完全に閉鎖されるようになっています。一泊予約を持つゲストはこの昼間の旅行禁止からの例外扱いで、ゲストハウスに滞在することができ、一方で地元のレストランや記念品販売店は引き続き閉鎖されています。住民は、村評議会の委員でもあるプリシウス・コングドプ(Precious Khongdup)を含むコミュニティの一致した支持を受けながら、この取り組みを文化のアイデンティティ、精神的なリズム、および 2003 年に「アジアで最も清潔な村」と命名されたり、2014 年にナレンドラ・モディ首相のクリーン・インディア・ミッションキャンペーンの際に全国的な注目を得たりした功績をもたらした規律を保持するために不可欠だと考えています。この決定は、観光客による妨害に対する具体的な懸念に対応しており、観光客が地面にプラスチック製の水ボトルを置き去りにするというバイラル化した事象などが挙げられ、これにより地元からは強い反発が生じていました。言語学の教授ヴィジャヤ・デブナス(Vijaya Debnath)を含む専門家は、このイニシアチブを称賛しており、清潔さを維持しつつ、村民の静かな一日の休息と祈りの必要性にも敬意を表していると評価しています。

2026/07/14 3:22

Xcode を起動することなく Mac および iOS アプリを開発して配送する方法

## Japanese Translation: 本テキストでは、Xcode を一度設定した後の開封を不要とする堅牢で完全にヘッドレスの iOS アプリケーションの作成・デプロイワークフローが概説されています。シェルスクリプトによるライフサイクル全体のアオマティゼーションを通じて、開発者は `xcodebuild` コマンドラインツールを用いてコードをコンパイルし、`notarytool` によってビルドを保護し、`devicectl` を用いて物理デバイスにアプリを直接インストールします。セキュリティは、証明書ベースのキーチェーンおよび外部パスワードマネージャーの活用により維持され、プライベートキーなどの機密情報はバージョン管理システムへの投入を完全に防ぎます。本システムは XcodeGen を用いてプロジェクトを管理し、煩雑なローカルフォルダではなくクリーンな YAML 設定ファイル(`.yml` ファイル)によってプロジェクトを制御し、アドホックテスト版と公式開発者 ID リリースを自動的に区別します。一度設定されたリリーススクリプトは、アーカイブ、署名、認証化、スタプリング、インストールを含む厳格なパイプラインを実行し、沈黙する失敗を防ぐために堅牢なエラー処理(`set -euo pipefail`)を採用します。このアプローチは、チームが手動のマウス操作または GUI ウィンドウなしに、実際に動作するソフトウェアを効率的にデプロイするために安全で再現可能な CI パイプラインを構築することを可能にします。 ## Text to translate: The text outlines a robust, fully headless workflow for creating and deploying iOS applications that eliminates the need to open Xcode after an initial setup. By automating the entire lifecycle through shell scripts, developers utilize command-line tools such as `xcodebuild` to compile code, `notarytool` to secure builds, and `devicectl` to install apps directly onto physical devices. Security is maintained by leveraging certificate-based keychains and external password managers, ensuring sensitive secrets like private keys never enter version control. The system employs XcodeGen to manage projects via clean YAML configurations (`.yml` files) rather than cluttered local folders, automatically distinguishing between ad-hoc testing versions and official Developer ID releases. Once configured, a release script executes a rigorous pipeline involving archiving, signing, notarizing, stapling, and installation, while using strict error handling (`set -euo pipefail`) to prevent silent failures. This approach empowers teams to establish secure, repeatable CI pipelines that deploy real software efficiently without any manual mouse interactions or GUI windows.

2026/07/14 1:06

Apple が発表した新たな音声分析 API「SpeechAnalyzer」のベンチマークテストで、Whisper とその前代モデルと比較

## Japanese Translation: Apple の新しい SpeechAnalyzer API は、次期 OS 26 の一部として提供されるもので、英語の読み上げ音声に対する優れたオンデバイス音声認識を実現しており、特定ベンチマークコンテキスト内では従来のツールや人気が高い Whisper モデル(Tiny, Base, Small)を大幅に上回っています。この優位性は、M2 Pro チップなどの Apple ハードウェアで行われた厳密なローカルベンチマークを通じて証明され、オーディオを外部サーバーにアップロードすることなく、高速な処理速度——Whisper Small の計算時間の約 1/3——を実現することが示されました。清潔な LibriSpeech テストデータに対しては、従来の SFSpeechRecognizer API に比べて単語誤りを約 4 倍削減し(2.12% WER から 9.02%)、ノイズのあるデータに対しても同様の劇的な改善が見られました。この研究では、Inscribe のプロダクションコードパスと同一のテストハルネスを用い、Whisper の測定値は OpenAI が公開した値と比較しましたが、Whisper の相対的な不正確さは、これらのベンチマーク(アクセントのある音声、遠距離音声、または複数話者シナリオを含まない)に限定されたもの임을 指摘しました。重要なのは、すべてのテストが完全にオンデバイスで行われたことであり、従来の SFSpeechRecognizer もローカルで使用される場合でもクラウド処理にデフォルトで切り替わるという点です。これらの結果に基づき、Inscribe は製品ロジックを更新し、対応言語(現在約 30 のロケール)では SpeechAnalyzer を優先し、未対応の言語のみを Whisper に切り替えました。さらに、研究チームは Inscribe が SpeechAnalyzer でオーディオファイルを取り扱う際に重大なバグを見出し、生テキストデータを検証のために公開ダウンロード可能とする措置を講じました。これは、Apple エコシステム内のプライバシー重視かつ高パフォーマンスなオンデバイス AI 機能において大きな飛躍を意味します。