---
lang: ja
path: user-guide/ai-noise-canceller/javascript/development-guide
labels: ユーザーガイド/AI Noise Canceller/JavaScript 版/開発ガイド
metaTitle: 開発ガイド ｜ JavaScript ｜ AI Noise Canceller ｜ ユーザーガイド ｜ SkyWay（スカイウェイ）
---

# 開発ガイド

## TypeScript で AI Noise Canceller を利用する際の注意点

TypeScript を用いた開発に AI Noise Canceller を利用する場合、連携しようとする JavaScript SDK のバージョンによって型の互換性に伴うエラーや警告が表示される場合がございます。
対処が必要な場合は、AI Noise Canceller もしくは JavaScript SDK のどちらかを、他方に適合するバージョンへ更新してご利用ください。
なお、AI Noise Canceller と連携可能な JavaScript SDK のバージョンは、[リリースノート](https://github.com/skyway/ai-noise-canceller/releases)からご確認いただけます。

## 未対応ブラウザ利用時のハンドリング

AI Noise Canceller は Chrome / Edge / Safari で動作します。  
それ以外のブラウザはサポートしておらず、動作保証はありません。そのため、動作するかどうかは、`isSupported` メソッドを使用して判定してください。

```typescript
if (SkyWayNoiseCanceller.isSupported() === false) {
  console.warn("SkyWay Noise Canceller is not supported");
  return;
}
```

## エラーハンドリング

AI Noise Canceller は、短時間のネットワーク切断時には自動的に再接続処理を行います。しかし、長時間のネットワーク切断など回復不可能なエラーが発生した場合には、`onFatalError` イベントが発火します。このイベントが発火した場合、一時的に AI Noise Canceller が利用できなくなる可能性が高いため、元の Audio Stream を利用するなど、アプリケーション側での対応が必要です。

```typescript
// 元のStream
const audio = await SkyWayStreamFactory.createMicrophoneAudioStream({
  noiseSuppression: false,
});

noiseCanceller.onFatalError((event: CustomEvent<SkyWayNCError>) => {
  const error = event.detail;

  // connect中に発生するのはProcessErrorのみ
  if (error.type === "ProcessError") {
    myAudioPublication.replaceStream(audio, {
      releaseOldStream: false,
    });
  }
});
```

## ブラウザのノイズ抑制機能の無効化

`getUserMedia()` や `SkyWayStreamFactory.createMicrophoneAudioStream` を使用して Audio Stream を取得する場合、 `noiseSuppression` を設定できます。
しかし、AI Noise Canceller を利用する際は音声ノイズを抑制する機能が競合するため、 `noiseSuppression` の設定を `false` にすることを推奨します。

```typescript
const audio = await SkyWayStreamFactory.createMicrophoneAudioStream({
  noiseSuppression: false, // AI Noise Cancellerと競合しないようにfalseに設定
});
```

また、開発中に自身で動作確認するようなユースケースで Publish した音声を Subscribe してループバックする場合は、`echoCancellation` も `false` に設定すると音声が聞き取りやすくなります。

```typescript
const audio = await SkyWayStreamFactory.createMicrophoneAudioStream({
  echoCancellation: false, // 1 人で動作確認する際に聞き取りやすくするための設定であり、実環境では true を推奨
  noiseSuppression: false,
});
```

## 課金対象期間について

AI Noise Canceller の課金対象期間は、`connect` を呼び出してから `dispose` を呼び出すまでの期間です。  

![Billing](/media/posts/docs/00_13_03_ai-noise-canceller-development-guide-billing.png)

現在 `mute/unmute` の機能は提供していないため、一時的に無効化する場合でも必ず以下のように `dispose` を呼び出してリソースを解放してください。

```typescript
// replaceStreamで適用前のAudio Streamにreplaceする
myAudioPublication.replaceStream(audio, {
  releaseOldStream: false,
});
noiseCanceller.dispose();
```

また、`onFatalError` イベントが発火した際は内部で自動的に `dispose` が呼び出され課金集計処理が止まります。

## マイクの切り替え

現在 Stream の変更機能は提供しておりません。
マイクの切り替えに伴う Stream の変更が必要な場合は、新たにインスタンスを生成してご利用ください。

```typescript
// インスタンス化と初期化を行う関数
const setupNoiseCanceller = async (context: SkyWayContext, audio: LocalAudioStream): Promise<
  [noiseCanceller: SkyWayNoiseCanceller, processedAudio: LocalAudioStream]
> => {
  const noiseCanceller = new SkyWayNoiseCanceller(context);

  return new Promise((resolve) => {
    noiseCanceller.onReady(async () => {
      const processedAudio = await noiseCanceller.connect(audio);
      resolve([noiseCanceller, processedAudio]);
    });
    noiseCanceller.onFatalError(...);
    noiseCanceller.init();
  });
};

const devices = await SkyWayStreamFactory.enumerateInputAudioDevices();

// 元のマイクの音声を Publish
const audio = await SkyWayStreamFactory.createMicrophoneAudioStream({ 
  deviceId: devices[0].id,
  noiseSuppression: false,
});
let [noiseCanceller, processedAudio] = await setupNoiseCanceller(context, audio);
const publication = await person.publish(processedAudio);

// 別のマイクへの切り替え
const anotherAudio = await SkyWayStreamFactory.createMicrophoneAudioStream({ 
  deviceId: devices[1].id,
  noiseSuppression: false,
});
const [anotherNoiseCanceller, anotherProcessedAudio] =
  await setupNoiseCanceller(context, anotherAudio); // 新たに SkyWayNoiseCanceller を初期化する
publication.replaceStream(anotherProcessedAudio);

// 元の SkyWayNoiseCanceller を破棄する
noiseCanceller.dispose();
noiseCanceller = anotherNoiseCanceller;
```

## ノイズ抑制強度（strength）の調整

`strength` はノイズ抑制の強度を設定するための値です。インスタンス生成時に設定できるほか、`changeStrength` メソッドを使用して任意のタイミングでの変更も可能です。

```typescript
// インスタンス生成時に設定する場合
noiseCanceller = new SkyWayNoiseCanceller(context, { strength: 80 });

// changeStrengthで変更する場合
const strength = 80;
noiseCanceller.changeStrength(strength);
```

何も指定しなかった場合は 100 が設定されます。

## モデルタイプについて

モデルタイプは `small` , `medium` , `large` の 3 種類があり、インスタンス生成時に設定できます。 
何も指定しなかった場合は `small` が設定されます。
`small` が最も処理負荷を抑えられるため、スマートフォンなどを含む様々なデバイスで活用されるユースケースでは `small` の利用を推奨します。
モデルタイプを変更したい場合は、インスタンスを `dispose` して新しいインスタンスを作成してください。

```typescript
// 初期化時にモデルを'medium'に設定
noiseCanceller = new SkyWayNoiseCanceller(context, { modelType: "medium" });
```

## AI Noise Canceller 利用時の SkyWay Auth Token に関する注意

AI Noise Canceller は、`version` プロパティが `1` 、 `2` 、 未指定となっている旧バージョンの SkyWay Auth Token ではご利用いただけません。旧バージョンの SkyWay Auth Token をご利用中の方は、 version 3 へ移行してください。なお、SkyWay Auth Token version 3 の詳しい仕様を知りたい方は、[SkyWay Auth Token(各種SDK用)](/ja/docs/user-guide/authentication/skyway-auth-token/)のページをご参照ください。

## ログの設定

SkyWayNoiseCanceller のインスタンスを生成する際に、出力されるログのログレベルを設定できます。

```typescript
noiseCanceller = new SkyWayNoiseCanceller(context, {
  logLevel: 'debug',
});
```

設定可能なログレベルは、[APIリファレンス](https://javascript-sdk.api-reference.skyway.ntt.com/ai-noise-canceller/types/SkyWayNCOptions.html#loglevel)を参照してください。
なお、ログレベルを指定しなかった場合は`error`に設定されます。

アプリケーション開発時は、不具合の調査やテクニカルサポートとのやり取りを円滑に行うために、ログレベルを `debug` に設定することをおすすめします。
アプリケーションをプロダクションで運用する際は、ログレベルを `error` に設定することをおすすめします。

## 開発用リポジトリでの利用

以下のようなユースケースにより開発用のリポジトリで本ライブラリを利用したい場合、インストール用スクリプトを活用したワークフローをご使用ください。
- 公開リポジトリで開発しているソフトウェアで利用したい場合
- 常に最新版のライブラリを用いてテストを実行したい場合