File size: 5,896 Bytes
96af880
dd9b42b
 
 
 
96af880
dd9b42b
96af880
 
 
 
dd9b42b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96af880
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
---
title: iPhoneBlindSourceSeparation
emoji: 🏢
colorFrom: pink
colorTo: yellow
sdk: gradio
sdk_version: 6.0.1
app_file: app.py
pinned: false
license: mit
---
# iPhoneBlindSourceSeparation
このデモでは、iPhoneで撮影したステレオ録音付きの録画から**Independent Vector Analysis (IVA)**によるブラインド音源分離を体験できます。  

## ⚠️ 注意
 - 動画アップロードによって生じるトラブルは責任を負いかねます 

## 📱 対応機種 (要件)

ステレオ録音機能に対応しているiOSデバイス:
- **iPhone**: XS / XR / SE (第2世代 以降) / 11 以降
- iOS 16以降

> ⚠️ **注記**: 対応機種一覧は参考情報です。  
> 対応機種以外でも,サンプル音声を用いてブラインド音源分離を体験できます.

## 🎥 ステレオ録音の設定方法 (事前準備)

本デモでは標準カメラアプリで録画すると,ステレオ録音が行えることを利用します.
iPhoneでステレオ音源付きで録画する場合、以下の手順で設定を確認してください:

1. **設定** → **カメラ** を開く
2. **ビデオ録画** セクションで **ステレオ** を有効にする

詳細は [Apple公式ガイド](https://support.apple.com/ja-jp/guide/iphone/iph31c1ca6c7/ios#:~:text=%E6%B3%A8%E8%A8%98:%20iPhone%2016%E4%BB%A5%E9%99%8D%E3%81%A7%E3%81%AF,%E3%82%92%E5%8F%82%E7%85%A7%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82) をご参照ください。

## 🎬 録画時の配置と条件

このアプリケーションで高精度に音源分離するため、以下の条件で録画することをお勧めします:

### 推奨される配置
```
   話者B(カメラ側)                              話者A(撮影者側)
         △ ---- [iPhone (話者Aが持つ)] ---- △
```
- 各話者の中心にiPhoneがあることが重要です.
- ステレオ録音で録画する際, {前面上部のマイク, 背面カメラ付近のマイク}の2つが使われてる可能性が高いです (経験則). なので, 上の図を描き変えるとこのようなセットアップになります.
```
   話者B(カメラ側)                                           話者A(撮影者側)
         △ ---- [前面上部のマイク] -- [背面カメラ付近のマイク] ---- △
```
- 録画ボタンを押して自由に発話してください. お互いが別々のことを話してる形式でも,対話形式でも構いません.

### 音源分離の成功条件
- ✅ 2つの音源(話者の発話)がステレオの左右チャンネルに比較的均等に分布している. 
- ✅ 話者やiPhone(マイク)の位置がほぼ固定で、大きな動きがない
- ✅ 背景雑音が少ない環境である(背景雑音があっても音声分離自体は可能ですが,背景雑音自体の抑圧はできてません. マイク数を多くすると雑音抑圧も可能になりますが,デモでは2マイクの場合のみ想定しています)

### 分離が上手くいかない場合

1. **STFT窓長を変える**
   - 特に,残響時間が長い場合は窓長を例えばサンプリング周波数の0.6倍にすると上手く分離できるかもしれません.ただし,窓長を過剰に長くしすぎると分離性能が劣化する可能性があります.

1. **オンライン処理を使用する** 
   - 処理モードを「オンライン (Online AuxIVA)」に切り替える
   - これにより、特に話者やiPhoneに大きな動きがある場合を(ある程度)考慮できます.
   - 逆に,時不変(=話者やマイクが動いてない)な状況を想定しているのにオンライン処理で上手く分離ができない場合は,まずオフライン処理で上手く分離できるか確かめると良いでしょう.
   - 話者やマイクの動きが多い場合は忘却係数を調整してみてください. 値が低いほど過去の情報を忘却するようになります. 

## 🚀 使い方

### Webアプリケーション (Hugging Face)
1. ページを開く
2. **上段**: 動画ファイルをアップロード、または **サンプル混合音声を生成・再生** ボタンを押す
3. **中央**: 処理パラメータを設定
   - サンプリング周波数を計算してSTFT窓長を自動設定
   - 処理モード(オフライン/オンライン)
   - (オンライン処理時)忘却係数を調整
4. **分離開始** ボタンを押す
5. **結果**: 混合音声と分離音声の波形、抽出された音声ファイルが表示されます

### ローカルモード (gradioがinstallされてない環境でも動作可)
```bash
python app.py
```
実行時に以下のパラメータを対話形式で入力します:
- ビデオファイルパス(またはサンプル生成)
- STFT窓長
- 処理モード(オンライン/オフライン)
- パラメータ(忘却係数)

## License & Credits

以下を使わせて頂きました:  
 - pyroomacoustics (https://github.com/LCAV/pyroomacoustics)
 - Pythonで学ぶ音源分離 (https://github.com/masahitotogami/python_source_separation)
 - CMU ARCTIC Concatenated 15s (https://zenodo.org/records/3066489) 
 - J. Kominek and A. W. Black, “CMU ARCTIC databases for speech synthesis,” CMU-LTI-03-177, 2003.

デモに使用したIVA
1. N. Ono, *Stable and fast update rules for independent vector analysis based on auxiliary function technique,* Proc. IEEE, WASPAA, pp. 189-192, Oct. 2011.
1. T. Taniguchi, N. Ono, A. Kawamura, and S. Sagayama, *An auxiliary-function approach to online independent vector analysis for real-time blind source separation,* Proc. HSCMA, pp. 107-111, May. 2014.

Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference