[BUG] Apple Speech always transcribes Chinese as Simplified (zh-CN); Traditional Chinese (zh-TW / zh-HK) cannot be selected
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 56/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- macos, swift
- Domain
- backend, developer-experience
Research direction
Start with Voice Engine settings and Sources/Fluid/Persistence/VoiceEngineLanguageCatalog.swift, then trace how AppleSpeechProvider, AppleSpeechAnalyzerProvider, and SettingsStore.selectedAppleSpeechLocale use the selected locale. Check the engines’ supported locale lists and existing locale download path. Done means users can select an appropriate Chinese locale in settings and both Apple engines use that saved choice.
Written by the indexing model from the issue text.
Description
Describe the bug
With either Apple engine selected ("Apple Speech - macOS 26+", which uses SpeechTranscriber, or "Apple ASR Legacy", which uses SFSpeechRecognizer), Chinese dictation always comes out in Simplified Chinese. Users in Taiwan and Hong Kong need Traditional Chinese.
macOS supports Traditional Chinese for both engines, but FluidVoice gives no way to choose it:
- The language catalog maps Chinese to one locale only. In
Sources/Fluid/Persistence/VoiceEngineLanguageCatalog.swift,appleSpeechAnalyzerLocaleMaphas"zh": "zh-CN". The legacy preference list is["zh-CN", "zh-TW", "zh-HK"], but the code takes the first supported entry, so it also always pickszh-CN. - Only onboarding sets
SelectedAppleSpeechLocaleIdentifier(throughVoiceEngineLanguageCatalog.apply). The Voice Engine settings page has a language picker for Whisper only, and onboarding cannot be reopened after it finishes. A user who chose Mandarin is stuck onzh-CN.
Both engines read the same key: AppleSpeechProvider (legacy) and AppleSpeechAnalyzerProvider both build their locale from SettingsStore.selectedAppleSpeechLocale. I have only tested "Apple Speech - macOS 26+".
In #185 (https://github.com/altic-dev/FluidVoice/issues/185) another user asked for Mandarin (Taiwan) and Cantonese (Hong Kong) on Apple Speech. That issue was closed with the reply that Apple doesn't offer many locales. On my Mac, both APIs do list them, and the zh-TW model for SpeechTranscriber is already installed. I got these lists by calling SFSpeechRecognizer.supportedLocales(), SpeechTranscriber.supportedLocales and SpeechTranscriber.installedLocales from a small Swift script (swift list_locales.swift), filtered to Chinese:
SFSpeechRecognizer.supportedLocales: yue-CN, zh-CN, zh-HK, zh-TW
SpeechTranscriber.supportedLocales: yue-CN, zh-CN, zh-HK, zh-TW
SpeechTranscriber.installedLocales: zh-CN, zh-TW
list_locales.swift
import Speech
print("legacy:", SFSpeechRecognizer.supportedLocales().map{$0.identifier}.filter{$0.hasPrefix("zh")||$0.hasPrefix("yue")}.sorted())
if #available(macOS 26, *) {
let s = await SpeechTranscriber.supportedLocales
print("analyzer:", s.map{$0.identifier(.bcp47)}.filter{$0.hasPrefix("zh")||$0.hasPrefix("yue")}.sorted())
let i = await SpeechTranscriber.installedLocales
print("installed:", i.map{$0.identifier(.bcp47)}.sorted())
}
Workaround that works for me: quit FluidVoice, run the command below, and relaunch. Dictation then comes out in Traditional Chinese, and the setting persists across launches.
defaults write com.FluidApp.app SelectedAppleSpeechLocaleIdentifier zh-TW
Reproduction steps
- In onboarding, choose Mandarin as the language and "Apple Speech - macOS 26+" as the model.
- Dictate a sentence in Mandarin. The text uses Simplified characters (for example 这/说 instead of 這/說).
- Run
defaults read com.FluidApp.app SelectedAppleSpeechLocaleIdentifier. It printszh-CN. - Open Voice Engine settings. Apple Speech shows no language or region option.
Expected behavior
In Voice Engine settings, I can choose the Apple Speech locale for Chinese, for example zh-TW to get Traditional Chinese output.
Actual behavior
Chinese always uses zh-CN, so the output is Simplified. There is no UI to change it.
Suggested fix
Add a locale picker for the Apple engines in Voice Engine settings, filled from the selected engine's supportedLocales and filtered to the current language (for Mandarin, the zh-* locales). Show it only when the language has more than one locale. The picker writes the same SelectedAppleSpeechLocaleIdentifier key that onboarding writes, so both stay in sync. For a locale that isn't installed yet, the existing download path in AppleSpeechAnalyzerProvider (AssetInventory.assetInstallationRequest) already handles it. Onboarding can stay as it is.
I have only tested zh-TW. I haven't checked whether Apple's zh-HK model recognizes Mandarin or Cantonese. yue-CN is Cantonese (China mainland), and offering it could also cover the Cantonese part of #185.
I'm happy to send a PR if this approach works for you.
App Version
1.6.11
macOS Version
macOS 27.0.1, build 26A434 (as printed by sw_vers)
Architecture
Apple Silicon
- Dominant language
- Swift
- Stars
- 11.9k
- Forks
- 863
- Avg merge
- 1d 12h
- Merged PRs (30d)
- 37
Getting set up
This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from altic-dev/FluidVoice
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
altic-dev/FluidVoice#1191 ·
Maintainers usually reply within 1 day
-
[BUG] File transcription skips audio chunks shorter than one secondPossibly taken @sabbah13 claimed this 7 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
altic-dev/FluidVoice#1161 ·
Maintainers usually reply within 1 day
-
bug
Difficulty 3/5 1-2 days Newbie friendliness 58/100
altic-dev/FluidVoice#1225 ·
Maintainers usually reply within 1 day
-
Difficulty 4/5 3-5 days Newbie friendliness 44/100
altic-dev/FluidVoice#1223 ·
Maintainers usually reply within 1 day
-
enhancement
Difficulty 5/5 Over a week Newbie friendliness 35/100
altic-dev/FluidVoice#1222 ·
Maintainers usually reply within 1 day
All issues in altic-dev/FluidVoice
Similar issues
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
lugassawan/swe-workbench#823 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
swiftlang/indexstore-db#306 ·
-
AlertPlayground iOS build failure in Xcode 27/Swift 6.4Possibly taken @dfabulich claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
skiptools/skipapp-showcase#143 ·
-
host-ios R2 blocker Stability
Difficulty 1/5 Under an hour Newbie friendliness 70/100
paritytech/trinity-user-agents#1661 ·
Maintainers usually reply within 1 day
-
bug
Difficulty 1/5 Under an hour Newbie friendliness 76/100
logto-io/logto#9837 · 1 comment ·
Maintainers usually reply within 1 day