---
lang: ja
path: user-guide/stt/development-guide
labels: ユーザーガイド/文字起こし/開発ガイド
metaTitle: 開発ガイド | 文字起こし ｜ ユーザーガイド ｜ SkyWay（スカイウェイ）
---

# 開発ガイド

## P2P での通話内容を文字起こしする方法

文字起こしの対象となる音声は、SFU を利用して Publish する必要があります。
エンドユーザー間の通信を行う P2P 通信とは別に、文字起こし機能を利用するための SFU 通信を同時に利用することで、エンドユーザー間の通信は P2P 通信を利用しながら文字起こし機能を利用できます。

![エンドユーザー間の通信に P2P 通信を利用しながら文字起こし機能を利用する際の概要図](/media/posts/docs/stt/p2p-overview.png)

### SFU 通信料と SFU リソース確保料について

P2P 通信での通話を文字起こしする場合、SkyWay Auth Token に次のような設定を行った上で `maxSubscribers` の設定を `0` として Publish を行うことで、文字起こしに伴う[SFU 通信料と SFU リソース確保料](/ja/pricing/)が発生しなくなります。
本設定は SkyWay Auth Token のバージョン 3 から対応しております。

※ [SkyWay Auth Token / SFU リソースについて](/ja/docs/user-guide/authentication/skyway-auth-token/#sfu-リソース)

```js
{
  // ...省略
  version: 3,
  scope: {
    // ...省略
    rooms: [
      {
        // ...省略
        sfu: {
          enabled: true,
          maxSubscribersLimit: 0,
        },
        // ...省略
      }
    ]
  }
}
```

Publish 時の `maxSubscribers` オプションを `0` に設定すると、その Publication は Subscribe ができなくなり、文字起こし専用の Publication として扱われます。

### 注意事項

SkyWay の各種 SDK では一度 Publish した Stream を再度 Publish することができません。

P2P 通信と SFU 通信を併用する際に同一のマイクを「エンドユーザー間通信」と「文字起こし」で用いる場合は、Stream を 2 回取得する必要があります。

### JavaScript SDK での実装例

```js
// トークンはサーバーサイドで生成してください
const token = new SkyWayAuthToken({
  jti: uuidV4(),
  iat: nowInSec(),
  exp: nowInSec() + 60 * 60 * 24,
  version: 3,
  scope: {
    appId: 'ここにアプリケーションIDをペーストしてください',
    rooms: [
      {
        id: '*',
        name: 'sttRoom',
        methods: ['create', 'close', 'updateMetadata'],
        sfu: {
          enabled: true,
          maxSubscribersLimit: 0,
        },
        member: {
          id: '*',
          name: '*',
          methods: ['publish', 'subscribe', 'updateMetadata'],
        },
      },
    ],
  },
}).encode('ここにシークレットキーをペーストしてください');

const context = await SkyWayContext.Create(token);

const room = await SkyWayRoom.FindOrCreate(context, {
  name: 'sttRoom',
});
const me = await room.join();

const { audio: communicationAudio } =
  await SkyWayStreamFactory.createMicrophoneAudioStream();
// エンドユーザー間の通信にはP2P通信を利用します
await me.publish(communicationAudio, { type: 'p2p' });

// 一度PublishしたStreamは再度Publishすることができないので、改めて文字起こし用のStreamを取得します
const sttAudio = await SkyWayStreamFactory.createMicrophoneAudioStream();

// 文字起こし機能を利用するために、SFU通信を利用します
await me.publish(sttAudio, {
  type: 'sfu',
  maxSubscribers: 0,
});
```

文字起こしの開始方法は[クイックスタート](/ja/docs/user-guide/stt/quickstart)を参照してください。
