🚀 クイックスタート
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 のセットアップ直後に設定します。
try? await Context.setupForDev(withAppId: appId, secretKey: secretKey, options: contextOpt)
AudioSettings.setPreferredSampleRate(16000.0)
let roomInit: Room.InitOptions = .init()サンプリングレートについて、詳しくは開発ガイドを参照してください。
セットアップの実装
SkyWayAINoiseCanceller をインポートします。
import SkyWayAINoiseCancellerContext のセットアップが成功した後に、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 appId = "アプリケーションIDを入力してください"
let secretKey = "シークレットキーを入力してください"
// SkyWayのセットアップ
let contextOpt: ContextOptions = .init()
contextOpt.logLevel = .trace
try? await Context.setupForDev(withAppId: appId, secretKey: secretKey, options: contextOpt)
AudioSettings.setPreferredSampleRate(16000.0)
let roomInit: Room.InitOptions = .init()
guard let room: Room = 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 audioSource: MicrophoneAudioSource = .init()
let audioStream = audioSource.createStream()
let audioPublicationOptions: RoomPublicationOptions = .init()
audioPublicationOptions.type = .SFU
guard let audioPublication = try? await member.publish(audioStream, options: audioPublicationOptions) 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()
let videoPublicationOptions: RoomPublicationOptions = .init()
videoPublicationOptions.type = .SFU
guard let videoPublication = try? await member.publish(localVideoStream, options: videoPublicationOptions) 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 リファレンスを参照してください。