feat: add streaming cloud ASR, polish routing, and settings card layout

Unify Bailian/Volcengine/OpenAI realtime streaming, ABE polish routing with
fun styles, and a shared card-page Settings hierarchy; bump to 1.1 (build 32).
This commit is contained in:
Rocky
2026-07-28 20:25:17 +08:00
parent 956331a2af
commit d656bac8c3
58 changed files with 4153 additions and 1396 deletions
+21 -2
View File
@@ -10,7 +10,7 @@ final class CloudASRTests: XCTestCase {
XCTAssertEqual(CloudASRModelCatalog.strategy(for: "zhipu"), .zhipuHotwords)
XCTAssertEqual(CloudASRModelCatalog.strategy(for: "qwen"), .localFallback)
XCTAssertEqual(CloudASRModelCatalog.strategy(for: "bailian"), .bailianStreaming)
XCTAssertEqual(CloudASRModelCatalog.strategy(for: "openai"), .prompt)
XCTAssertEqual(CloudASRModelCatalog.strategy(for: "openai"), .openaiRealtimeStreaming)
XCTAssertEqual(CloudASRModelCatalog.strategy(for: "whisper"), .prompt)
XCTAssertEqual(CloudASRModelCatalog.strategy(for: "mimo"), .prompt)
XCTAssertEqual(CloudASRModelCatalog.strategy(for: "groq"), .prompt)
@@ -25,7 +25,7 @@ final class CloudASRTests: XCTestCase {
XCTAssertEqual(CloudASRModelCatalog.defaultModel(for: "bailian"), "fun-asr-realtime")
XCTAssertEqual(CloudASRModelCatalog.defaultModel(for: "zhipu"), "glm-asr-2512")
XCTAssertEqual(CloudASRModelCatalog.defaultModel(for: "mimo"), "mimo-v2.5-asr")
XCTAssertEqual(CloudASRModelCatalog.defaultModel(for: "openai"), "gpt-4o-mini-transcribe")
XCTAssertEqual(CloudASRModelCatalog.defaultModel(for: "openai"), "gpt-realtime-whisper")
XCTAssertEqual(CloudASRModelCatalog.defaultModel(for: "whisper"), "whisper-1")
XCTAssertEqual(CloudASRModelCatalog.defaultModel(for: "groq"), "whisper-large-v3-turbo")
XCTAssertEqual(CloudASRModelCatalog.defaultModel(for: "siliconflow"), "FunAudioLLM/SenseVoiceSmall")
@@ -65,6 +65,25 @@ final class CloudASRTests: XCTestCase {
XCTAssertFalse(LLMProvider.provider(id: "moonshot").supportsPersonalDictionaryCloudASR)
}
func testTrueStreamingASRProviders() {
XCTAssertTrue(CloudASRModelCatalog.supportsTrueStreamingASR(for: "bailian"))
XCTAssertTrue(CloudASRModelCatalog.supportsTrueStreamingASR(for: "volcengine"))
XCTAssertTrue(CloudASRModelCatalog.supportsTrueStreamingASR(for: "openai"))
XCTAssertTrue(LLMProvider.provider(id: "bailian").supportsStreamingCloudASR)
XCTAssertTrue(LLMProvider.provider(id: "volcengine").supportsStreamingCloudASR)
XCTAssertTrue(LLMProvider.provider(id: "openai").supportsStreamingCloudASR)
XCTAssertFalse(CloudASRModelCatalog.supportsTrueStreamingASR(for: "mimo"))
XCTAssertFalse(CloudASRModelCatalog.supportsTrueStreamingASR(for: "zhipu"))
XCTAssertFalse(CloudASRModelCatalog.supportsTrueStreamingASR(for: "groq"))
XCTAssertFalse(CloudASRModelCatalog.supportsTrueStreamingASR(for: "whisper"))
}
func testUpsample16kTo24kPreservesDurationRatio() {
let input = [Float](repeating: 0.25, count: 1_600) // 100 ms @ 16 kHz
let output = CloudASRStreamingPCM.upsample16kTo24k(input)
XCTAssertEqual(output.count, 2_400) // 100 ms @ 24 kHz
}
func testShowsASREndpointField() {
XCTAssertTrue(CloudASRModelCatalog.showsASREndpointField(for: "bailian"))
XCTAssertTrue(CloudASRModelCatalog.showsASREndpointField(for: "openai"))