🚀 クイックスタート
iOS SDK のクイックスタートをベースに、SkyWay iOS SDK と AI Noise Canceller ライブラリを使った簡単なアプリケーション tutorial
を作成します。
動作環境
- 対応 OS バージョン: iOS 14, iPadOS 14 以降
通話アプリの作成
クイックスタート の手順に従って SkyWay を使った通話アプリを作成してください。
重要: AI Noise Canceller を利用するには SkyWay iOS SDK v3.0.0 以降 が必要です。SDK をインストールする際はバージョンを必ず確認してください。
音声の確認方法
1 人で動作を確認する際に出力音声へ影響を与えないよう、イヤホンの利用を推奨します。
AI Noise Canceller を組み込んだアプリへ改修
ライブラリのインストール
1. 環境変数の設定
ライブラリをインストールする前に、環境変数を設定する必要があります。 appId と secret の値を差し替えて、以下のコマンドを実行してください。
export SKYWAY_APP_ID="your-app-id" export SKYWAY_SECRET_KEY="your-app-secret"
2. ダウンロードスクリプトの実行
以下のコマンドを実行して、ライブラリをダウンロードします。
curl -fsSL https://raw.githubusercontent.com/skyway/ai-noise-canceller/refs/heads/main/tools/ios/download.sh | bash
上記のコマンドにより、tmp
ディレクトリに最新版バージョンの AI Noise Canceller がダウンロードされます。
環境に合わせて Project に追加してください。
上記で実行するシェルスクリプトは、 端末内で SkyWay Admin Auth Token を生成※しライブラリ取得の認証に利用しています。 この SkyWay Admin Auth Token は、アプリケーションの管理者(サーバー)用APIを利用する際に必要なトークンであり、本トークンが流出した場合は第三者に管理者(サーバー)用APIを悪用されてしまう恐れがあります。 取り扱いには十分に気をつけてください。
※ SkyWay Admin Auth Token の有効期限は1時間です
3. Swift Package Manager での導入
Swift Package Manager を用いる場合、Xcode から Project を選択し、 Package Dependencies を選択します。
左下 +
ボタンからパッケージ検索のモーダルを表示させ、画面下の Add Local...
を押下します。
ダウンロードした skyway-ai-noise-canceller ディレクトリを選択し Add Package を押下します。
SkyWayAINoiseCanceller と voiceomnia を追加する Target を設定し、 Add Package を押下します。
ノイズ抑制のセットアップ
SkyWayAuthToken
の設定
ノイズ抑制の機能を利用する際は認可を追加する必要があります。SkyWayAuthToken
の scope
へ以下のように noiseCancelling
の項目を追加します。
const token = new SkyWayAuthToken({ ... scope: { ... analytics: { enabled: true }, noiseCancelling: { enabled: true } }, }).encode(secret);
サンプリングレートの設定
ノイズ抑制では、通話品質および処理の最適化のためにサンプリングレートは 16kHz にすることを推奨します。
ViewController.swift
にて、サンプリングレートを 16kHz に設定します。
実行タイミングは音声疎通の前となりますが、今回は Context.setup
の直後に設定します。
try? await Context.setup(withToken: token, options: contextOpt) AudioSettings.setPreferredSampleRate(16000.0) let roomInit: Room.InitOptions = .init()
サンプリングレートについて、詳しくは開発ガイドを参照してください。
セットアップの実装
SkyWayAINoiseCanceller
をインポートします。
import SkyWayAINoiseCanceller
Context
のセットアップが成功した後に、SkyWayNoiseCanceller.shared.setup
によりノイズ抑制処理のセットアップを行います。
SkyWayNoiseCanceller
はシングルトンインスタンスで管理しています。
_ = await SkyWayNoiseCanceller.shared.setup()
セットアップ後は SkyWayNoiseCanceller.shared.start() / stop()
でノイズ抑制の ON/OFF を切り替えられます。
ノイズ抑制の ON/OFF 切り替え
Main.storyboard
にて、ノイズ抑制の ON/OFF ボタンを追加します。
コードに接続し、ノイズ抑制の ON/OFF 関数を実装します。
@IBOutlet weak var startButton: UIButton! @IBOutlet weak var stopButton: UIButton!
@IBAction func startButtonTapped(_ sender: UIButton) { _ = SkyWayNoiseCanceller.shared.start() } @IBAction func stopButtonTapped(_ sender: UIButton) { _ = SkyWayNoiseCanceller.shared.stop() }
アプリをビルドし、前述[音声の確認方法]に従って、発話しながらマウスクリックやキータイプを行うことで、ノイズ付きの音声を確認することができます。
startButton
および stopButton
により、聞き比べながらノイズが低減されることが確認できます。
ノイズ抑制の強度変更
次に、ノイズ抑制の強度を変更できるように実装を変更します。
Main.storyboard
にて、ノイズ抑制の強度を変更するためのスライダを追加します。
最小値は1、最大値は100に設定し、初期値は100にします。
コードに接続し、ノイズ抑制の強度変更関数を実装します。
@IBOutlet weak var strengthSlider: UISlider!
@IBAction func strengthSliderValueChanged(_ sender: UISlider) { let value = sender.value _ = SkyWayNoiseCanceller.shared.changeStrength(Int(value)) }
変更が完了したら、もう一度アプリをビルドし、端末にインストールして動作を確認してみましょう。
スライダを操作することでノイズ抑制の強度を変更できます。処理強度を変更しながら出力音声を確認するとノイズ抑制の効果がわかりやすくなります。
はじめに一度だけノイズ抑制強度を変更すれば良い場合、init の引数から設定することができます。 詳しい使い方は API リファレンスをご参照ください。
ノイズ抑制の解除(Dispose)
Room 退出時や音声の Unpublish 時など、ノイズ抑制が不要になったタイミングで SkyWayNoiseCanceller.shared.dispose()
を呼び出してください。
@IBOutlet weak var disposeButton: UIButton!
@IBAction func disposeButtonTapped(_ sender: UIButton) { SkyWayNoiseCanceller.shared.dispose() }
Tutorial完成コード
import UIKit import SkyWayRoom class ViewController: UIViewController { @IBOutlet weak var localView: CameraPreviewView! @IBOutlet weak var remoteView: VideoView! @IBOutlet weak var startButton: UIButton! @IBOutlet weak var stopButton: UIButton! @IBOutlet weak var strengthSlider: UISlider! @IBOutlet weak var disposeButton: UIButton! override func viewDidLoad() { super.viewDidLoad() Task { let token: String = "トークンを入力" // SkyWayのセットアップ let contextOpt: ContextOptions = .init() contextOpt.logLevel = .trace try? await Context.setup(withToken: token, options: contextOpt) AudioSettings.setPreferredSampleRate(16000.0) let roomInit: Room.InitOptions = .init() guard let room: SFURoom = try? await .create(with: roomInit) else { print("[Tutorial] Creating room failed.") return } let memberInit: Room.MemberInitOptions = .init() memberInit.name = "Alice" // Memberに名前を付けることができます guard let member = try? await room.join(with: memberInit) else { print("[Tutorial] Join failed.") return } // AudioStreamの作成 let auidoSource: MicrophoneAudioSource = .init() let audioStream = auidoSource.createStream() guard let audioPublication = try? await member.publish(audioStream, options: nil) else { print("[Tutorial] Publishing failed.") return } // Audioの場合、subscribeした時から音声が流れます guard let _ = try? await member.subscribe(publicationId: audioPublication.id, options: nil) else { print("[Tutorial] Subscribing failed.") return } print("🎉Subscribing audio stream successfully.") // Cameraの設定 guard let camera = CameraVideoSource.supportedCameras().first(where: { $0.position == .front }) else { print("Supported cameras is not found."); return } // キャプチャーの開始 try! await CameraVideoSource.shared().startCapturing(with: camera, options: nil) // Previewの描画 CameraVideoSource.shared().attach(localView) // VideoStreamの作成 let localVideoStream = CameraVideoSource.shared().createStream() guard let videoPublication = try? await member.publish(localVideoStream, options: nil) else { print("[Tutorial] Publishing failed.") return } guard let videoSubscription = try? await member.subscribe(publicationId: videoPublication.id, options: nil) else { print("[Tutorial] Subscribing failed.") return } print("🎉Subscribing video stream successfully.") let remoteVideoStream = videoSubscription.stream as! RemoteVideoStream remoteVideoStream.attach(remoteView) } } @IBAction func startButtonTapped(_ sender: UIButton) { _ = SkyWayNoiseCanceller.shared.start() } @IBAction func stopButtonTapped(_ sender: UIButton) { _ = SkyWayNoiseCanceller.shared.stop() } @IBAction func strengthSliderValueChanged(_ sender: UISlider) { let value = sender.value _ = SkyWayNoiseCanceller.shared.changeStrength(Int(value)) } @IBAction func disposeButtonTapped(_ sender: UIButton) { SkyWayNoiseCanceller.shared.dispose() } }
おわりに
以上がノイズ抑制機能の基本的な使い方となります。
さらに詳しい API の説明や注意事項は API リファレンスを参照してください。