Skip to content

Commit

Permalink
WorldVoice 1.7.2
Browse files Browse the repository at this point in the history
  • Loading branch information
tsengwoody committed Jul 3, 2021
1 parent af87d88 commit ae30413
Show file tree
Hide file tree
Showing 12 changed files with 191 additions and 186 deletions.
1 change: 0 additions & 1 deletion addon/generics/speechSymbols/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +0,0 @@

2 changes: 0 additions & 2 deletions addon/generics/speechSymbols/models.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
# coding: utf-8

import codecs
import collections
import os
Expand Down
6 changes: 2 additions & 4 deletions addon/generics/speechSymbols/views.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
# coding: utf-8

import copy
import os
import wx
Expand Down Expand Up @@ -319,9 +317,9 @@ def onOk(self, evt):
self.speechSymbols = None
if gui.messageBox(
# Translators: The message displayed
_("For the edited unicode rule to apply, NVDA must be restarted. Press enter to restart NVDA, or cancel to exit at a later time."),
_("For the edited unicode rule to apply, NVDA must be restarted. Do you want to restart NVDA now?"),
# Translators: The title of the dialog
_("unicode rule edited"),wx.OK|wx.CANCEL|wx.ICON_WARNING,self
_("unicode rule edited"), wx.OK|wx.CANCEL|wx.ICON_WARNING, self
)==wx.OK:
queueHandler.queueFunction(queueHandler.eventQueue,core.restart)

Expand Down
71 changes: 36 additions & 35 deletions addon/generics/synthDrivers/__init__.py
Original file line number Diff line number Diff line change
@@ -1,47 +1,22 @@
import re

import driverHandler
import languageHandler
import speech

try:
from speech import IndexCommand, CharacterModeCommand, LangChangeCommand, BreakCommand, PitchCommand, RateCommand, VolumeCommand
from speech import LangChangeCommand, BreakCommand
except:
from speech.commands import IndexCommand, CharacterModeCommand, LangChangeCommand, BreakCommand, PitchCommand, RateCommand, VolumeCommand
from speech.commands import LangChangeCommand, BreakCommand

from synthDrivers.WorldVoiceXVED2 import _config

number_pattern = re.compile(r"[0-9]+[0-9.:]*[0-9]+|[0-9]")
comma_number_pattern = re.compile(r"(?<=[0-9]),(?=[0-9])")
chinese_space_pattern = re.compile(r"(?<=[\u4e00-\u9fa5])\s+(?=[\u4e00-\u9fa5])")

class WorldVoiceBaseSynthDriver:

def patchedSpeak(self, speechSequence, symbolLevel=None, priority=None):
if self._cni:
temp = []
for command in speechSequence:
if isinstance(command, str):
temp.append(comma_number_pattern.sub(lambda m:'', command))
else:
temp.append(command)
speechSequence = temp
if self.uwv \
and _config.vocalizerConfig['autoLanguageSwitching']['useUnicodeLanguageDetection'] \
and not _config.vocalizerConfig['autoLanguageSwitching']['afterSymbolDetection']:
speechSequence = self._languageDetector.add_detected_language_commands(speechSequence)
speechSequence = list(speechSequence)
self._realSpeakFunc(speechSequence, symbolLevel, priority=priority)

def patchedSpeakSpelling(self, text, locale=None, useCharacterDescriptions=False, priority=None):
if config.conf["speech"]["autoLanguageSwitching"] \
and _config.vocalizerConfig['autoLanguageSwitching']['useUnicodeLanguageDetection'] \
and config.conf["speech"]["trustVoiceLanguage"]:
for text, loc in self._languageDetector.process_for_spelling(text, locale):
self._realSpellingFunc(text, loc, useCharacterDescriptions, priority=priority)
else:
self._realSpellingFunc(text, locale, useCharacterDescriptions, priority=priority)

def patchedNumSpeechSequence(self, speechSequence):
return self.coercionNumberLangChange(speechSequence, self._numlan, self._nummod)
return self.coercionNumberLangChange(speechSequence, self._nummod, self._numlan, self.speechSymbols)

def patchedSpaceSpeechSequence(self, speechSequence):
if not int(self._chinesespace) == 0:
Expand Down Expand Up @@ -100,23 +75,49 @@ def lengthsplit(self, string, length):
result.append(fragment)
return result

def resplit(self, pattern, string, mode):
def resplit(self, pattern, string, mode, numberLanguage, speechSymbols):
result = []
numbers = pattern.findall(string)
others = pattern.split(string)
for other, number in zip(others, numbers):
dot_count = len(number.split("."))
if mode == 'value':
result.extend([other, LangChangeCommand('StartNumber'), number, LangChangeCommand('EndNumber')])
number_str = number
elif mode == 'number':
result.extend([other, LangChangeCommand('StartNumber'), ' '.join(number).replace(" . ", " ."), LangChangeCommand('EndNumber')])
dot_count = dot_count +1
number_str = ' '.join(number).replace(" . ", ".")

