Speak-Yの配信機能:チーム会議をメールとWebhookで通知する方法

Speak-Yのチームワークスペースにある 配信 タブは、録音がチャンネルに共有されたときに2つのことをします。登録したアドレスにメールを送り、指定したURLに署名付きのPOSTリクエストを送ります。どちらが運ぶのも同じ少数の事実です。誰が共有したか、録音の長さ、日時、そしてどの記録か。要約も文字起こしも、どちらにも入りません。

これは機能が欠けているわけではありません。チャンネルの内容はエンドツーエンド暗号化されているので、メールとWebhookを送るサーバーは本文を一度も見ていないのです。このガイドでは、両方の設定方法、受信トレイとエンドポイントに実際に届くもの、X-Speaky-Signature ヘッダーの検証方法、対象になるチャンネルを説明します。内容はすべて、2026年10月9日にアプリとサーバーで確認しました。

配信タブは何をするのか

チャンネルフィードの外にいる人やシステムに、新しい録音を知らせます。メンバーが会議をチャンネルに共有すると、サーバーは暗号化された記録を保存し、設定されていれば次の2つの宛先に通知します。

設定はアカウントではなく、1つのワークスペースに属します。ワークスペースごとに受信者とWebhookを持ちます。変更できるのはワークスペースのオーナーまたは管理者だけです。メンバーにはタブが読み取り専用で表示され、「Only an owner or admin can change integrations.」(オーナーまたは管理者だけが連携を変更できます)という注記が出ます。

録音がメンバーのMacからSpeak-Yのサーバーへ、そこから受信トレイとWebhookのエンドポイントへ進む流れ
Macは共有する前に録音を暗号化します。サーバーは録音があることを知らせられますが、転送できる読める中身は持っていません。

どうやって設定するのか

必要なのは、macOSアプリと、ワークスペースでのオーナーまたは管理者の権限です。

  1. ワークスペースのページを開く。 サイドバーのワークスペース名の横にある ⋯ をクリックし、Edit workspace を選びます。
  2. 配信タブに移る。 Overview、Members に続く3つ目のタブです。
  3. 「配信される内容」のカードを読む。 ワークスペースのチャンネルが一覧表示されるので、何かを保存する前に対象範囲を確かめられます。
  4. Webhook を入力する。 Endpoint URL にアドレスを貼り付け、Webhook secret (HMAC) に8文字以上のシークレットを入力します。シークレットが十分な長さになるまで、Save webhook ボタンは押せません。保存するとステータスが Saved になり、見出しに 設定済み バッジが付き、シークレット欄は空になります。アプリがシークレットを再び表示することはありません。
  5. Email delivery を入力する。 Recipients にアドレスをカンマ区切りで入力し、Save email delivery を押します。

どちらのブロックも、もう一方なしで動きます。あとでWebhookを変更するときは、URLとシークレットをもう一度入力してください。サーバーがシークレットを返さないため、欄にあらかじめ入力されることはありません。

Speak-Yのワークスペースの配信タブ。対象範囲のカード、Webhookブロック、Email deliveryブロックが並ぶ
1 — 配信の対象になるチャンネル。2 — Webhookのアドレスと署名用シークレット。3 — メールの受信者。

メールには具体的に何が届くのか

届くのは通知であって、ダイジェストではありません。件名は「Speak-Y に新しい会議」(音声入力が共有された場合は「Speak-Y に新しい音声入力」)で、本文は3行とボタン1つです。

メールの項目 例
作成者 録音を共有したメンバーの名前
長さ 42 分
日時 2026/10/09 14:05 UTC
ボタン Speak-Y で開く — その録音をmacOSアプリで開きます

ボタンの下に、メールははっきりこう書いています。「録音はエンドツーエンドで暗号化されているため、この通知にはメタデータのみが含まれます。」チャンネル名とワークスペース名もメールには入りません。これらも暗号化されていて、サーバーは知らないからです。

このメールをチームに約束する前に、知っておきたい点が2つあります。

Speak-Yの配信メールに入るもの:作成者、長さ、日時、アプリを開くボタン
事実3つとボタン1つ。要約も文字起こしも、チャンネル名さえも、暗号化されたチャンネルの中に残ります。

Webhookは何を送るのか

新しい録音1件につきPOSTが1回です。Content-Type: application/json、ヘッダー X-Speaky-Event: team_record.created、そして次のボディが付きます。

{
  "event": "team_record.created",
  "workspace_id": "5b0e7c1e-2f4d-4a57-9d0a-6f1b2c3d4e5f",
  "channel_id": "c1a2b3c4-d5e6-47f8-9a0b-1c2d3e4f5a6b",
  "record_id": "8F2C1D7A-3B4E-4C5D-9E6F-0A1B2C3D4E5F",
  "created_by": "0d9c8b7a-6e5f-4d3c-2b1a-0f9e8d7c6b5a",
  "meta": { "duration_s": 2520, "kind": "meeting" },
  "server_created_at": "2026-10-09T14:05:12+00:00",
  "protocol_version": 2,
  "sent_at": "2026-10-09T14:05:12.480113+00:00"
}

meta.kind は meeting か dictation、meta.duration_s は秒単位の長さです。それ以外はすべて識別子かタイムスタンプです。タイトルも、話者の一覧も、要約も、チャンネル名もありません。エンドポイントに分かるのは、何かがどこで起きたかであって、何が話されたかではありません。

