Spaces:
Running
Running
Update README.md
Browse files
README.md
CHANGED
@@ -1,10 +1,163 @@
|
|
1 |
-
---
|
2 |
-
title: JusTalk
|
3 |
-
emoji: ⚡
|
4 |
-
colorFrom: gray
|
5 |
-
colorTo: blue
|
6 |
-
sdk: docker
|
7 |
-
pinned: false
|
8 |
-
---
|
9 |
-
|
10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
title: JusTalk
|
3 |
+
emoji: ⚡
|
4 |
+
colorFrom: gray
|
5 |
+
colorTo: blue
|
6 |
+
sdk: docker
|
7 |
+
pinned: false
|
8 |
+
---
|
9 |
+
|
10 |
+
|
11 |
+
---
|
12 |
+
|
13 |
+
## グローバル変数と主要な設定
|
14 |
+
|
15 |
+
- **`users`**
|
16 |
+
登録されたユーザー名のリスト。
|
17 |
+
- **`transcription_text`**
|
18 |
+
音声から作成された書き起こしのファイルパスまたは内容。
|
19 |
+
- **`total_audio`**
|
20 |
+
音声セグメントをマージした結果の音声ファイルパス。
|
21 |
+
- **`harassment_keywords`**
|
22 |
+
ハラスメントとして検出するキーワードのリスト(例:"バカ", "死ね" など)。
|
23 |
+
|
24 |
+
また、外部ライブラリとして `pydub`、および独自の `AudioProcessor`、`TranscriptionMaker`、`TextAnalyzer` を用いて音声処理や解析を行います。
|
25 |
+
|
26 |
+
---
|
27 |
+
|
28 |
+
## 各エンドポイントの概要
|
29 |
+
|
30 |
+
### 1. トップページ/ユーザー登録画面
|
31 |
+
|
32 |
+
- **URL:** `/index`
|
33 |
+
**メソッド:** GET, POST
|
34 |
+
**機能:**
|
35 |
+
- テンプレート `index.html` を表示。
|
36 |
+
- 現在の `users` リストをテンプレートに渡す。
|
37 |
+
|
38 |
+
- **URL:** `/` または `/userregister`
|
39 |
+
**メソッド:** GET, POST
|
40 |
+
**機能:**
|
41 |
+
- ユーザー登録用の画面を表示するため、`userRegister.html` テンプレートを返す。
|
42 |
+
|
43 |
+
---
|
44 |
+
|
45 |
+
### 2. フィードバックおよび会話詳細画面
|
46 |
+
|
47 |
+
- **URL:** `/feedback`
|
48 |
+
**メソッド:** GET, POST
|
49 |
+
**機能:**
|
50 |
+
- フィードバック画面(テンプレート:`feedback.html`)を表示。
|
51 |
+
|
52 |
+
- **URL:** `/talk_detail`
|
53 |
+
**メソッド:** GET, POST
|
54 |
+
**機能:**
|
55 |
+
- 会話の詳細を表示する画面(テンプレート:`talkDetail.html`)を返す。
|
56 |
+
|
57 |
+
---
|
58 |
+
|
59 |
+
### 3. ユーザーとファイルのリセット関連
|
60 |
+
|
61 |
+
- **URL:** `/reset_html`
|
62 |
+
**メソッド:** GET, POST
|
63 |
+
**機能:**
|
64 |
+
- リセット画面(テンプレート:`reset.html`)を表示。
|
65 |
+
|
66 |
+
- **URL:** `/reset_member`
|
67 |
+
**メソッド:** GET, POST
|
68 |
+
**機能:**
|
69 |
+
- 指定されたメンバー(ユーザー)とその関連の参照音声ファイルを削除する。
|
70 |
+
- リクエストボディ内で `"names"` キーが必須。
|
71 |
+
- `/tmp/data/base_audio` 内の各ユーザーの音声ファイル(`{name}.wav`)を削除。
|
72 |
+
- 削除後、`users` リストから対象ユーザーを除外する。
|
73 |
+
- 加えて、累積音声ファイル(`total_audio`)や、書き起こしファイル(`transcription_text`)も削除する処理を実施。
|
74 |
+
|
75 |
+
- **URL:** `/reset`
|
76 |
+
**メソッド:** GET
|
77 |
+
**機能:**
|
78 |
+
- `users` リストを空にリセットし、成功レスポンスを返す。
|
79 |
+
|
80 |
+
---
|
81 |
+
|
82 |
+
### 4. 状態確認エンドポイント
|
83 |
+
|
84 |
+
- **URL:** `/confirm`
|
85 |
+
**メソッド:** GET
|
86 |
+
**機能:**
|
87 |
+
- 現在登録されているメンバー(`users`)を JSON 形式で返す。
|
88 |
+
|
89 |
+
---
|
90 |
+
|
91 |
+
### 5. 音声アップロード・解析関連
|
92 |
+
|
93 |
+
#### a. 基本の音声アップロードと参照音声との照合
|
94 |
+
|
95 |
+
- **URL:** `/upload_audio`
|
96 |
+
**メソッド:** POST
|
97 |
+
**機能:**
|
98 |
+
- クライアントから受け取った Base64 形式の音声データをデコードし、一時ファイル(`/tmp/data/tmp.wav`)として保存。
|
99 |
+
- リクエストボディ内には、`audio_data` とともに、`name` または `users`(登録済みユーザーの情報)が必要。
|
100 |
+
- 各ユーザーの参照音声ファイル(`/tmp/data/base_audio/{user}.wav`)とアップロードされた音声を比較し、
|
101 |
+
- 複数ユーザーの場合:`process_multi_audio` を使用して各ユーザー毎の一致時間を計算し、その比率(パーセンテージ)を返す。
|
102 |
+
- 単一ユーザーの場合:`process_audio` を用いて一致時間と非一致時間から比率(パーセンテージ)を計算して返す。
|
103 |
+
- また、処理後に複数の音声セグメントをマージし、その結果を `total_audio` に格納する。
|
104 |
+
|
105 |
+
#### b. 基準音声のアップロード(ユーザー登録時に使用)
|
106 |
+
|
107 |
+
- **URL:** `/upload_base_audio`
|
108 |
+
**メソッド:** POST
|
109 |
+
**機能:**
|
110 |
+
- リクエストボディ内の `audio_data`(Base64形式)と `name` を受け取り、
|
111 |
+
- `users` リストに名前を追加(重複排除を実施)。
|
112 |
+
- `/tmp/data/base_audio/` 内に、`{name}.wav` という名前で保存。
|
113 |
+
- 登録成功時に、状態とファイルパスを返す。
|
114 |
+
|
115 |
+
---
|
116 |
+
|
117 |
+
### 6. 書き起こし生成およびテキスト解析
|
118 |
+
|
119 |
+
#### a. 書き起こし作成
|
120 |
+
|
121 |
+
- **URL:** `/transcription`
|
122 |
+
**メソッド:** GET, POST
|
123 |
+
**機能:**
|
124 |
+
- グローバル変数 `transcription_text` に書き起こし済みのファイルが存在しない場合、
|
125 |
+
- `total_audio`(マージ済み音声ファイル)が存在しているかをチェック。
|
126 |
+
- `TranscriptionMaker` の `merge_segments` メソッドでセグメントをマージし、`create_transcription` で書き起こしファイルを生成。
|
127 |
+
- 書き起こしファイルを読み込み、内容を JSON 形式で返す。
|
128 |
+
- エラー発生時には適切な HTTP ステータスコード(400, 404, 500)とエラーメッセージを返す。
|
129 |
+
|
130 |
+
#### b. AI によるテキスト解析
|
131 |
+
|
132 |
+
- **URL:** `/analyze`
|
133 |
+
**メソッド:** GET, POST
|
134 |
+
**機能:**
|
135 |
+
- `/transcription` と同様に、書き起こしファイルの存在を確認し、必要なら再生成する。
|
136 |
+
- `TextAnalyzer` クラスを使って、書き起こしテキストとハラスメントキーワードをもとに解析を実施。
|
137 |
+
- 環境変数 `DEEPSEEK` を API キーとして取得し、DeepSeek 解析を呼び出す。
|
138 |
+
- 解析結果(会話レベル、ハラスメントの有無や種類、繰り返しの程度、会話の心地よさ、非難やハラスメントの程度など)をコンソール出力し、JSON 形式で返す。
|
139 |
+
|
140 |
+
---
|
141 |
+
|
142 |
+
## エンドポイント間の流れとポイント
|
143 |
+
|
144 |
+
- **ユーザー登録:**
|
145 |
+
`/upload_base_audio` でユーザーごとの基準音声を登録し、`users` リストに名前を追加。
|
146 |
+
|
147 |
+
- **音声解析:**
|
148 |
+
`/upload_audio` によりアップロードされた音声を、登録された参照音声と照合。
|
149 |
+
- 複数ユーザーの場合、各ユーザーの一致時間を計算し、パーセンテージとして返す。
|
150 |
+
- 単一ユーザーの場合、一致時間と非一致時間から比率を返す。
|
151 |
+
- この段階で、音声セグメントをマージし、後続の書き起こし・解析に利用するために `total_audio` に格納。
|
152 |
+
|
153 |
+
- **書き起こしの生成と利用:**
|
154 |
+
`/transcription` で `total_audio` から書き起こしファイルを生成し、その内容を取得可能。
|
155 |
+
`/analyze` では、生成済みの書き起こしテキストをもとに、DeepSeek API を用いた AI 解析が実行される。
|
156 |
+
|
157 |
+
- **リセット機能:**
|
158 |
+
`/reset_member` で指定ユーザーの音声ファイル、累積音声、書き起こしファイルを削除。
|
159 |
+
`/reset` で `users` リストを完全にクリアする。
|
160 |
+
|
161 |
+
---
|
162 |
+
|
163 |
+
|