Abdelrahman2922's picture
Add files using upload-large-folder tool
8d6afae verified
Raw
History Blame Contribute Delete
2.76 kB
#!/usr/bin/env python3
# Copyright 2026 Xiaomi Corp. (authors: Han Zhu)
#
# See ../../LICENSE for clarification regarding multiple authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Voice-design instruct constants for TTS inference.
Defines speaker attribute tags (gender, age, pitch, accent, dialect) and
translation/validation utilities between English and Chinese. Used by
``OmniVoice.generate()`` for voice design mode.
"""
import re
_ZH_RE = re.compile(r'[\u4e00-\u9fff]')
# Category = set of {english: chinese, ...} items that are mutually exclusive.
# Accent (EN-only) and dialect (ZH-only) are stored as flat sets below.
_INSTRUCT_CATEGORIES = [
{"male": "男", "female": "女"},
{"child": "儿童", "teenager": "少年", "young adult": "青年",
"middle-aged": "中年", "elderly": "老年"},
{"very low pitch": "极低音调", "low pitch": "低音调",
"moderate pitch": "中音调", "high pitch": "高音调",
"very high pitch": "极高音调"},
{"whisper": "耳语"},
# Accent (English-only, no Chinese counterpart)
{"american accent", "british accent", "australian accent",
"chinese accent", "canadian accent", "indian accent",
"korean accent", "portuguese accent", "russian accent", "japanese accent"},
# Dialect (Chinese-only, no English counterpart)
{"河南话", "陕西话", "四川话", "贵州话", "云南话", "桂林话",
"济南话", "石家庄话", "甘肃话", "宁夏话", "青岛话", "东北话"},
]
_INSTRUCT_EN_TO_ZH = {}
_INSTRUCT_ZH_TO_EN = {}
_INSTRUCT_MUTUALLY_EXCLUSIVE = []
for _cat in _INSTRUCT_CATEGORIES:
if isinstance(_cat, dict):
_INSTRUCT_EN_TO_ZH.update(_cat)
_INSTRUCT_ZH_TO_EN.update({v: k for k, v in _cat.items()})
_INSTRUCT_MUTUALLY_EXCLUSIVE.append(set(_cat) | set(_cat.values()))
else:
_INSTRUCT_MUTUALLY_EXCLUSIVE.append(set(_cat))
_INSTRUCT_ALL_VALID = (
set(_INSTRUCT_EN_TO_ZH) | set(_INSTRUCT_ZH_TO_EN)
| _INSTRUCT_MUTUALLY_EXCLUSIVE[-2] # accents
| _INSTRUCT_MUTUALLY_EXCLUSIVE[-1] # dialects
)
_INSTRUCT_VALID_EN = frozenset(i for i in _INSTRUCT_ALL_VALID if not _ZH_RE.search(i))
_INSTRUCT_VALID_ZH = frozenset(i for i in _INSTRUCT_ALL_VALID if _ZH_RE.search(i))