From 9210b7dde63bb03439edc04d5cd49b2d7ee885b8 Mon Sep 17 00:00:00 2001 From: let5sne Date: Sun, 19 Jul 2026 03:01:48 +0800 Subject: [PATCH] feat(speech): switch mentor voice to anna and slow warm speed to 0.88 diana auditioned too bright for the mentor persona; anna measures steadier (median F0 220Hz, lowest variance) in production auditions. --- .../main/java/org/dromara/aihr/service/AihrSpeechService.java | 4 ++-- .../java/org/dromara/aihr/service/AihrSpeechServiceTest.java | 4 ++-- mobile-uni/src/services/speech.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrSpeechService.java b/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrSpeechService.java index 2d7391b9..befd6a98 100644 --- a/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrSpeechService.java +++ b/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrSpeechService.java @@ -36,7 +36,7 @@ public class AihrSpeechService { private static final String DEFAULT_TTS_VOICE = "anna"; private static final Pattern SAFE_VOICE = Pattern.compile("[A-Za-z0-9_./:-]{1,200}"); private static final Map ROLE_VOICES = Map.of( - "mentor", "diana", + "mentor", "anna", "customer", "bella", "interviewer", "alex" ); @@ -181,7 +181,7 @@ public class AihrSpeechService { return switch (emotion) { case "intense" -> 1.12; case "serious" -> 1.04; - case "warm" -> 0.92; + case "warm" -> 0.88; case "professional" -> 0.96; default -> 0.98; }; diff --git a/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrSpeechServiceTest.java b/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrSpeechServiceTest.java index 20aa93df..67edccb3 100644 --- a/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrSpeechServiceTest.java +++ b/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrSpeechServiceTest.java @@ -32,8 +32,8 @@ class AihrSpeechServiceTest { var legacy = AihrSpeechService.buildRequestBody( mapper, runtime, "普通播报", "alex", null); - assertEquals("FunAudioLLM/CosyVoice2-0.5B:diana", mentor.path("voice").asText()); - assertEquals(0.92, mentor.path("speed").asDouble()); + assertEquals("FunAudioLLM/CosyVoice2-0.5B:anna", mentor.path("voice").asText()); + assertEquals(0.88, mentor.path("speed").asDouble()); assertTrue(mentor.path("input").asText().contains("师傅语气")); assertEquals("FunAudioLLM/CosyVoice2-0.5B:bella", customer.path("voice").asText()); assertEquals(1.3, customer.path("speed").asDouble()); diff --git a/mobile-uni/src/services/speech.ts b/mobile-uni/src/services/speech.ts index 7f7b5ad7..8aa09d76 100644 --- a/mobile-uni/src/services/speech.ts +++ b/mobile-uni/src/services/speech.ts @@ -3,7 +3,7 @@ import { apiRequest, apiUrl, authHeaders, readTextPayload } from './api'; const audioExtensions = ['.mp3', '.wav', '.m4a', '.webm', '.aac', '.ogg']; -export const MENTOR_VOICE_PROFILE: SpeechVoiceProfile = { role: 'mentor', emotion: 'warm', speed: 0.92 }; +export const MENTOR_VOICE_PROFILE: SpeechVoiceProfile = { role: 'mentor', emotion: 'warm', speed: 0.88 }; export const INTERVIEWER_VOICE_PROFILE: SpeechVoiceProfile = { role: 'interviewer', emotion: 'professional', speed: 0.96 }; export const customerVoiceProfile = (emotion = 0): SpeechVoiceProfile => { if (emotion >= 80) return { role: 'customer', emotion: 'intense', speed: 1.12 };