translate_dict = {}
for c in "1234567890":
if speechSymbols and c in speechSymbols.symbols:
symbol = speechSymbols.symbols[c]
if symbol.language == numberLanguage or symbol.language == "Windows":
translate_dict[ord(c)] = symbol.replacement if symbol.replacement else c

nodot_str = number_str.split(".")
temp = ""
for n, d in zip(nodot_str, ["."]*(len(nodot_str) -1)):
if len(n) == 1:
n = n.translate(translate_dict)
temp = temp +n +d
n = nodot_str[-1]
if len(n) == 1:
n = n.translate(translate_dict)
temp = temp +n
number_str = temp

if dot_count > 2:
number_str = number_str.replace(".", _config.vocalizerConfig["autoLanguageSwitching"]["numberDotReplacement"])

result.extend([other, LangChangeCommand('StartNumber'), number_str, LangChangeCommand('EndNumber')])
result.append(others[-1])
return result

def coercionNumberLangChange(self, speechSequence, numberLanguage, mode):
def coercionNumberLangChange(self, speechSequence, mode, numberLanguage, speechSymbols):
result = []
for command in speechSequence:
if isinstance(command, str):
result.extend(self.resplit(number_pattern, command, mode))
result.extend(self.resplit(number_pattern, command, mode, numberLanguage, speechSymbols))
else:
result.append(command)

Expand Down
2 changes: 0 additions & 2 deletions addon/globalPlugins/WorldVoiceXVED2/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-

import os
import sys
base_dir = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
Expand Down
7 changes: 7 additions & 0 deletions addon/globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,12 @@ def makeSettings(self, sizer):
self.Bind(wx.EVT_SLIDER, self.onVolumeSliderScroll, self._volumeSlider)
self.sliderDisable()

self._dotText = settingsSizerHelper.addLabeledControl(
labelText=_("Number dot replacement"),
wxCtrlClass=wx.TextCtrl,
value=_config.vocalizerConfig["autoLanguageSwitching"]["numberDotReplacement"],
)

self._useUnicodeDetectionCheckBox = wx.CheckBox(self,
# Translators: Wether to use or not unicode characters based language detection.
label=_("Detect text language based on unicode characters"))
Expand Down Expand Up @@ -219,6 +225,7 @@ def onOk(self, event):
except BaseException as e:
pass

_config.vocalizerConfig["autoLanguageSwitching"]["numberDotReplacement"] = self._dotText.GetValue()
_config.vocalizerConfig["autoLanguageSwitching"]["useUnicodeLanguageDetection"] = self._useUnicodeDetectionCheckBox.GetValue()
_config.vocalizerConfig["autoLanguageSwitching"]["afterSymbolDetection"] = self._afterSymbolDetectionCheckBox.GetValue()
_config.vocalizerConfig["autoLanguageSwitching"]["ignoreNumbersInLanguageDetection"] = self._ignoreNumbersCheckBox.GetValue()
Expand Down
89 changes: 46 additions & 43 deletions addon/locale/zh_CN/LC_MESSAGES/nvda.po
Original file line number Diff line number Diff line change
Expand Up @@ -7,107 +7,107 @@ msgid ""
msgstr ""
"Project-Id-Version: 'WorldVoiceXVE' '1.6'\n"
"Report-Msgid-Bugs-To: '[email protected]'\n"
"POT-Creation-Date: 2021-02-03 08:50+0800\n"
"PO-Revision-Date: 2021-02-03 08:52+0800\n"
"POT-Creation-Date: 2021-07-02 10:25+0800\n"
"PO-Revision-Date: 2021-07-02 10:26+0800\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.4.2\n"
"X-Generator: Poedit 3.0\n"
"X-Poedit-Basepath: ../../..\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Poedit-SearchPath-0: .\n"

#: generics/contextHelp.py:34
#: generics/speechSymbols/contextHelp.py:34
msgid "No help available here."
msgstr "无可用说明"

#: generics/contextHelp.py:41
#: generics/speechSymbols/contextHelp.py:41
msgid "No user guide found."
msgstr "未找到用户指南。"

#: generics/models.py:22
#: generics/speechSymbols/models.py:22
msgid "context"
msgstr "上下文"

#: generics/models.py:23
#: generics/speechSymbols/models.py:23
msgid "force"
msgstr "强制"

#: generics/views.py:33
#: generics/speechSymbols/views.py:33
msgid "Add Symbol"
msgstr "添加符号"

#: generics/views.py:38
#: generics/speechSymbols/views.py:38
msgid "&Symbol:"
msgstr "符号(&S)"

#: generics/views.py:61
#: generics/speechSymbols/views.py:61
msgid "Unicode Setting"
msgstr "Unicode 设置"

#: generics/views.py:85
#: generics/speechSymbols/views.py:85
msgid "&Symbols"
msgstr "符号(&S)"

#: generics/views.py:95
#: generics/speechSymbols/views.py:95
msgid "Unicode"
msgstr "Unicode"

#: generics/views.py:97
#: generics/speechSymbols/views.py:97
msgid "Replacement"
msgstr "替换文字"

#: generics/views.py:99
#: generics/speechSymbols/views.py:99
msgid "Language"
msgstr "语言"

