voidful commited on
Commit
2be32f1
·
verified ·
1 Parent(s): 5b4677a

Improve recorded reference voice similarity

Browse files
Files changed (3) hide show
  1. README.md +1 -1
  2. app.py +11 -5
  3. tests/test_latency_first_mode.py +4 -4
README.md CHANGED
@@ -21,7 +21,7 @@ models:
21
  ## 模式
22
 
23
  - **內建語者**:預設為內建語者 A;Speaker B 使用模型庫 `checkpoints/speaker_b_embedding.pt`,固定 seed 56789 與 projector scale 1.125。
24
- - **參考音色**:30 秒內整段提取一次 speaker embedding,固定 centroid/projector scale 1.25 與 seed 1337。
25
  - **長文**:以最多 80 個字元快速分段,各分段單次生成後加入短靜音串接。
26
 
27
  TTS model snapshot 固定為
 
21
  ## 模式
22
 
23
  - **內建語者**:預設為內建語者 A;Speaker B 使用模型庫 `checkpoints/speaker_b_embedding.pt`,固定 seed 56789 與 projector scale 1.125。
24
+ - **參考音色**:以 3 秒窗、1.5 秒 hop(最多 4 個窗)平均成單一 speaker embedding,固定 centroid/projector scale 1.25 與 seed 1337;每個文字分段仍只生成一次。
25
  - **長文**:以最多 80 個字元快速分段,各分段單次生成後加入短靜音串接。
26
 
27
  TTS model snapshot 固定為
app.py CHANGED
@@ -250,10 +250,13 @@ QUALITY_FAST_EXACT_MAX_BOUNDARY_SPEAKER_DROP = 0.08
250
  QUALITY_MAX_SEQUENCE_PATHS = 3
251
  SHORT_AUDIO_SPEAKER_GATE_SECONDS = 1.50
252
  REFERENCE_MIN_DURATION_SECONDS = 3.0
253
- REFERENCE_WINDOW_SECONDS = 30.0
254
- REFERENCE_HOP_SECONDS = 30.0
255
- REFERENCE_MAX_WINDOWS = 1
256
- REFERENCE_FULL_CLIP_MAX_SECONDS = 30.0
 
 
 
257
  SPEAKER_GENERATION_SEED = 56_789
258
  SPEAKER_B_LABEL = "內建語者 B"
259
  SPEAKER_B_PROJECTOR_SCALE = 1.125
@@ -3944,7 +3947,10 @@ with gr.Blocks(title="BlueMagpie-TTS Demo", theme=gr.themes.Soft()) as demo:
3944
  )
3945
 
3946
  with gr.Tab("參考音色"):
3947
- gr.Markdown("請使用至少 3 秒、單一語者且背景乾淨的授權參考音檔。")
 
 
 
3948
  with gr.Row():
3949
  with gr.Column():
3950
  reference_text = gr.Textbox(label="文字", lines=4, max_lines=8)
 
250
  QUALITY_MAX_SEQUENCE_PATHS = 3
251
  SHORT_AUDIO_SPEAKER_GATE_SECONDS = 1.50
252
  REFERENCE_MIN_DURATION_SECONDS = 3.0
253
+ # A short overlapping-window centroid is measurably closer to a recorded
254
+ # reference than one whole-clip embedding. Keep the cap small so extraction
255
+ # remains bounded and generation itself is still exactly single-pass.
256
+ REFERENCE_WINDOW_SECONDS = 3.0
257
+ REFERENCE_HOP_SECONDS = 1.5
258
+ REFERENCE_MAX_WINDOWS = 4
259
+ REFERENCE_FULL_CLIP_MAX_SECONDS = 0.0
260
  SPEAKER_GENERATION_SEED = 56_789
261
  SPEAKER_B_LABEL = "內建語者 B"
262
  SPEAKER_B_PROJECTOR_SCALE = 1.125
 
3947
  )
3948
 
3949
  with gr.Tab("參考音色"):
3950
+ gr.Markdown(
3951
+ "建議錄製 6–12 秒、單一語者且背景乾淨的授權參考音檔;"
3952
+ "至少需要 3 秒。"
3953
+ )
3954
  with gr.Row():
3955
  with gr.Column():
3956
  reference_text = gr.Textbox(label="文字", lines=4, max_lines=8)
tests/test_latency_first_mode.py CHANGED
@@ -207,10 +207,10 @@ def test_reference_conditioning_uses_one_fixed_embedding():
207
  source = APP_PATH.read_text(encoding="utf-8")
208
  reference_source = ast.get_source_segment(source, _function_node("tts_reference"))
209
 
210
- assert "REFERENCE_WINDOW_SECONDS = 30.0" in source
211
- assert "REFERENCE_HOP_SECONDS = 30.0" in source
212
- assert "REFERENCE_MAX_WINDOWS = 1" in source
213
- assert "REFERENCE_FULL_CLIP_MAX_SECONDS = 30.0" in source
214
  assert "REFERENCE_CONDITIONING_SCALE = 1.25" in source
215
  assert "REFERENCE_GENERATION_SEED = 1_337" in source
216
  assert "REFERENCE_PROJECTOR_SCALE = 1.25" in source
 
207
  source = APP_PATH.read_text(encoding="utf-8")
208
  reference_source = ast.get_source_segment(source, _function_node("tts_reference"))
209
 
210
+ assert "REFERENCE_WINDOW_SECONDS = 3.0" in source
211
+ assert "REFERENCE_HOP_SECONDS = 1.5" in source
212
+ assert "REFERENCE_MAX_WINDOWS = 4" in source
213
+ assert "REFERENCE_FULL_CLIP_MAX_SECONDS = 0.0" in source
214
  assert "REFERENCE_CONDITIONING_SCALE = 1.25" in source
215
  assert "REFERENCE_GENERATION_SEED = 1_337" in source
216
  assert "REFERENCE_PROJECTOR_SCALE = 1.25" in source