Spaces:
Running
Running
update
Browse files
app.py
CHANGED
@@ -240,7 +240,7 @@ def get_label(audio_path: str, num_top_classes_to_use: int = 10):
|
|
240 |
## {i+1}位 (スコア{score:.4f})
|
241 |
- ゲーム名: **{game_dict[game_key].name}** ({game_dict[game_key].company})
|
242 |
- 公式サイト: {game_dict[game_key].url}
|
243 |
-
- キャラクター名: {speaker_name}
|
244 |
---"""
|
245 |
results.append(result_md)
|
246 |
|
@@ -261,9 +261,10 @@ def make_speaker_info_md(game_key: str, speaker_name: str) -> str:
|
|
261 |
|
262 |
|
263 |
initial_md = """
|
264 |
-
# ギャルゲー似た声検索
|
265 |
|
266 |
- 与えられた音声に対して、声が似ているような日本のギャルゲー(ビジュアルノベル・エロゲー)の音声を検索するアプリです
|
|
|
267 |
- 「この声と似たキャラクターが出ているギャルゲーは?」「この音声AIの声に聞き覚えあるけど、学習元は誰なのかな?」といった疑問の参考になるかもしれません
|
268 |
- 次ができます:
|
269 |
- セリフ単位でのTop 10の音声のサンプル表示
|
@@ -274,19 +275,24 @@ initial_md = """
|
|
274 |
|
275 |
details_md = """
|
276 |
|
277 |
-
|
278 |
|
279 |
-
- 音声データは全て [OOPPEENN/Galgame_Dataset](https://huggingface.co/datasets/OOPPEENN/Galgame_Dataset)
|
280 |
- 音声ファイル処理: 各キャラクターについて次を行う
|
281 |
- 総ファイル数が100未満の場合はモブキャラとして除外
|
282 |
- 「2秒以上20秒未満」の音声ファイルのうち、時系列的に最初の100ファイルに加え、ランダムに最大200ファイル、合計最大300ファイルを選択
|
283 |
- 22050Hz oggでリサンプリング
|
284 |
|
285 |
-
|
|
|
|
|
|
|
|
|
|
|
286 |
- 話者埋め込み: [pyannote/wespeaker-voxceleb-resnet34-LM](https://huggingface.co/pyannote/wespeaker-voxceleb-resnet34-LM) の256次元の話者埋め込み
|
287 |
- 類似度計算: 2つの音声ファイルの話者埋め込みベクトルのコサイン類似度
|
288 |
|
289 |
-
|
290 |
- 与えられた音声に対して、全ての音声ファイルとの類似度を計算
|
291 |
- 各キャラクターについて、類似度の高い10ファイルの平均類似度を計算し、スコアとする
|
292 |
- そのスコアでソートして上位10キャラクターを表示
|
|
|
240 |
## {i+1}位 (スコア{score:.4f})
|
241 |
- ゲーム名: **{game_dict[game_key].name}** ({game_dict[game_key].company})
|
242 |
- 公式サイト: {game_dict[game_key].url}
|
243 |
+
- キャラクター名: **{speaker_name}**
|
244 |
---"""
|
245 |
results.append(result_md)
|
246 |
|
|
|
261 |
|
262 |
|
263 |
initial_md = """
|
264 |
+
# ギャルゲー似た声検索 (Galgame Similar Voice Search)
|
265 |
|
266 |
- 与えられた音声に対して、声が似ているような日本のギャルゲー(ビジュアルノベル・エロゲー)の音声を検索するアプリです
|
267 |
+
- **30秒未満**の音声ファイルにしか対応させていません (Only supports audio files less than 30 seconds)
|
268 |
- 「この声と似たキャラクターが出ているギャルゲーは?」「この音声AIの声に聞き覚えあるけど、学習元は誰なのかな?」といった疑問の参考になるかもしれません
|
269 |
- 次ができます:
|
270 |
- セリフ単位でのTop 10の音声のサンプル表示
|
|
|
275 |
|
276 |
details_md = """
|
277 |
|
278 |
+
### 音声データ
|
279 |
|
280 |
+
- 音声データは全て [OOPPEENN/Galgame_Dataset](https://huggingface.co/datasets/OOPPEENN/Galgame_Dataset) から取得(合計293ゲーム)
|
281 |
- 音声ファイル処理: 各キャラクターについて次を行う
|
282 |
- 総ファイル数が100未満の場合はモブキャラとして除外
|
283 |
- 「2秒以上20秒未満」の音声ファイルのうち、時系列的に最初の100ファイルに加え、ランダムに最大200ファイル、合計最大300ファイルを選択
|
284 |
- 22050Hz oggでリサンプリング
|
285 |
|
286 |
+
### ゲーム情報
|
287 |
+
|
288 |
+
- [OOPPEENN/Galgame_Dataset](https://huggingface.co/datasets/OOPPEENN/Galgame_Dataset) ではゲームタイトルの英語表記のみが提供されているため、日本語タイトルと公式サイトURLを手動で調べて追加
|
289 |
+
- 間違っている箇所があったら教えてください
|
290 |
+
|
291 |
+
### 音声ファイル同士の類似度計算
|
292 |
- 話者埋め込み: [pyannote/wespeaker-voxceleb-resnet34-LM](https://huggingface.co/pyannote/wespeaker-voxceleb-resnet34-LM) の256次元の話者埋め込み
|
293 |
- 類似度計算: 2つの音声ファイルの話者埋め込みベクトルのコサイン類似度
|
294 |
|
295 |
+
### キャラクター検索
|
296 |
- 与えられた音声に対して、全ての音声ファイルとの類似度を計算
|
297 |
- 各キャラクターについて、類似度の高い10ファイルの平均類似度を計算し、スコアとする
|
298 |
- そのスコアでソートして上位10キャラクターを表示
|
make.py
DELETED
@@ -1,36 +0,0 @@
|
|
1 |
-
import json
|
2 |
-
from pathlib import Path
|
3 |
-
|
4 |
-
|
5 |
-
def txt_to_json(input_path: Path, output_path: Path) -> None:
|
6 |
-
"""
|
7 |
-
パイプ区切りのTXT形式ファイルをJSON形式に変換する。
|
8 |
-
|
9 |
-
:param input_path: 入力ファイルのパス(TXT形式)
|
10 |
-
:param output_path: 出力ファイルのパス(JSON形式)
|
11 |
-
"""
|
12 |
-
data_list: list[dict[str, str]] = []
|
13 |
-
|
14 |
-
with input_path.open(encoding="utf-8") as file:
|
15 |
-
for line in file:
|
16 |
-
line = line.strip()
|
17 |
-
if not line:
|
18 |
-
continue # 空行はスキップ
|
19 |
-
|
20 |
-
columns = line.split("|")
|
21 |
-
if len(columns) == 4:
|
22 |
-
key, company, name, url = columns
|
23 |
-
data_list.append(
|
24 |
-
{"key": key, "company": company, "name": name, "url": url}
|
25 |
-
)
|
26 |
-
|
27 |
-
# JSONファイルに書き込み
|
28 |
-
with output_path.open("w", encoding="utf-8") as json_file:
|
29 |
-
json.dump(data_list, json_file, ensure_ascii=False, indent=4)
|
30 |
-
|
31 |
-
|
32 |
-
# 使用例
|
33 |
-
input_file = Path("search_results.txt") # 入力ファイルのパス
|
34 |
-
output_file = Path("game_info.json") # 出力ファイルのパス
|
35 |
-
|
36 |
-
txt_to_json(input_file, output_file)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|