Skip to content

Support Unicode stress marks (U+0301) for Russian text #65

Description

@stilletto

Problem

When generating Russian speech, OmniVoice sometimes places word stress incorrectly. Russian has many homographs where stress position changes meaning:

  • за́мок (castle) vs замо́к (lock)
  • му́ка (suffering) vs мука́ (flour)
  • ду́хи (spirits) vs духи́ (perfume)

Currently there is no way to control stress placement in Russian text.

What I tried

Method Result
Unicode combining acute accent (U+0301): за́мок Ignored by model
Plus sign after vowel: за+мок Ignored or read as literal "+"
ARPAbet injection [Z AA1 M AH0 K] for single words Works! But gives English accent
Full text in ARPAbet Sounds foreign, not Russian
SSML <phoneme> tags Ignored

The only working approach is partial ARPAbet injection (specific homograph words only, rest in Cyrillic), but it introduces a slight English accent on those words.

Proposed solution

Support the Unicode combining acute accent (U+0301, ◌́) placed after the stressed vowel in Russian text:

"Старый за́мок стоял на холме́. Замо́к на двери́ был сло́ман."

This is the standard linguistic way to mark Russian stress and is already used by:

  • Russian dictionaries
  • ruaccent library
  • Wiktionary Russian entries

Why this matters

Russian TTS quality depends heavily on correct stress. With 600+ language support, OmniVoice is uniquely positioned to handle this well. A simple stress mark would make Russian output significantly more natural, especially for:

  • Audiobook narration
  • Game NPC dialogue
  • Virtual assistants

Environment

  • OmniVoice 0.1.2
  • PyTorch 2.8.0, CUDA
  • Using voice cloning with Russian reference audio

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions