Realtime voice: Korean live transcript renders U+FFFD replacement characters (Frameless/AVAS path)
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 46/100
- Issue type
- Bug
- Clarity
- Mostly clear
- Activity status
- Quiet
- Tech stack
- rust
- Domain
- audio-video-rtc, backend
Research direction
Start with the codex-rs realtime chain, especially protocol_common.rs::parse_transcript_delta_event and the sideband path consuming tungstenite Message::Text. Reproduce a Korean realtime voice session and compare transcript deltas through the app-server thread/realtime/transcript/delta notifications. Done means the corruption source is identified and Hangul transcript updates no longer produce U+FFFD characters.
Written by the indexing model from the issue text.
Description
Summary
In the Codex desktop app's realtime voice conversation, Korean live transcripts intermittently render U+FFFD replacement characters where a Hangul syllable should be. Example: 가볍게 얘기핼봐요 renders as 가볍게 ��기핼봐요.
One 3-byte Hangul syllable (얘 = U+C598 = EC 96 98) becoming exactly two U+FFFD is the signature of lossy UTF-8 decoding of a byte sequence that was split at a EC 96 | 98-style boundary. Somewhere in the voice transcript path, bytes are being decoded at a chunk boundary instead of as complete UTF-8.
Environment
- Codex desktop app (bundled codex
0.146.0-alpha.3.1, framework150.0.7871.128), macOS arm64 - ChatGPT auth; realtime voice via call-create + sideband WebSocket (Frameless/AVAS,
intent=quicksilver&architecture=avas)
What I ruled out, with evidence
- Local proxy relay (opencodex, transparent sideband relay). A regression test driving Korean text frames, binary UTF-8 frames, and ~1.3 MB large frames through the relay passes byte-identically in both directions. Relay does not touch frame contents.
- codex-rs realtime chain (source audit @
4462b9dee). The sideband is consumed via tungsteniteMessage::Text(protocol-validated UTF-8); transcript deltas are parsed with serdeas_str(protocol_common.rs::parse_transcript_delta_event); app-serverthread/realtime/transcript/deltanotifications are serde Strings end to end; the app renderer concatenates strings. No lossy decode exists in any inspectable hop. - Public GA Realtime WS API. I streamed synthesized Korean speech (24 kHz PCM16 mono) to
wss://api.openai.com/v1/realtime?model=gpt-realtimewithgpt-4o-transcribeinput transcription. All 25conversation.item.input_audio_transcription.deltaevents and the.completedtranscript came back as clean Korean with zero U+FFFD — the public pipeline handles multibyte delta boundaries correctly.
Conclusion
Every client-side and public-API hop is Unicode-safe, so the corruption is introduced either:
- in the internal Frameless/AVAS input-transcription delta pipeline (server side, distinct from the public GA pipeline I tested), or
- in the bundled realtime consumer in the desktop app (which is newer than the public codex-rs source I could audit).
Reproduction
- Open a realtime voice conversation in the Codex desktop app.
- Speak Korean (a TTS sample is enough — I used macOS
saywith ako_KRvoice at 24 kHz). - Watch the live transcript; Hangul syllables sporadically appear as
��pairs mid-stream.
Ask
Please check the Frameless/AVAS input-transcription delta path for byte-level chunking followed by lossy UTF-8 decode. If it helps, I have an env-gated frame tap on the local relay (per-frame direction/kind/byte-length/U+FFFD-context, no payloads) that can attribute the corruption to upstream vs client from one real voice session — happy to share a capture.
- Dominant language
- Rust
- Stars
- 125k
- Forks
- 19.5k
- Avg merge
- 1m
- Merged PRs (30d)
- 1k
Contributor guide
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 openai/codex
-
enhancement remote
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
-
bug CLI windows-os
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
-
macOS sandbox blocks hw.optional.arm64 sysctl, causing Flutter to misdetect Apple Silicon as x64 Openbug CLI sandbox
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
-
bug CLI TUI
Difficulty 2/5 1-3 hours Newbie friendliness 90/100
-
CLI config enhancement skills
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
kwakseongjae/auto-hwp#319 ·
-
area:cli bug filter-quality good first issue priority:medium
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
-
Difficulty 1/5 Under an hour Newbie friendliness 72/100
bevyengine/bevy#25861 ·
-
comp-datalake
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
ClickHouse/ClickHouse#121222 ·
-
A-linter
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
oxc-project/oxc#26863 ·