#: generics/views.py:102
#: generics/speechSymbols/views.py:102
msgid "Mode"
msgstr "模式"

#: generics/views.py:106
#: generics/speechSymbols/views.py:106
msgid "Change selected symbol"
msgstr "更改选择的符号"

#: generics/views.py:128
#: generics/speechSymbols/views.py:128
msgid "&Replacement"
msgstr "替换文字(&R)"

#: generics/views.py:136
#: generics/speechSymbols/views.py:136
msgid "&language"
msgstr "语言(&L)"

#: generics/views.py:141
#: generics/speechSymbols/views.py:141
msgid "&Detect language mode"
msgstr "语言检测模式"

#: generics/views.py:148
#: generics/speechSymbols/views.py:148
msgid "&Add"
msgstr "添加(&A)"

#: generics/views.py:151
#: generics/speechSymbols/views.py:151
msgid "Re&move"
msgstr "移除(&R)"

#: generics/views.py:256
#: generics/speechSymbols/views.py:256
#, python-format
msgid "Symbol \"%s\" is already present."
msgstr "符号 \"%s\" 已存在"

#: generics/views.py:257
#: generics/speechSymbols/views.py:257
msgid "Error"
msgstr "错误"

#: generics/views.py:322
#: generics/speechSymbols/views.py:322
msgid ""
"For the edited unicode rule to apply, NVDA must be restarted. Press enter to "
"restart NVDA, or cancel to exit at a later time."
msgstr "为了让已编辑的 Unicode 生效,必须重新启动 NVDA,您要立即重新启动吗?"

#: generics/views.py:324
#: generics/speechSymbols/views.py:324
msgid "unicode rule edited"
msgstr "unicode 规则已编辑"

Expand Down Expand Up @@ -218,63 +218,63 @@ msgstr "音调(&P)"
msgid "V&olume:"
msgstr "音量(&O)"

#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:78
#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:77
msgid "Number dot replacement"
msgstr "数字点替换文字"

#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:84
msgid "Detect text language based on unicode characters"
msgstr "用 unicode 编码检测文本语言"

#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:84
#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:90
msgid "Detect text language after symbol process"
msgstr "在符号处理后检测文本语言"

#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:90
#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:96
msgid "Ignore numbers when detecting text language"
msgstr "检测语言时忽略数字"

#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:96
#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:102
msgid "Ignore common punctuation when detecting text language"
msgstr "检测语言时忽略数字和常见的标点符号"

#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:101
#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:107
msgid "Language assumed for latin characters:"
msgstr "拉丁字符对应的语言"

#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:111
#: globalPlugins/WorldVoiceXVED2/speechSettingsDialog.py:117
msgid "Language assumed for CJK characters:"
msgstr "中日韩字符对应的语言:"

#: synthDrivers/WorldVoiceXVED2/__init__.py:44
#: synthDrivers/WorldVoiceXVED2/__init__.py:51
msgid "Number &Language"
msgstr "数字语言(&M)"

#: synthDrivers/WorldVoiceXVED2/__init__.py:48
#: synthDrivers/WorldVoiceXVED2/__init__.py:55
msgid "Number Language"
msgstr "数字语言"

#: synthDrivers/WorldVoiceXVED2/__init__.py:53
#: synthDrivers/WorldVoiceXVED2/__init__.py:60
msgid "Number &Mode"
msgstr "数字模式(&M)"

#: synthDrivers/WorldVoiceXVED2/__init__.py:57
#: synthDrivers/WorldVoiceXVED2/__init__.py:64
msgid "Number Mode"
msgstr "数字模式"

#: synthDrivers/WorldVoiceXVED2/__init__.py:62
#: synthDrivers/WorldVoiceXVED2/__init__.py:69
msgid "Pause time when encountering spaces between Chinese"
msgstr "中文空格暂停时间"

#: synthDrivers/WorldVoiceXVED2/__init__.py:68
#: synthDrivers/WorldVoiceXVED2/__init__.py:75
msgid "Ignore comma between number"
msgstr "忽略数字中的逗号"

#: synthDrivers/WorldVoiceXVED2/__init__.py:73
msgid "Ignore language information of document"
msgstr "忽略文档中的语言信息"

#: synthDrivers/WorldVoiceXVED2/__init__.py:78
#: synthDrivers/WorldVoiceXVED2/__init__.py:80
msgid "Enable WorldVoice setting rules to detect text language"
msgstr "启用 WorldVoice 设定规则来检测文本语言"

#: synthDrivers/WorldVoiceXVED2/__init__.py:81
#: synthDrivers/WorldVoiceXVED2/__init__.py:83
msgid "Enable WorldVoice rules"
msgstr "启用 WorldVoice 规则"

Expand All @@ -290,6 +290,9 @@ msgstr "数值"
msgid "number"
msgstr "数字"

#~ msgid "Ignore language information of document"
#~ msgstr "忽略文档中的语言信息"

#~ msgid "Automatic &Language Switching Settings"
#~ msgstr "自动语言切换设定(&L)"

Expand Down
Loading

0 comments on commit ae30413

Please sign in to comment.