よくある用途にはこれで足ります。チームのチャットへの1行、トラッカーの1行、チャンネルごとの会議数のカウンターなどです。channel_id を読める名前に対応づける表は、自分の側で持っておきましょう。なお、チャットのIncoming Webhookはこのリクエストをそのまま受け取れません。たとえばSlackのIncoming Webhookは text フィールドを持つJSONボディを期待するので、署名を検証してメッセージを整形し直す小さな中継サービスが必要です。

署名はどう検証するのか

X-Speaky-Signature ヘッダーは sha256=<hex> という形式です。値は、配信タブで入力したシークレットを鍵にした、リクエストの生のボディ のHMAC SHA-256です。Pythonでの受信側はこうなります。

import hashlib
import hmac

def is_from_speaky(secret: str, raw_body: bytes, header: str) -> bool:
    digest = hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(f"sha256={digest}", header)

届いたバイト列をそのまま使って署名を計算してください。フレームワークがJSONをパースし、それをシリアライズし直すと、キーの順序や空白が変わり、署名が一致しなくなります。

送信側のいくつかの性質が、受信側の作り方を決めます。

Speak-YのWebhookを受け取るサービスのための5つのチェック
生のバイト列で検証する、定数時間で比較する、すばやく応答する、record_idで重複を除く、Webhookをキューとして扱わない。

どのチャンネルが対象になるのか

ワークスペース全体です。例外は1つだけあります。対象範囲のカードには「このワークスペースのいずれかのチャンネルに新しい記録が入るたびに配信されます」とあり、チャンネルごとのフィルターはありません。顧客用チャンネルが活発なワークスペースでは、通知されるのは週次定例だけではありません。

例外は非公開チャンネルです。非公開チャンネルに共有された録音は、メールでもWebhookでも、どこにも通知されません。カードには、鍵マーク付きの非公開チャンネルも含め、あなたに見えるチャンネルが並びますが、サーバーはそれらを飛ばします。配信を設定するオーナーや管理者が、その非公開チャンネルのメンバーとは限らないからです。そこで何かが録音されたという事実でさえ、その人が受け取ってよい情報ではありません。チャンネルを公開と非公開にどう分けるかは、チームのチャンネルで誰が何を見られるかで説明しています。

個人の録音は、このすべての対象外です。自分で録音をチャンネルに共有するまで、ライブラリの外には何も出ません。

なぜ要約そのものを送らないのか

送るには、サーバーが要約を読めなければならないからです。Speak-Yでは、録音はアップロードされる前にMac上でチャンネルの鍵によって暗号化され、チャンネルの鍵はメンバーのデバイスにしかありません。仕組みはエンドツーエンド暗号化のチーム共有の仕組みで順に説明しています。要約をメールに入れられるサーバーは、すべてのチャンネルを読めるサーバーでもあります。

逆の設計のツールは内容を送ります。受信トレイに届く要約のほうがエンドツーエンド暗号化より大切なら、それはそうしたツールを選ぶ正当な理由です。2026年10月9日に確認した内容は次のとおりです。

アプリの外に読めるコピーが必要なら、通知に頼るのではなく、意図して作りましょう。誰も書かなくていい週次の議事録ではConfluenceやGoogle Driveへのエクスポートを紹介しています。また、Speak-Y MCPサーバーを使えば、メンバーのMac上のAIアシスタントが、そのメンバーがもともと開ける録音を読めます。

チームワークスペースはSpeak-Y macOSアプリで利用できます。作成はProプランから可能で、チームメンバーはどのプランでも無料で参加できます。共有チャンネルの仕組みはSpeak-Y Teamsのページで紹介しています。

FAQ

Speak-Yは会議のあとに要約や文字起こしをメールで送りますか。

いいえ。Email deliveryが送るのは、新しい会議がチャンネルに共有されたという通知です。作成者、長さ、日時と、「Speak-Y で開く」ボタンが入ります。チャンネルはエンドツーエンド暗号化されているため、サーバーにはメールに載せられる要約も文字起こしもありません。本文はアプリで読みます。

Speak-YのWebhookは何を送りますか。

イベントteam_record.createdを含むJSONのPOSTで、中身は識別子だけです。workspace_id、channel_id、record_id、created_by、metaに入る記録の種類と長さ、そして2つのタイムスタンプです。文字起こしも要約も、チャンネル名やワークスペース名も含まれません。

X-Speaky-Signatureヘッダーはどう検証しますか。

Webhookのシークレットを鍵にして、リクエストの生のボディに対するHMAC SHA-256を計算し、16進文字列にしてsha256=を前に付けます。その結果をX-Speaky-Signatureヘッダーと定数時間比較で照合します。JSONをパースする前に行ってください。

どのチャンネルが配信の対象になりますか。

ワークスペースのいずれかの公開チャンネルに共有された新しい録音すべてです。チャンネルごとのフィルターはありません。非公開チャンネルはメールでもWebhookでも一切通知されず、個人の録音がライブラリの外に出ることもありません。

Email deliveryとWebhookを設定できるのは誰ですか。

ワークスペースのオーナーまたは管理者です。macOSアプリのワークスペースページにある配信タブで設定します。メンバーには同じタブが読み取り専用で表示されます。