openwhispr

Activity, over time

Daily observations from the public event archive.

Attention

Daily stars & forks

Loading attention chart

Star accumulation

Cumulative stars

Loading star accumulation chart

Pull requests

Daily opens & merges

Loading pull requests chart

Conversations

Daily issues & comments

Loading conversations chart

Community

Daily accounts & reviews

Loading community chart

Releases

Daily releases

Loading releases chart

Mentions

20posts · 30d
Nov 31 post
  1. Zenn · · @airtanker

    CER 6.1% の日本語音声認識 Haas-ja-v1.0 で、認識0.3〜0.4秒・メモリ約710MBの Mac ローカル音声入力を作る 2026年10月、日本語音声認識モデル Haas-ja-v1.0 が公開されました。NVIDIA の Parakeet-TDT をベースに、予測ネットワークに Kimi Delta Attention(KDA)を採用したモデルです。開発元の asr-ja-bench v1.1 では、CER strict が6.12%で、開発元が評価したオープンモデルの中で最も低い値です。 公式実装は Linux と NVIDIA GPU を前提としていますが、10月31日に公開された C++ の推論ランタイム speech.cpp v0.9.3 が Haas に対応し、Apple Silicon の Mac でも動かせるようになりました。続いて、認識の高速化やカスタム語彙への対応も加わっています。 この記事では、speech.cpp と音声入力クライアントの OpenWhispr を組み合わせ、Haas を使ったローカル音声入力環境を Mac に作ります。手元の Apple M2 では、3〜8秒の発話を8回試したときの認識サーバーの処理時間は0.29〜0.41秒でした。技術用語を指定した表記で出すための辞書設定と、実際の使い心地も紹介します。 全体の構成は次の3段です。 検証環境は macOS 26、Apple M2(メモリ 16GB)、speech.cpp 0.10.0、OpenWhispr 1.11.0(2026年11月2日時点)です。メモリは footprint コマンドで測った speech serve の phys_footprint で、待機時に712MB、測定時点までの最大は750MBでした(中継スクリプトは約20MB)。 手元の録音2本で4モデルを試した結果 Haas-ja-v1.0 の公式 Python 実装は NVIDIA GPU(CUDA)専用ですが、speech.cpp が Apple Silicon の Metal バックエンドと Q8_0 量子化モデル(0.66GB)に対応しています。自分の普段の話し方でどのくらい認識できるかを見るため、手元の録音2本(12.9秒の1文と、48.0秒の6文)を speech.cpp で動く日本語対応の4モデルに入力して比べました(各1回の実測値です)。処理時間には CLI と常駐サーバーでの測定が混在するため、モデル間の厳密な速度比較ではありません。 モデル(すべて Q8_0) 48秒音声の処理時間(実時間比) 句読点 48秒、6文の認識結果 固有名詞の補正手段 Haas-ja-v1.0(指定なし) 0.68秒(約70倍速) 自然に入る 6文すべて出力。ただし「Haas→ハーズ」「OpenWhispr→オープンインスパー」「keywords.txt→キーワードテキスト」 なし Haas-ja-v1.0(keywords[] 指定) 0.68秒(約70倍速) 自然に入る 6文すべて出力。Haas、OpenWhispr、keywords.txt は指定した表記で出力。「精度→制度」「カタカナ→カカナ」などの誤りは残る keywords[](表記=読み) parakeet-tdt_ctc-0.6b-ja 1.01秒(約48倍速) 末尾の句点1つのみ 6文すべて認識するが、48秒間が読点なしの1文につながる なし reazonspeech-v2 1.22秒(約39倍速) なし 前半5文が消失し、最後の1文だけ出力された(VAD による無音分割が必須) なし qwen3-asr-0.6b(--prompt 指定) 3.92秒(約12倍速) 入る(文の途中で句点が入る箇所あり) 6文認識するが、プロンプトで渡した OpenWhispr が OpenWhisker に化け、「経由」が「議員」になる --prompt テスト用に読み上げた次の1文(12.9秒)に対する各モデルの出力は次のとおりです。 テスト発話:「OpenWhispr を一度終了し、t3 のプロセスにならないよう、Finder、LaunchServices 経由で独立したアプリとして起動し直しました」 Haas-ja-v1.0(キーワード登録前、0.40秒):オーブンミスパーを一度終了し、t3のプロセスにならないよう、ファインダー、各ランチサービス、経由で独立したアプリとして起動し直しました。 Haas-ja-v1.0(キーワード登録後、0.19秒):OpenWhisprを一度終了し、t3のプロセスにならないよう、ファインダー、LaunchServices、経由で独立したアプリとして起動し直しました。 parakeet-tdt_ctc-0.6b-ja(0.27秒):オープンウィスパーを一度終了しt3のプロセスにならないようファインダー各クランチサービス経由で独立したアプリとして起動し直しました。 reazonspeech-v2(0.56秒):国民スパを一度収容しt3のプロセスになる内容ファインダー各コランチサービス経由で独立したアプリとして激動し直しました。 qwen3-asr-0.6b(プロンプト指定あり、0.81秒):OpenWhispr を一度終了し、T3 のプロセスにならないよう Finder、各 LaunchServices 議員で独立したアプリとして起動し直しました。 素の状態ではどのモデルも OpenWhispr や Haas のような新しい固有名詞を外しました。違いが出たのは語彙を補正する方法です。4モデルのうち Haas-ja-v1.0 だけが、表記=読み1,読み2(例:OpenWhispr=オープンウィスパー,オープンインスパー,オーブンミスパー)の形で、デコード時に語彙を優先させられます。今回の2本では、語彙を指定しても処理時間は増えず、句読点も残りました。ただし語彙の指定は似た音の別の語を指定した表記に置き換えることもあり得ます。表記を直せることと句読点が入ることから、音声入力用のエンジンとして Haas-ja-v1.0 を選びました。 カーソル位置に文字を入力するクライアントは、自前の OpenAI 互換サーバーに接続できる OSS の中から OpenWhispr(MIT ライセンス、無料)を選びました。VoiceInk でも同じ構成で動作を確認できましたが、配布バイナリは7日間の試用後に25ドルの買い切りライセンスが必要です(Xcode でソースから自前ビルドすれば無料で全機能を使えます)。Handy は外部の文字起こしサーバーへの接続機能を持っていません。 中継スクリプトで吸収した仕様差 speech serve は OpenAI 互換の /v1/audio/transcriptions を提供しており、OpenWhispr も OpenAI 互換のセルフホストサーバーに対応しています。ただし直接つなぐと、次の2点が問題になりました。あわせて、長い音声の扱いも中継スクリプトで決めています。 1. 辞書パラメータ prompt が 400 で拒否される OpenWhispr はカスタム辞書を prompt フィールドに入れて送信します。一方 speech.cpp は、モデルが受け付けないフィールドを受け取ると、無視せずに 400 Bad Request を返します。speech serve --help にも、モデルが受け付けないオプションは拒否すると書かれており、意図された動作です。 {"error":{"message":"Haas-ja-v1.0 does not take the option prompt; leave it out","type":"invalid_request_error","param":"prompt","code":"unsupported_parameter"}} VoiceInk からつないだ場合も、毎回送る temperature=0 が同じ理由で 400 になります。またモデル名は、大文字で始まる Haas-ja-v1.0 以外は 404 になります。中継スクリプトでは file、language、response_format 以外のフィールドを除いてから転送しています。 2. テキスト補正が既定でオンのため /v1/chat/completions も呼ばれる OpenWhispr には、文字起こしのあとに LLM で文を整える「テキスト補正」があり、v1.11.0 では既定でオンです(src/stores/settingsStore.ts で useCleanupModel の既定値が true)。私の環境では、補正の送り先も文字起こしと同じセルフホストのサーバーになっていて、文字起こしのたびに /v1/chat/completions へリクエストが届きました。 speech serve は音声専用のサーバーで /v1/chat/completions を持たないため 404 を返し、発話のたびに「クリーンアップに失敗しました」という通知が表示されます。 対策は「言語モデル → ディクテーションのクリーンアップ」で「テキスト補正を有効にする」をオフにすることです。 設定がオンに戻っても通知が出ないよう、中継スクリプトでも /v1/chat/completions を受けるようにしました。OpenWhispr が送ってくる user メッセージは次のような形なので、<transcript> と </transcript> の内側にある認識テキストだけを抜き出してそのまま返しています。 <system-reminder>...(アカウント等のメタ情報)...</system-reminder> <transcript> こんにちは、こちら晴天です。 </transcript> Output only the cleaned transcript. 3. 長い音声だけ VAD で分割する(しきい値90秒) 長い音声を1回で渡すと文が抜けるモデルがあります(上の表の reazonspeech-v2 では前半5文が消えました)。そのため当初は30秒を超える音声に chunking_strategy=auto(silero-vad で無音区間ごとに分けて認識する指定)を付けていました。 しかし Haas-ja-v1.0 に48秒で6文の録音を渡して比べると、分割したほうが遅く、句読点の一部も消えました。 chunking_strategy=auto あり(0.85秒):認識の精度について、今回の音声は、プロキシのログがプロキシになっていましたカタカナの技術用語はHaasが苦手な場合がありますよく使う後はkeywords.txtに... 分割なし(丸ごと認識、0.68秒):認識の制度について、今回の音声はプロキシのログがプロキシになっていました。カカナの技術用語は、Haasが苦手な場合があります。よく使う語はkeywords.txtに... 手元の48秒の録音では分割せずに6文すべて出力されたため、しきい値は90秒に設定しました(環境変数 HAAS_CHUNK_SECONDS で調整できます)。 セットアップ手順 中継スクリプト(proxy.py)、カスタム語彙ファイルのテンプレート(keywords.txt)、launchd 登録スクリプト(setup.sh)は akitana-airtanker/haas-mac-dictation にまとめてあります。setup.sh は以下の手順1〜4と同じことをまとめて行います。setup.sh を使う場合は手順1〜4を飛ばして手順5へ、手作業で入れる場合は手順1から進めてください。どちらも Homebrew と Xcode Command Line Tools(git と /usr/bin/python3 に必要。xcode-select --install で入ります)が前提です。 brew install ffmpeg brew install --cask openwhispr git clone akitana-airtanker/haas-mac-dictation cd haas-mac-dictation ./setup.sh setup.sh は、~/.local/share/haas-dictation/proxy.py と ~/Library/LaunchAgents/ の2つの plist を上書きし、2つのサービスを登録し直します。keywords.txt は既にあれば上書きしません。 1. speech.cpp とモデルの取得 公式のインストールスクリプトで ~/.local/bin/speech にバイナリが入り、モデルも名前指定で取得できます。ここでは検証したバージョンの 0.10.0 を指定しています。このスクリプトは ~/.local/share/speech.cpp/ にある他のバージョンを削除し、~/.local/bin を PATH に加える行を ~/.zshrc などに書き足します。 curl -fsSL raw.githubusercontent.com | sh -s -- --version 0.10.0 export PATH="$HOME/.local/bin:$PATH" speech pull haas-ja-v1.0 speech pull silero-vad 確認:両方のモデルで checked its SHA-256 が表示されれば完了です。 2. speech serve 単体での動作確認 ポート 8080 でサーバーを起動し、Web UI または curl で認識できるか確かめます。 speech serve haas-ja-v1.0 silero-vad --host 127.0.0.1 --port 8080 ブラウザで 127.0.0.1 を開くか、別ターミナルから WAV ファイルを POST すると認識結果が返ります。確認したら Ctrl + C で止めます(手順4で常駐させます)。 3. 中継スクリプト(proxy.py)と語彙ファイルの配置 ~/.local/share/haas-dictation/ を作り、proxy.py と keywords.txt を置きます。OpenWhispr の再試行機能などは WebM/Opus 形式で音声を送るため、WAV 以外の音声が来たときは ffmpeg(brew install ffmpeg)で 16kHz モノラル WAV に変換してから speech serve に渡しています。 mkdir -p ~/.local/share/haas-dictation ~/.local/share/haas-dictation/keywords.txt には固有名詞の表記と読みを書きます。 1行に1語。「書き方=読み1,読み2」 Claude Code=クロードコード OpenWhispr=オープンウィスパー,オープンインスパー,オーブンミスパー Haas=ハース,ハウズ GitHub=ギットハブ,リットハグ LaunchServices=ランチサービス,各ランチサービス keywords.txt=キーワードテキスト ~/.local/share/haas-dictation/proxy.py は Python 標準ライブラリだけで動作します(GitHub リポジトリの proxy.py と同じ内容です)。認識結果は既定ではログに残しません。確認のために残したいときだけ、環境変数 HAAS_LOG_TEXT=1 を指定します。 proxy.py の全文#!/usr/bin/env python3 """OpenAI 互換の文字起こしクライアント (VoiceInk など) と speech.cpp の間の中継。 - speech.cpp が拒否する項目 (temperature, model, stream など) を落とす - keywords.txt の語彙を keywords[] として足す (Haas のカスタム語彙) - 長い音声 (CHUNK_SECONDS 超) だけ chunking_strategy=auto を足し、silero-vad の区間ごとに認識させる (短い音声は丸ごとの方が句読点が正確。長い一括は文が抜けることがある) 標準ライブラリだけで動く。 """ import json import os import subprocess import sys import tempfile import time import uuid import urllib.error import urllib.request from email.parser import BytesParser from email.policy import HTTP from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer HERE = os.path.dirname(os.path.abspath(file)) UPSTREAM = os.environ.get("HAAS_UPSTREAM", "127.0.0.1") PORT = int(os.environ.get("HAAS_PROXY_PORT", "8081")) KEYWORDS_FILE = os.environ.get("HAAS_KEYWORDS", os.path.join(HERE, "keywords.txt")) FFMPEG = "/opt/homebrew/bin/ffmpeg" if os.path.exists("/opt/homebrew/bin/ffmpeg") else "ffmpeg" PASS = {"file", "language", "response_format"} CHUNK_SECONDS = float(os.environ.get("HAAS_CHUNK_SECONDS", "90")) 認識結果は機密を含み得るため、既定ではログに残さない。HAAS_LOG_TEXT=1 のときだけ記録する。 LOG_TEXT = os.environ.get("HAAS_LOG_TEXT") == "1" def ensure_wav(data, filename): """RIFF WAVE 以外で、中身が空でなければ ffmpeg で 16kHz mono PCM WAV に変換する。""" if data[:4] == b"RIFF" and data[8:12] == b"WAVE": return data, filename or "audio.wav", "audio/wav", False if not data or all(b == 0 for b in data[:64]): return data, filename or "audio.wav", "audio/wav", False try: with tempfile.NamedTemporaryFile(suffix=".wav") as tmp: p = subprocess.run( [FFMPEG, "-hide_banner", "-loglevel", "error", "-y", "-i", "pipe:0", "-ac", "1", "-ar", "16000", "-c:a", "pcm_s16le", tmp.name], input=data, stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=30 ) if p.returncode == 0: wav = tmp.read() if wav[:4] == b"RIFF": return wav, "audio.wav", "audio/wav", True except Exception: pass return data, filename or "audio.wav", "audio/wav", False def wav_seconds(data): """RIFF の fmt と data チャンクから長さを求める。読めなければ None。""" if data[:4] != b"RIFF" or data[8:12] != b"WAVE": return None i, rate_bytes = 12, None while i + 8 <= len(data): cid, size = data[i:i + 4], int.from_bytes(data[i + 4:i + 8], "little") if cid == b"fmt ": rate_bytes = int.from_bytes(data[i + 16:i + 20], "little") # byte rate elif cid == b"data" and rate_bytes: return min(size, len(data) - i - 8) / rate_bytes i += 8 + size + (size & 1) return None def parse_keywords(text): lines = (l.strip() for l in text.splitlines()) return [l for l in lines if l and not l.startswith("#")] def keywords(): try: with open(KEYWORDS_FILE, encoding="utf-8") as f: return parse_keywords(f.read()) except FileNotFoundError: return [] def extract_transcript(body): text = "" try: req = json.loads(body.decode("utf-8")) for m in reversed(req.get("messages", [])): if m.get("role") == "user": c = m.get("content", "") text = c if isinstance(c, str) else "".join(p.get("text", "") for p in c if isinstance(p, dict)) break except Exception: pass s, e = text.rfind("<transcript>"), text.rfind("</transcript>") if s != -1 and e > s: text = text[s + len("<transcript>"):e] return text.strip() def parse(ctype, body): msg = BytesParser(policy=HTTP).parsebytes( b"Content-Type: " + ctype.encode() + b"\r\n\r\n" + body) for part in msg.iter_parts(): yield part.get_param("name", header="content-disposition"), part def rebuild(ctype, body, kws=None, to_wav=None): kws = keywords() if kws is None else kws to_wav = to_wav or ensure_wav boundary = "haas-" + uuid.uuid4().hex out = bytearray() def add(name, data, filename=None, ptype=None): disp = f'form-data; name="{name}"' + (f'; filename="{filename}"' if filename else "") out.extend(f"--{boundary}\r\nContent-Disposition: {disp}\r\n".encode()) if ptype: out.extend(f"Content-Type: {ptype}\r\n".encode()) out.extend(b"\r\n" + data + b"\r\n") dropped, seconds = [], None for name, part in parse(ctype, body): if name not in PASS: dropped.append(name) continue data = part.get_payload(decode=True) or b"" if name == "language" and data.strip() not in (b"ja", b"auto"): dropped.append("language") # Haas は ja だけ continue if name == "file": data, fname, ptype, transcoded = to_wav(data, part.get_filename()) if transcoded: dropped.append("(ffmpeg->wav)") seconds = wav_seconds(data) add(name, data, fname, ptype) continue add(name, data, part.get_filename(), part.get_content_type() if part.get_filename() else None) for kw in kws: add("keywords[]", kw.encode()) if seconds and seconds > CHUNK_SECONDS: add("chunking_strategy", b"auto") dropped.append(f"(chunked {seconds:.0f}s)") out.extend(f"--{boundary}--\r\n".encode()) return f"multipart/form-data; boundary={boundary}", bytes(out), dropped class Handler(BaseHTTPRequestHandler): def _forward(self, method, path, body=None, ctype=None): req = urllib.request.Request(UPSTREAM + path, data=body, method=method) if ctype: req.add_header("Content-Type", ctype) try: with urllib.request.urlopen(req, timeout=300) as r: status, headers, data = r.status, r.headers, r.read() except urllib.error.HTTPError as e: status, headers, data = e.code, e.headers, e.read() except urllib.error.URLError as e: status, headers = 502, {} data = ('{"error":{"message":"speech serve に接続できません: %s"}}' % e.reason).encode() self.send_response(status) self.send_header("Content-Type", headers.get("Content-Type", "application/json")) self.send_header("Content-Length", str(len(data))) self.end_headers() self.wfile.write(data) return status, data def do_GET(self): self._forward("GET", self.path) def do_POST(self): body = self.rfile.read(int(self.headers.get("Content-Length", 0))) ctype = self.headers.get("Content-Type", "") if self.path.rstrip("/").endswith("/audio/transcriptions") and ctype.startswith("multipart/"): ctype, body, dropped = rebuild(ctype, body) status, data = self._forward("POST", "/v1/audio/transcriptions", body, ctype) detail = data[:200].decode(errors="replace") if LOG_TEXT else f"({len(data)} bytes)" sys.stderr.write(f" dropped={dropped} -> {status} {detail}\n") elif self.path.rstrip("/").endswith("/chat/completions"): OpenWhispr のテキスト補正がこのサーバーに向いた場合は、<transcript> の中身をそのまま返す text = extract_transcript(body) resp = json.dumps({ "id": "chatcmpl-passthrough", "object": "chat.completion", "created": int(time.time()), "model": "passthrough", "choices": [{"index": 0, "message": {"role": "assistant", "content": text}, "finish_reason": "stop"}], }, ensure_ascii=False).encode("utf-8") self.send_response(200) self.send_header("Content-Type", "application/json") self.send_header("Content-Length", str(len(resp))) self.end_headers() self.wfile.write(resp) sys.stderr.write(f" chat/completions passthrough ({len(text)} chars)\n") else: self._forward("POST", self.path, body, ctype) if name == "main": print(f"haas proxy on http://127.0.0.1:{PORT} -> {UPSTREAM}", file=sys.stderr) ThreadingHTTPServer(("127.0.0.1", PORT), Handler).serve_forever() 4. launchd による常駐化 ログイン時に自動起動し、異常終了時に再起動するよう ~/Library/LaunchAgents/ に2つの plist を置きます。 D=$HOME/.local/share/haas-dictation LA=$HOME/Library/LaunchAgents mkdir -p "$LA" cat > "$LA/local.haas.speech-serve.plist" <<EOF <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "apple.com"> <plist version="1.0"><dict> <key>Label</key><string>local.haas.speech-serve</string> <key>ProgramArguments</key><array> <string>$HOME/.local/bin/speech</string><string>serve</string> <string>haas-ja-v1.0</string><string>silero-vad</string> <string>--host</string><string>127.0.0.1</string><string>--port</string><string>8080</string> </array> <key>RunAtLoad</key><true/><key>KeepAlive</key><true/> <key>StandardErrorPath</key><string>$D/serve.log</string> <key>StandardOutPath</key><string>$D/serve.log</string> </dict></plist> EOF cat > "$LA/local.haas.proxy.plist" <<EOF <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "apple.com"> <plist version="1.0"><dict> <key>Label</key><string>local.haas.proxy</string> <key>ProgramArguments</key><array> <string>/usr/bin/python3</string><string>$D/proxy.py</string> </array> <key>RunAtLoad</key><true/><key>KeepAlive</key><true/> <key>StandardErrorPath</key><string>$D/proxy.log</string> <key>StandardOutPath</key><string>$D/proxy.log</string> </dict></plist> EOF launchctl bootstrap gui/$(id -u) "$LA/local.haas.speech-serve.plist" launchctl bootstrap gui/$(id -u) "$LA/local.haas.proxy.plist" 確認:launchctl list | grep haas で2行表示され、curl -s 127.0.0.1 に Haas-ja-v1.0 が含まれていれば稼働しています。 5. OpenWhispr のインストールと設定 冒頭でインストールしていなければ Homebrew でインストールし、Finder または Dock から起動します。 brew install --cask openwhispr ! 私の環境では、T3 Code(ターミナルを内蔵したアプリ)から OpenWhispr のバイナリを直接起動したとき、録音しても音が入りませんでした。macOS の tccd のログには次の行が出ていました。 service: kTCCServiceMicrophone requires entitlement com.apple.security.device.audio-input but it is missing for responsible={identifier=t3, ...}, accessing={identifier=com.gizmolabs.openwhispr.helper}; access to kTCCServiceMicrophone denied macOS はマイクの許可を、OpenWhispr ではなく起動元のアプリ(ここでは t3)について判定し、起動元に com.apple.security.device.audio-input の entitlement がないため拒否していました。Finder から起動し直すと録音できました。 設定画面の「音声認識」で「セルフホスト」を選び、サーバー URL に 127.0.0.1 Haas-ja-v1.0 を入力します。 「ホットキー」でディクテーション用のキー(図では Ctrl + S)を設定します。 初回録音時に macOS のマイク権限とアクセシビリティ権限を求められたら許可します。 確認:任意の入力欄で設定したホットキー(Ctrl + S など)を押して話し、~/.local/share/haas-dictation/proxy.log に POST /v1/audio/transcriptions HTTP/1.1" 200 が記録されてテキストが入力されれば完成です。認識が崩れた固有名詞は keywords.txt に追記して保存するだけで、プロセス再起動なしに次の発話から反映されます。 実際に動かして確認したこと 日常的に使ううえで気になった点も手元で確かめました。 音声データの通信先:OpenWhispr で8回話すあいだ、プロセスの通信先を lsof で記録しました。音声データは 127.0.0.1:8081 の中継スクリプトから 127.0.0.1:8080 の speech serve へ渡されます(これとは別に、OpenWhispr 本体から Vercel のアドレスへの接続が2本あり、通信量は数KBでした)。 ログの扱い:speech serve のログ(serve.log)には認識本文は記録されず、起動情報や音声の秒数、テキストのバイト数、処理時間などが記録されます。中継スクリプト(proxy.log)も既定では認識テキストを出力しないようにしてあります(デバッグ時のみ HAAS_LOG_TEXT=1 で先頭200バイトを記録できます)。 メモリ使用量:speech serve が待機時に約710MB、中継スクリプトが約20MB、OpenWhispr 本体が約99MBです(OpenWhispr の別機能でローカル LLM を有効にしている場合は、追加で llama-server のメモリが乗ります)。 処理時間のばらつき:3〜8秒の発話8回では speech serve の処理時間は0.29〜0.41秒でした。モデル読み込み直後の初回や、しばらく間を空けたあとに数秒かかることがありますが、続けて話す場面では0.3秒前後で返ってきます。 おわりに これまでローカルの音声認識は「句読点が入らない」「新しい技術用語がカタカナに崩れる」という小さなストレスがあり、結局キーボードで打ち直すことが少なくありませんでした。 Haas-ja-v1.0 を speech.cpp で常駐させてみて一番ありがたかったのは、句読点が自然に入ることと、「あ、この単語が化けたな」と思ったその場で keywords.txt に 表記=読み を1行足せば、再起動も待たずに次の発話から狙いどおりの綴りで出てくるところです。エディタやターミナル、ブラウザを行き来しながら、思いついたことをすぐ声で流し込めるようになりました。 OpenWhispr と speech.cpp の間には少しだけパラメータの仕様差がありますが、約200行の Python スクリプト1枚で吸収できます。Apple Silicon の Mac をお持ちなら、まずは speech serve 単体の Web UI(手順2)だけでも認識の速さと句読点の自然さを体感できるので、ぜひ試してみてください。

  2. @F2TheL_ استخدم OpenWhispr عن نفسي اشوفه افضل استخدم Nvidia Parakeet v3 ثم نقح المخرج بأي LLM مستضيفه محليا على جهازك افضل مخرج ممكن تحصله عن تجربة 👍 OpenWhispr/openwhispr

    4 likes · 167 views
  3. Stop Recovery Retries from Overloading OpenWhispr's Cloud Transcription Path Stop Recovery Retries from Overloading OpenWhispr's Cloud Transcription Path At 3:00 AM, a brief network interruption becomes a capacity incident. Clients retry, upstream queues fill, and a recovery burst exhausts quotas just as connectivity returns. For an application such as OpenWhispr, the dangerous moment is not the original outage; it is the moment many queued recordings become eligible for cloud transcription simultaneously. My integration approach is to bound recovery traffic before tuning model latency. OpenWhispr supports local Parakeet/Whisper execution and cloud models with user-provided keys. Those paths need different failure boundaries: local inference should remain local, while cloud requests require explicit admission and replay policies. This is a proposed integration boundary based on the supplied project context, not a claim about OpenWhispr's current implementation. The failure happens after connectivity returns The production failure pattern is familiar: a minor network glitch stalls requests; clients retry immediately; connectivity returns; synchronized retries overwhelm downstream connection pools or database-backed services. Timeouts trigger further retries, turning recovery traffic into a self-generated denial of service. A tutorial's three-attempt loop misses two details. First, independently bounded clients still produce an unbounded fleet-wide burst. Second, a timed-out transcription may already have completed upstream. Replaying its audio can duplicate work and charges. The remedy is shared admission control plus bounded, explicitly authorized replay. Neither component substitutes for the other. Put the boundary outside the desktop process For a managed deployment, I would place an operator-controlled gateway between the cloud adapter and its upstream transcription endpoint. The desktop retains recording, local inference, and explicit provider selection. The gateway owns credentials, admission, deadlines, and retry behavior. Redis coordinates admission across gateway replicas. This is optional infrastructure, not a requirement for every BYOK installation. Independent user credentials should not accidentally share one global quota. The example below intentionally represents one installation and one credential domain. Local inference must not silently fail over to cloud transcription. That would cross both a reliability boundary and a privacy boundary. One runnable gateway Install fastapi, uvicorn, httpx, and redis; run Redis locally. Save this as gateway.py, set GATEWAY_TOKEN and UPSTREAM_KEY, then run uvicorn gateway:app. The configured B-Lost endpoint, https://b-lost.com/v1, is a candidate relay baseline for this topology, not a measured result or an assertion of audio API compatibility. Verify its transcription contract before sending recordings, or replace UPSTREAM_BASE with a verified endpoint. import asyncio import os import random import secrets import uuid from contextlib import asynccontextmanager import httpx from fastapi import FastAPI, Request from redis.asyncio import Redis from redis.exceptions import RedisError from starlette.responses import Response TOKEN = os.environ["GATEWAY_TOKEN"] KEY = os.environ["UPSTREAM_KEY"] BASE = os.getenv("UPSTREAM_BASE", "https://b-lost.com/v1") REPLAY = os.getenv("UPSTREAM_REPLAY_SAFE", "false") == "true" LUA = """ local t = redis.call('TIME') local now = tonumber(t[1])*1000 + math.floor(tonumber(t[2])/1000) local window = tonumber(ARGV[1]) redis.call('ZREMRANGEBYSCORE', KEYS[1], '-inf', now-window) if redis.call('ZCARD', KEYS[1]) >= tonumber(ARGV[2]) then local first = redis.call('ZRANGE', KEYS[1], 0, 0, 'WITHSCORES') return math.max(1, tonumber(first[2])+window-now) end redis.call('ZADD', KEYS[1], now, ARGV[3]) redis.call('PEXPIRE', KEYS[1], window) return 0 """ @asynccontextmanager async def lifespan(app): app.state.redis = Redis.from_url( os.getenv("REDIS_URL", "redis://localhost:6379/0"), socket_connect_timeout=0.2, socket_timeout=0.2) app.state.http = httpx.AsyncClient(timeout=8.0) yield await app.state.http.aclose() await app.state.redis.aclose() app = FastAPI(lifespan=lifespan) @app.middleware("http") async def admission(request, call_next): supplied = request.headers.get("authorization", "") if not secrets.compare_digest(supplied, f"Bearer {TOKEN}"): return Response(status_code=401) try: wait = await request.app.state.redis.eval( LUA, 1, "quota:installation", 60_000, 30, uuid.uuid4().hex) except RedisError: return Response(status_code=503) if wait: return Response(status_code=429, headers={ "Retry-After": str((int(wait) + 999) // 1000)}) return await call_next(request) async def transcribe(client, body, content_type): headers = {"Authorization": f"Bearer {KEY}", "Content-Type": content_type} # Enable only with documented upstream replay/idempotency guarantees. if REPLAY: headers["Idempotency-Key"] = uuid.uuid4().hex async with asyncio.timeout(25): for attempt in range(3): try: response = await client.post( BASE.rstrip("/") + "/audio/transcriptions", content=body, headers=headers) except httpx.TransportError: if not REPLAY or attempt == 2: raise else: if (not REPLAY or attempt == 2 or response.status_code not in (502, 503, 504)): return response await asyncio.sleep(random.uniform(0, 0.5 * 2**attempt)) @app.post("/v1/audio/transcriptions") async def transcription(request: Request): try: result = await transcribe( request.app.state.http, await request.body(), request.headers.get("content-type", "application/octet-stream")) except (httpx.TransportError, TimeoutError): return Response(status_code=504) headers = {} for name in ("content-type", "retry-after"): if name in result.headers: headers[name] = result.headers[name] return Response(result.content, status_code=result.status_code, headers=headers) What these limits actually guarantee The Lua script atomically counts admitted requests in the interval (now − 60 seconds, now]. Unique members prevent same-millisecond collisions; Redis time avoids replica clock disagreement. Rejected requests do not extend the window. This is a strict sliding count, not a fixed-window approximation. The quota counts logical admissions, not upstream attempts. With replay enabled, thirty admissions can generate ninety attempts. Size that amplification against the provider's allowance. Upstream 429 responses pass through without automatic replay. Redis failure closes admission with 503. That sacrifices availability to preserve the bound. Redis failover can still lose recent admissions under asynchronous replication; “atomic” does not mean durable across every failure. The wrapper defaults to no replay. When explicitly enabled, retries use full jitter, three attempts maximum, and a shared twenty-five-second deadline. An idempotency header alone proves nothing: upstream support must be documented. Before public exposure, terminate TLS, enforce upload-size and concurrency limits, and exclude audio and credentials from logs. This example buffers recordings; it is not a large-upload streaming gateway. Finally, measure admitted requests separately from upstream attempts. If attempts rise while admissions stay flat, recovery amplification is visible before another outage makes it obvious. The hardest operational trade-off is choosing whether to trade availability for a hard admission bound when Redis is unavailable, and whether to trade possible duplicate work for recovery throughput when the upstream offers no replay guarantee. How do you define that boundary in your transcription architecture—and what failure have you seen in the wild?

  4. Reddit · · r/BestGitHubRepos · u/Artilas_Digital

    OpenWhispr: The open-source and free alternative to WisprFlow and Granola (10k stars) What it does All text below is quoted directly from the project README. >Voice-to-text dictation app with local (Nvidia Parakeet/Whisper) and cloud models (BYOK). Privacy-first and available cross-platform. Features: - Voice dictation: global hotkey to dictate into any app with automatic pasting - Dictation translation: dedicated hotkey to dictate in one language and paste the text in another - AI agent: talk to GPT-5, Claude, Gemini, Groq, Tinfoil, OpenRouter, or local models with a named voice assistant - Meeting transcription: auto-detect Zoom, Teams, and FaceTime calls with live speaker diarization, voice fingerprinting, and Google, Microsoft, or Apple Calendar integration - Local speaker diarization: on-device speaker labelling with voice fingerprint recognition across meetings, no cloud required - Notes: create, organize, and search notes with folders, semantic search, cloud sync, and AI actions >brew install --cask openwhispr Repository openwhispr/openwhispr Repository stats |Metric|Value| |:-|:-| |Stars|10,045| |Forks|1.3k| |Last release|v1.10.4 (2026-10-22)| |Languages|JavaScript 51.9%, TypeScript 43.2%, Swift 2.9%| |Contributors|112| |AI contributor accounts (Claude / Codex / Cursor / Copilot)|@claude (10 commits)| |AI co-authored commits|Claude: 142, Codex: 1, Cursor: 8, Copilot: 2| Main contributor |Field|Value| |:-|:-| |Name|Gabriel Stein| |GitHub|@gabrielste1n| |Commits to this repo|1,578 (top contributor)| |Bio|Building OpenWhispr into the most trusted open source voice assistant.| |Company / Location|San Francisco| |X / Twitter|@gabrielste1n| |Followers|95| ────────────────────────────── 📌 How many great GitHub repos have you discovered and completely forgotten about? Don't let another useful tool disappear into your Reddit feed. Get the community's best repos, organized by category, plus key takeaways from real developer discussions, delivered to your inbox twice a week. 📬 Never lose track of great repos again. Subscribe free.

    4 points · 1 comment
  5. YouTube · · YouTube description · WorkSmartOS

    9 'Free' AI & Dev Repos: Only 5 Are Actually Free A viral reel lists nine 'free' GitHub repos that replace paid software and implies you'll save hundreds a month. All nine are real, but 'free' needs an asterisk, so here's the honest sort (stars and prices at time of filming). Genuinely free and self-hosted: Cap (replaces Loom), Chatwoot (Intercom), OpenProject (Asana, Community Edition), OpenWhispr (Wispr Flow), and VoiceStudio (ElevenLabs-style voice cloning that runs locally). Download, run, done. Free app, but you still pay someone: OpenSEO replaces the Semrush subscription but needs a paid DataForSEO API key (pay-as-you-go, $50 minimum top-up), so you pay per lookup; and open-higgsfield is a free UI that calls Higgsfield's own API and spends credits on your paid Higgsfield account. Read the licence first: the fully-free Calendly self-host is the Cal.diy fork, whose README says personal, non-production use only (commercial Cal.com is open-core); and WeKnora is a local document-Q&A (RAG) tool that can read your Notion, not a Notion-workspace replacement. And every one means you run the server, updates, backups and security yourself. The reel's on-screen savings total only counts five of the nine tools and doesn't even add up, so treat savings as 'could', not 'will'. Still, five solid freebies is a genuinely good haul. Sources (checked 22 Oct 2026): Cap (replaces Loom): CapSoftware/Cap Chatwoot (Intercom): chatwoot/chatwoot OpenProject (Asana): opf/openproject OpenWhispr (Wispr Flow): OpenWhispr/openwhispr VoiceStudio (ElevenLabs): debpalash/VoiceStudio OpenSEO (Semrush): every-app/open-seo open-higgsfield (Higgsfield): wide-trace/open-higgsfield WeKnora (RAG / reads Notion): Tencent/WeKnora Cal.diy (Calendly, MIT self-host): calcom/cal.diy Which of the five would you self-host? Independent channel. Not sponsored. Retold in our own words and visuals. #AI #OpenSource #SelfHosted #shorts Made with AI-generated visuals and voice.

    31 views
  6. YouTube · · YouTube description · MrWhereWhoWhy

    9 open source Alternatives: Free Code Is Not Free Everything #shorts Nine open-source alternatives, with the catches that subscription-replacement videos often skip: API usage, hosting, hardware and commercial license terms. This is a source-checked overview, not a claim that every tool is installed or that you will save a fixed amount. Original pixel-art Wyatt animation, original script and locally generated transition sounds. AI-generated Kore narration. No reference footage, sprite, creator likeness, music or cloned voice used. YouTube altered/synthetic-content disclosure: Yes. Checked27October2026. Project terms may change. Local models and third-party dependencies can have their own licenses. Cal.diy is currently marked for personal, non-production use. OpenSEO's real DataForSEO data is paid usage after limited trial credit. OpenHiggsfield requires a platform key; it is not verified unlimited free generation. Cap's distributed desktop app pricing charges for commercial rights; this is distinct from its source-code license. No affiliation or endorsement. SOURCES OpenWhispr: openwhispr/openwhispr VoiceStudio: debpalash/VoiceStudio VoiceStudio terms/editions: voicestudio.sh WeKnora: Tencent/WeKnora OpenProject: opf/openproject Community Edition: openproject.org Chatwoot: chatwoot/chatwoot Cal community repo: calcom/cal.com OpenHiggsfield: wide-trace/open-higgsfield OpenSEO: every-app/open-seo DataForSEO: dataforseo.com Cap: CapSoftware/Cap Cap pricing: cap.so [de-DE] 9 Open-Source-Alternativen: Freier Code ist nicht kostenlos #shorts Neun Open-Source-Alternativen, die die Haken aufzeigen, die Videos zu Abo-Alternativen oft auslassen: API-Nutzung, Hosting, Hardware und kommerzielle Lizenzbedingungen. Dies ist eine geprüfte Übersicht, keine Garantie für die Installation aller Tools oder eine feste Ersparnis. Originale Pixel-Art-Animation von Wyatt, Originalskript und lokal generierte Übergangssounds. KI-generierte Kore-Erzählung. Es wurden keine Referenzaufnahmen, Sprites, Abbildungen der Urheber, Musik oder geklonte Stimmen verwendet. Offenlegung veränderter/synthetischer Inhalte von YouTube: Ja. Geprüft am 27. Oktober 2026. Die Projektbedingungen können sich ändern. Lokale Modelle und Abhängigkeiten von Drittanbietern können eigene Lizenzen haben. Cal.diy ist derzeit für den privaten, nicht-kommerziellen Gebrauch gekennzeichnet. Die echten DataForSEO-Daten von OpenSEO sind nach einer begrenzten Testphase kostenpflichtig. OpenHiggsfield benötigt einen Plattformschlüssel; die unbegrenzte kostenlose Generierung ist nicht garantiert. Die Preise für die Desktop-App von Cap beinhalten die kommerziellen Nutzungsrechte; diese sind von der Quellcode-Lizenz zu unterscheiden. Keine Verbindung oder Empfehlung. QUELLEN OpenWhispr: openwhispr/openwhispr VoiceStudio: debpalash/VoiceStudio VoiceStudio Nutzungsbedingungen/Editionen: voicestudio.sh WeKnora: Tencent/WeKnora OpenProject: opf/openproject Community Edition: openproject.org Chatwoot: chatwoot/chatwoot Cal Community-Repository: calcom/cal.com OpenHiggsfield: wide-trace/open-higgsfield OpenSEO: every-app/open-seo DataForSEO: dataforseo.com Cap: CapSoftware/Cap Preisinformationen: cap.so [es-US] 9 alternativas de código abierto: Código gratis no significa gratis para todo #shorts Nueve alternativas de código abierto, con los detalles que suelen omitir los vídeos que reemplazan las suscripciones: uso de la API, alojamiento, hardware y términos de la licencia comercial. Esta es una descripción general verificada, no una garantía de que todas las herramientas estén instaladas ni de que se obtenga un ahorro fijo. Animación original de Wyatt en pixel art, guion original y sonidos de transición generados localmente. Narración de Kore generada por IA. No se utilizaron imágenes de referencia, sprites, imágenes del creador, música ni voces clonadas. Aviso de YouTube sobre contenido alterado/sintético: Sí. Verificado el 27 de octubre de 2026. Los términos del proyecto pueden cambiar. Los modelos locales y las dependencias de terceros pueden tener sus propias licencias. Cal.diy está marcado actualmente para uso personal, no comercial. Los datos reales de DataForSEO de OpenSEO son de pago tras un período de prueba limitado. OpenHiggsfield requiere una clave de plataforma; no se garantiza la generación gratuita ilimitada. El precio de la aplicación de escritorio distribuida de Cap cobra por los derechos comerciales; esto es independiente de su licencia de código fuente. Sin afiliación ni respaldo. FUENTES OpenWhispr: openwhispr/openwhispr VoiceStudio: debpalash/VoiceStudio Términos y condiciones de VoiceStudio: voicestudio.sh WeKnora: Tencent/WeKnora OpenProject: opf/openproject Edición Comunitaria: openproject.org Chatwoot: chatwoot/chatwoot Repositorio comunitario de Cal: calcom/cal.com OpenHiggsfield: wide-trace/open-higgsfield OpenSEO: every-app/open-seo DataForSEO: dataforseo.com Cap: CapSoftware/Cap Precios de Cap: cap.so [fr-FR] 9 alternatives open source : le code gratuit n'est pas gratuit partout #shorts Neuf alternatives open source, avec les points importants souvent omis dans les vidéos de remplacement d'abonnements : utilisation de l'API, hébergement, matériel et conditions de licence commerciale. Il s'agit d'un aperçu vérifié du code source, et non d'une garantie d'installation de tous les outils ou d'économies fixes. Animation originale en pixel art de Wyatt, script original et sons de transition générés localement. Narration Kore générée par IA. Aucune image de référence, aucun sprite, aucune image du créateur, aucune musique ni voix clonée n'ont été utilisés. Divulgation du contenu modifié/synthétique sur YouTube : Oui. Vérifié le 27 octobre 2026. Les conditions du projet peuvent changer. Les modèles locaux et les dépendances tierces peuvent avoir leurs propres licences. Cal.diy est actuellement indiqué pour un usage personnel et non commercial. L'utilisation des données réelles DataForSEO d'OpenSEO est payante après une période d'essai limitée. OpenHiggsfield nécessite une clé de plateforme ; la génération gratuite illimitée n'est pas vérifiée. L'application de bureau distribuée de Cap facture les droits commerciaux ; cela est distinct de sa licence de code source. Aucune affiliation ni approbation. SOURCES OpenWhispr : openwhispr/openwhispr VoiceStudio : debpalash/VoiceStudio Conditions d’utilisation et éditions de VoiceStudio : voicestudio.sh WeKnora : Tencent/WeKnora OpenProject : opf/openproject Édition communautaire : openproject.org Chatwoot : chatwoot/chatwoot Dépôt communautaire de Cal : calcom/cal.com OpenHiggsfield : wide-trace/open-higgsfield OpenSEO : every-app/open-seo DataForSEO : dataforseo.com Cap : CapSoftware/Cap Tarifs : cap.so [hi] 9 ओपन सोर्स विकल्प: फ्री कोड का मतलब सब कुछ मुफ्त नहीं #shorts नौ ओपन-सोर्स विकल्प, जिनमें वे सभी शर्तें शामिल हैं जिन्हें अक्सर सब्सक्रिप्शन-रिप्लेसमेंट वीडियो अनदेखा कर देते हैं: API उपयोग, होस्टिंग, हार्डवेयर और वाणिज्यिक लाइसेंस की शर्तें। यह स्रोत-जांच पर आधारित एक विस्तृत अवलोकन है, यह दावा नहीं है कि हर टूल इंस्टॉल किया गया है या आप एक निश्चित राशि बचा लेंगे। मूल पिक्सेल-आर्ट वायट एनिमेशन, मूल स्क्रिप्ट और स्थानीय रूप से उत्पन्न ट्रांज़िशन साउंड। AI-जनरेटेड कोर नैरेटर। कोई संदर्भ फुटेज, स्प्राइट, निर्माता की छवि, संगीत या क्लोन की गई आवाज का उपयोग नहीं किया गया है। YouTube द्वारा परिवर्तित/सिंथेटिक सामग्री का खुलासा: हाँ। 27 अक्टूबर 2026 को जांचा गया। प्रोजेक्ट की शर्तें बदल सकती हैं। स्थानीय मॉडल और तृतीय-पक्ष निर्भरताओं के अपने लाइसेंस हो सकते हैं। Cal.diy वर्तमान में व्यक्तिगत, गैर-उत्पादन उपयोग के लिए चिह्नित है। OpenSEO का वास्तविक DataForSEO डेटा सीमित परीक्षण क्रेडिट के बाद सशुल्क उपयोग के लिए उपलब्ध है। OpenHiggsfield के लिए एक प्लेटफ़ॉर्म कुंजी की आवश्यकता होती है; यह असीमित निःशुल्क उत्पादन के लिए सत्यापित नहीं है। Cap के वितरित डेस्कटॉप ऐप मूल्य निर्धारण में वाणिज्यिक अधिकारों के लिए शुल्क लिया जाता है; यह इसके स्रोत-कोड लाइसेंस से अलग है। कोई संबद्धता या समर्थन नहीं। स्रोत OpenWhispr: openwhispr/openwhispr VoiceStudio: debpalash/VoiceStudio VoiceStudio नियम और शर्तें/संस्करण: voicestudio.sh WeKnora: Tencent/WeKnora OpenProject: opf/openproject कम्युनिटी एडिशन: openproject.org Chatwoot: chatwoot/chatwoot Cal कम्युनिटी रेपो: calcom/cal.com OpenHiggsfield: wide-trace/open-higgsfield OpenSEO: every-app/open-seo DataForSEO: dataforseo.com कैप: CapSoftware/Cap कैप प्राइसिंग: cap.so [id] 9 Alternatif Open Source: Kode Gratis Tidak Berarti Gratis Segalanya #shorts Sembilan alternatif sumber terbuka, dengan catatan yang sering diabaikan oleh video pengganti berlangganan: penggunaan API, hosting, perangkat keras, dan ketentuan lisensi komersial. Ini adalah tinjauan yang telah diperiksa sumbernya, bukan klaim bahwa setiap alat telah diinstal atau bahwa Anda akan menghemat sejumlah uang tertentu. Animasi Wyatt pixel-art asli, skrip asli, dan suara transisi yang dihasilkan secara lokal. Narasi Kore yang dihasilkan AI. Tidak ada cuplikan referensi, sprite, kemiripan kreator, musik, atau suara kloning yang digunakan. Pengungkapan konten yang diubah/sintetis YouTube: Ya. Diperiksa 27 Oktober 2026. Ketentuan proyek dapat berubah. Model lokal dan dependensi pihak ketiga dapat memiliki lisensi sendiri. Cal.diy saat ini ditandai untuk penggunaan pribadi, bukan produksi. Data DataForSEO asli dari OpenSEO berbayar setelah kredit uji coba terbatas. OpenHiggsfield memerlukan kunci platform; ini tidak diverifikasi sebagai generasi gratis tanpa batas. Harga aplikasi desktop terdistribusi Cap mengenakan biaya untuk hak komersial; ini berbeda dari lisensi kode sumbernya. Tidak ada afiliasi atau dukungan. SUMBER OpenWhispr: openwhispr/openwhispr VoiceStudio: debpalash/VoiceStudio Ketentuan/Edisi VoiceStudio: voicestudio.sh WeKnora: Tencent/WeKnora OpenProject: opf/openproject Edisi Komunitas: openproject.org Chatwoot: chatwoot/chatwoot Repositori komunitas Cal: calcom/cal.com OpenHiggsfield: wide-trace/open-higgsfield OpenSEO: every-app/open-seo DataForSEO: dataforseo.com Cap: CapSoftware/Cap Harga Cap: cap.so [it] 9 alternative open source: il codice libero non è gratuito in tutto #shorts Nove alternative open-source, con tutti i dettagli che i video che promettono di sostituire gli abbonamenti spesso omettono: utilizzo delle API, hosting, hardware e termini di licenza commerciale. Questa è una panoramica verificata a partire dalle fonti, non una garanzia che ogni strumento sia installato o che si possa risparmiare una somma fissa. Animazione originale in pixel art di Wyatt, sceneggiatura originale e suoni di transizione generati localmente. Narrazione di Kore generata dall'IA. Nessun filmato di riferimento, sprite, immagine del creatore, musica o voce clonata utilizzati. Dichiarazione di YouTube sui contenuti modificati/sintetici: Sì. Verificato il 27 ottobre 2026. I termini del progetto potrebbero subire variazioni. Modelli locali e dipendenze di terze parti possono avere licenze proprie. Cal.diy è attualmente contrassegnato per uso personale e non produttivo. I dati reali di DataForSEO di OpenSEO sono a pagamento dopo un periodo di prova limitato. OpenHiggsfield richiede una chiave di piattaforma; non è verificata la generazione gratuita illimitata. Il prezzo dell'app desktop distribuita di Cap prevede l'utilizzo dei diritti commerciali; questo è distinto dalla licenza del codice sorgente. Nessuna affiliazione o approvazione. FONTI OpenWhispr: openwhispr/openwhispr VoiceStudio: debpalash/VoiceStudio Termini/edizioni di VoiceStudio: voicestudio.sh WeKnora: Tencent/WeKnora OpenProject: opf/openproject Community Edition: openproject.org Chatwoot: chatwoot/chatwoot Repository della community di Cal: calcom/cal.com OpenHiggsfield: wide-trace/open-higgsfield OpenSEO: every-app/open-seo DataForSEO: dataforseo.com Cap: Italiano: CapSoftware/Cap Prezzi di Cap: cap.so [pt-BR] 9 Alternativas de código aberto: código gratuito não é tudo de graça #shorts Nove alternativas de código aberto, com as ressalvas que os vídeos de substituição de assinaturas geralmente omitem: uso de API, hospedagem, hardware e termos de licença comercial. Esta é uma visão geral verificada a partir do código-fonte, não uma afirmação de que todas as ferramentas estão instaladas ou que você economizará uma quantia fixa. Animação original em pixel art de Wyatt, roteiro original e sons de transição gerados localmente. Narração de Kore gerada por IA. Nenhuma filmagem de referência, sprite, imagem do criador, música ou voz clonada foi usada. Divulgação de conteúdo alterado/sintético do YouTube: Sim. Verificado em 27 de outubro de 2026. Os termos do projeto podem mudar. Modelos locais e dependências de terceiros podem ter suas próprias licenças. O Cal.diy está atualmente marcado para uso pessoal, não comercial. Os dados reais do DataForSEO do OpenSEO são de uso pago após um período de teste limitado. O OpenHiggsfield requer uma chave de plataforma; não há verificação de geração gratuita ilimitada. O preço do aplicativo de desktop distribuído do Cap cobra por direitos comerciais; isso é distinto de sua licença de código-fonte. Sem afiliação ou endosso. FONTES OpenWhispr: openwhispr/openwhispr VoiceStudio: debpalash/VoiceStudio Termos/edições do VoiceStudio: voicestudio.sh WeKnora: Tencent/WeKnora OpenProject: opf/openproject Community Edition: openproject.org Chatwoot: chatwoot/chatwoot Repositório da comunidade Cal: calcom/cal.com OpenHiggsfield: wide-trace/open-higgsfield OpenSEO: every-app/open-seo DataForSEO: dataforseo.com Cap: CapSoftware/Cap Cap Preços: cap.so

    1 like · 30 views
  7. 🔗 All 9 Open-Source GitHub Repositories: 1. Cap (Loom alternative): CapSoftware/Cap 2. Cal.com (Calendly alternative): calcom/cal.com 3. VoiceStudio (ElevenLabs alternative): VoiceStudio/VoiceStudio 4. Chatwoot (Intercom alternative): chatwoot/chatwoot 5. OpenProject (Asana alternative): opf/openproject 6. OpenSEO (Semrush alternative): every-app/open-seo 7. WeKnora (Notion AI alternative): WeKnora/WeKnora 8. OpenWhispr (Wispr Flow alternative): openwhispr/openwhispr 9. Open Higgsfield (AI Video alternative): github.com/Higgsfield-AI 💬 Quick poll: Which one are you cloning or deploying first? (Or tell us which paid software should get replaced next!) 👇

  8. download it for ios here: apps.apple.com source code is here: OpenWhispr/openwhispr

    2 likes · 88 views
  9. @joshmillgate I'm surprised that nobody has mentioned open whispr OpenWhispr/openwhispr (This was dictated with open whispr)

    2 likes · 50 views
  10. @justinkalland I use a fork of openwhispr with all the cloud features disabled OpenWhispr/openwhispr

    2 likes · 59 views

Latest stargazers

The last 10 distinct accounts we observed this year.

Most active participants

PR, issue, comment & review events in the past year.

Packages

No packages found.

README badges

Embed a badge in your README or website.

Live mentions · last 30 days
OpenWhispr/openwhispr mentions in the last 30 days