本文へ移動

VoiceID

任意のVoiceIDパッケージとWalletホストを設定し、所有者が音声で登録、アンロック、送金承認を行う手順を説明します。

VoiceID ​

VoiceIDは、任意のブラウザー認証方法です。 アプリが対応を有効にした後、各ウォレットの所有者が登録するかどうかを選びます。 話者照合と発話認識は、信頼するWallet iframe内でローカル実行します。 鍵管理、セッション、ポリシー、しきい値署名の既存の確認は維持されます。

インストールと設定 ​

アプリには同じバージョンのパッケージをインストールしてください。 VERSIONをリリースノートに記載された対応するバージョンに置き換えます。

sh
pnpm add @seams/wallet@VERSION @seams/voiceid@VERSION

任意のパッケージから記述子をインポートし、既存の設定にauthMethodsを追加します。 次の例はNEARとArcのテストネットを有効にします。

ts
import { defineSeamsConfig } from '@seams/wallet';
import { voiceIdAuthMethod } from '@seams/voiceid';

export const voiceIdConfig = defineSeamsConfig({
  walletOrigin: import.meta.env.VITE_WALLET_ORIGIN,
  relayerUrl: import.meta.env.VITE_RELAYER_URL,
  publishableKey: import.meta.env.VITE_SEAMS_PUBLISHABLE_KEY,
  authMethods: [voiceIdAuthMethod()],
  chains: [{ network: 'near-testnet' }, { network: 'arc-testnet', chainId: 5_042_002 }],
});

ウォレットの設定と認証に従い、設定をSeamsWebProviderへ渡してください。 記述子のインポートと対応の有効化では、エンジンやモデルをダウンロードしません。 パスキーとメールOTPの処理でもVoiceIDアセットを読み込みません。 発話認識モデルの初期設定はCitrinet-256 LSです。容量の小さいAuroraASR-1Mを使う場合は、 voiceIdAuthMethod({ transcriptionModel: 'aurora' })を設定します。 ダウンロードする発話認識モデルは選択したものだけです。モデルを変更しても、保存済みの話者登録は維持されます。

Walletホストの準備 ​

walletOriginの運用者も、両方のパッケージを同じバージョンでインストールする必要があります。 別の運用者がWalletをホストする場合は、そのオリジンでのVoiceID対応を依頼してください。

インストール後、ホスト側のプロジェクトで次のコマンドを実行します。

sh
npx --no-install seams-voiceid-host ./wallet-with-voiceid

コマンドは、インストール済みのWalletパッケージを自動検出します。pnpmの配置にも対応します。 Walletと任意のVoiceIDのアセットを、指定した出力ディレクトリーへまとめます。 ビルドごとに新しい出力ディレクトリーを使ってください。既存ディレクトリーやインストール済みパッケージは上書きしません。

出力ディレクトリーを、walletOriginの静的ルートとしてデプロイしてください。 /wallet-service、/sdk/*、アセットマニフェストを含みます。 マニフェストに記載されたContent-Typeとキャッシュヘッダーを維持してください。 ホストの要件はホスト型統合を参照してください。

ホストは、有効なVoiceID操作で必要になったときだけ/sdk/voiceid/host.jsを読み込みます。 ホストへの配置が欠けている場合や互換性がない場合は、設定エラーを返します。

ウォレットへの登録 ​

所有者は、まずパスキーまたはメールOTPでウォレットをアンロックします。 次にWalletメニューの認証方法 → VoiceIDを開きます。 アプリ独自のVoiceIDを有効にする操作も用意できます。

ts
import type { SeamsContextType } from '@seams/wallet/react';

export async function enableVoiceId(seams: SeamsContextType['seams'], walletId: string) {
  const result = await seams.registration.activateAuthMethod({
    walletId,
    method: 'voiceid',
  });
  if (result.kind === 'cancelled') return result;

  console.log('VoiceID enabled', result.walletAuthMethodId);
  return result;
}

プロバイダー内でuseSeams()からseamsを取得します。 ユーザーのクリック後、現在のウォレットIDとともにenableVoiceIdへ渡してください。 Walletは、マイクの許可と、受け入れた3つのサンプルを管理します。 拒否されたサンプルは再試行できます。画面を閉じるとkind: 'cancelled'を返します。 登録に成功するとwalletAuthMethodIdを返します。現在の認証方法は変わりません。 登録済みの方法で再度有効化を呼ぶと、音声の管理を開きます。

アンロックと送金承認 ​

所有者はWalletのサインインメニューでVoiceIDを選べます。 独自のアンロック操作には、ウォレットIDと登録済みのwalletAuthMethodIdを渡します。

ts
export async function unlockWithVoiceId(
  seams: SeamsContextType['seams'],
  walletId: string,
  walletAuthMethodId: string,
) {
  const result = await seams.auth.unlockWithAuthMethod({
    walletId,
    walletAuthMethodId,
    method: 'voiceid',
  });
  if (!result.success) throw new Error(result.error);
  return result;
}

VoiceIDでアンロックした後も、既存のトランザクションAPIを使います。 NEARとArcのテストネット送金の確認画面に、VoiceIDで確認を表示します。 所有者は、表示された短い英語の発話を普段の速さで読みます。 各確認で新しい音声照合が必要です。実験用の話者の類似度しきい値は0.45です。 発話認識では、自然な発話に対応するため、一定範囲の違いを許容します。 表示された発話で鮮度を確認します。承認する操作はトランザクションの確認画面で定まります。

VoiceIDの有効化や登録だけでは、パスキーやメールOTPでの署名方法は変わりません。 署名者や認証方法の追加、登録音声の変更では、引き続き操作単位の承認を求めます。

読み込みと保存 ​

初回のVoiceID操作では、転送時の圧縮前でCitrinetなら約36 MB、Auroraなら約27 MBをダウンロードします。 1つの進捗表示で、エンジン、話者モデル、音声検出モデル、選択した発話認識モデルの読み込み状況を示します。その後、推論の準備が終わるまで**VoiceIDを準備中…**を表示します。 ブラウザーの保存領域が利用可能な場合、検証済みのアセットをキャッシュします。 サイトデータの削除やブラウザーによるキャッシュ削除で、再ダウンロードが必要になる場合があります。

音声はローカルに留まり、処理後に破棄します。Walletオリジンは、登録テンプレートとデバイス認証情報を保存します。 登録と追加サンプルには、時間や利用回数の制限がありません。 登録を削除した場合やWalletオリジンの保存領域を消去した場合は、再登録が必要です。 音声の管理では、所有者の新たな確認後に認識の改善、リセット、再録音を行えます。

VoiceIDは、そのブラウザーのデバイス認証情報とローカルの話者照合に依存します。 録音音声や合成音声への耐性について、本番環境での精度を保証しません。 登録音声の管理に備え、パスキーまたはメールOTPを利用可能にしてください。