Merge the MicroslopSam engine into the repository

This commit is contained in:
Fisto
2026-09-21 12:16:33 +02:00
parent 51d42b3a16
commit bbb580deea
30 changed files with 8959 additions and 82 deletions
+6 -1
View File
@@ -33,6 +33,11 @@ before you stop.
The client must not crash, and the daemon must not send malformed data to Discord. The client must not crash, and the daemon must not send malformed data to Discord.
- Keep core patches isolated. Add actions in `src/renderer/puppet/` and the bridge in - Keep core patches isolated. Add actions in `src/renderer/puppet/` and the bridge in
`src/main/puppetBridge.ts`. Do not spread logic through upstream files. `src/main/puppetBridge.ts`. Do not spread logic through upstream files.
- TTS lives in `microslopsam/` (merged from the standalone SAM engine project, including the
vendored binaries: they are hard to acquire and small enough to track). Before changing anything
TTS, read `TTS-DESIGN.md` and `microslopsam/docs/TTS-DESIGN.md`, confirm the in-repo copy is
current, and run `sh microslopsam/setup/test-wrapper.sh`. The daemon's engine points at
`microslopsam/setup/veskslop-tts.sh`; nothing may reference an external SAM checkout.
- The daemon holds the logic: triggers, trust list, command parsing, trigger log, and pacing. - The daemon holds the logic: triggers, trust list, command parsing, trigger log, and pacing.
- The daemon binds to localhost. Remote access goes over LAN or Tailscale only. - The daemon binds to localhost. Remote access goes over LAN or Tailscale only.
- Pacing: the daemon sends the first action of a burst in 30-200 ms, then spaces sends 500-2800 ms. - Pacing: the daemon sends the first action of a burst in 30-200 ms, then spaces sends 500-2800 ms.
@@ -72,7 +77,7 @@ before you stop.
| User search (cache and guild members) | Implemented | | User search (cache and guild members) | Implemented |
| Voice state read and `VOICE_STATE_UPDATE` events | Implemented | | Voice state read and `VOICE_STATE_UPDATE` events | Implemented |
| Voice actions (`voice.join`, `voice.leave`, `voice.move`) | Implemented. Auto-leave follows the owner. `stay @user` pending. | | Voice actions (`voice.join`, `voice.leave`, `voice.move`) | Implemented. Auto-leave follows the owner. `stay @user` pending. |
| Voice audio (TTS, virtual mic, ducking, browser monitor) | Implemented. Microphone puppeting pending. | | Voice audio (TTS, virtual mic, ducking, browser monitor) | Implemented. MicroslopSam engine merged into `microslopsam/`; VOX/HEV presets, VOX prosody, word mode, and the hum are live. Microphone puppeting pending. |
| Audio capture and transcript (VAD, WAV, STT hook, live events) | Implemented. STT provider not chosen. | | Audio capture and transcript (VAD, WAV, STT hook, live events) | Implemented. STT provider not chosen. |
| Voice video | Not started. Plan in [docs/voice.md](docs/voice.md). | | Voice video | Not started. Plan in [docs/voice.md](docs/voice.md). |
| Notification parsing (edits, deletes, reactions, replies) | Implemented | | Notification parsing (edits, deletes, reactions, replies) | Implemented |
+9
View File
@@ -40,6 +40,15 @@ mobile draft at 390px.
- [x] C11 preview caching: Discord-hosted image/GIF previews (WebP 320px, hash-addressed, 5 MiB - [x] C11 preview caching: Discord-hosted image/GIF previews (WebP 320px, hash-addressed, 5 MiB
cap, one attempt) run after every walk in both modes. Live run `...-20260916090722`: cap, one attempt) run after every walk in both modes. Live run `...-20260916090722`:
`previewed: 2`; thumbs served over `/api/media/<scrape>/<item>/thumb` (200). `previewed: 2`; thumbs served over `/api/media/<scrape>/<item>/thumb` (200).
- [x] C66 Merged the SAM engine into Veskslop. `microslopsam/` is now a full copy of the
standalone project as it ran (wrapper, docs, README, build artifacts, and the vendored
binaries SAM tracks), the runtime env points at `microslopsam/setup/veskslop-tts.sh` with
regenerated voices, and `microslopsam/setup/microslopsam.env` resolves inside the repo. The
word-mode + preset fix from C65 landed on the merged wrapper (word mode wins over VOX prosody,
parser skipped, per-word rate/pitch tags, preset-aware `--voices`); the wrapper test harness
passes and a real-engine run shows 9 per-word gaps at 11.1 s versus 7.5 s for a single
utterance. An `env -i` run proved the copy runs without the SAM project. Process rule added to
AGENTS.md: read TTS-DESIGN first, keep the in-repo copy current, run the wrapper tests.
- [x] C65 Word mode with the Half-Life preset. Word mode no longer yields to VOX prosody: with - [x] C65 Word mode with the Half-Life preset. Word mode no longer yields to VOX prosody: with
a preset it synthesizes each word with the preset profile (per-word `\!R`/`\!%` tags), and the a preset it synthesizes each word with the preset profile (per-word `\!R`/`\!%` tags), and the
VOX parser is skipped because its tags cannot survive a word split. The daemon always exports VOX parser is skipped because its tags cannot survive a word split. The daemon always exports
+3 -3
View File
@@ -4,10 +4,10 @@ build/
*.so *.so
*.exe *.exe
*.dll *.dll
!third_party/**/*.exe
!third_party/**/*.dll
setup/out-*.reg setup/out-*.reg
*.wav *.wav
# Generated per-checkout configuration.
setup/microslopsam.env setup/microslopsam.env
third_party/flextalk/extracted/
__pycache__/ __pycache__/
# Engine DLLs and voice data are proprietary; never commit them.
third_party/
+15 -13
View File
@@ -22,8 +22,6 @@ pure-native build, and keep a path to a fully portable engine.
- AT&T Flextalk: Keith Bell, Kerry Watson - AT&T Flextalk: Keith Bell, Kerry Watson
- Test output: `build/test_sam.wav` (22.05 kHz), `build/test_Keith_Bell.wav`, - Test output: `build/test_sam.wav` (22.05 kHz), `build/test_Keith_Bell.wav`,
`build/test_Kerry_Watson.wav` (11.025 kHz). `build/test_Kerry_Watson.wav` (11.025 kHz).
- Wrapper contract test (no Wine needed, stubs wine and the engine host):
`sh setup/test-wrapper.sh`.
## Build ## Build
@@ -61,12 +59,6 @@ without editing scripts:
Refresh the file after moving the tree: `MICROSLOP_UPDATE_ENV=1 setup/install.sh`. Refresh the file after moving the tree: `MICROSLOP_UPDATE_ENV=1 setup/install.sh`.
In the Veskslop tree the `third_party/` assets are **not committed** (licensing; see
`docs/TTS-DESIGN.md`). This checkout has a local `setup/microslopsam.env` (gitignored) that
points `MICROSLOP_ASSETS`, `MICROSLOP_FLEXTALK_DIR`, and `MICROSLOP_SPEECH_H_DIR` at the
MicroslopSam development checkout. A manual host build needs the same override, or a local
`third_party/` with `speech.h`.
## Usage ## Usage
setup/run.sh -l setup/run.sh -l
@@ -97,6 +89,14 @@ command environment (`VESKSLOP_TTS_VOX_CLEAN=1` omits the `\!wH1/\!wH0` stutter
wrapper). Line-leading `/rate N` and `/pitch N` controls are also handled by the wrapper). Line-leading `/rate N` and `/pitch N` controls are also handled by the
wrapper, so the WebUI does not need to implement them. See `docs/TTS-DESIGN.md`. wrapper, so the WebUI does not need to implement them. See `docs/TTS-DESIGN.md`.
A short low-level leading hum (80 ms, 75 Hz, -48 dBFS) primes Discord's audio pipeline
so the first word is not gated; tune with `VESKSLOP_TTS_HUM_MS` (0 = off),
`VESKSLOP_TTS_HUM_HZ`, and `VESKSLOP_TTS_HUM_DB`.
**Half-Life presets** (Keith Bell): `VESKSLOP_TTS_PRESET=vox` applies the approximated
Valve VOX profile and enables VOX prosody; `VESKSLOP_TTS_PRESET=hev` is a starting point
for the HEV suit voice. Values are in `docs/TTS-DESIGN.md`.
## Layout ## Layout
- `host/sapi4host.c` — host: voice select, pitch/speed, text -> WAV - `host/sapi4host.c` — host: voice select, pitch/speed, text -> WAV
@@ -118,12 +118,14 @@ wrapper, so the WebUI does not need to implement them. See `docs/TTS-DESIGN.md`.
windows. windows.
- Flextalk numeric speaker settings must be `REG_DWORD` (the installer script handles - Flextalk numeric speaker settings must be `REG_DWORD` (the installer script handles
this); `REG_SZ` values cause a monotone buzz. Pitch and speed work on all voices. this); `REG_SZ` values cause a monotone buzz. Pitch and speed work on all voices.
- The Flextalk archive lacks `data2.cab`; `unshield -O` extracts `data1.cab` - Flextalk extraction needs `unshield -O` (old compression). The installer is
but one tail file (`WatsonUNInstall.dll`) is incomplete. single-volume: the new decompressor reports a phantom `data2.cab`, but `-O` extracts
all 450 entries with exact sizes and valid PE files (the original 1997 upload log lists
`data1.cab` only).
## Reference material ## Reference material
- The MicroslopSam development checkout (`third_party/`): SAPI4 runtime, MSTTS voices, - `third_party/` — vendored dependencies; see `third_party/README.md`. Everything the
Flextalk cabinet, `speech.h`, NetTTS parser source. Referenced through tool needs is in the repo (SAPI4 runtime, MSTTS voices, Flextalk cabinet, `speech.h`,
`setup/microslopsam.env`; not committed here. NetTTS parser source).
- `/mnt/ghidra/decomp/{msttssyn.dll,speech.dll}/` — decompiled corpora (external, optional) - `/mnt/ghidra/decomp/{msttssyn.dll,speech.dll}/` — decompiled corpora (external, optional)
+36 -2
View File
@@ -47,8 +47,32 @@ From `msttsl/mstts.inf` (`[TTSReg]`):
`.COD` codebook, plus shared `DICT_CI.*`, `phondef`, `AMPRULES`, `ENDINGS`. `.COD` codebook, plus shared `DICT_CI.*`, `phondef`, `AMPRULES`, `ENDINGS`.
Extraction: `unshield -O -d extracted x installer/flextalk/data1.cab` Extraction: `unshield -O -d extracted x installer/flextalk/data1.cab`
(`-O` = old compression; the archive.org package has no `data2.cab`, so the (`-O` = old compression). The package is single-volume: the original 1997 upload log
final file `WatsonUNInstall.dll` is incomplete). (`WS_FTP.LOG`) lists `data1.cab` only, and `-O` extracts all 450 entries with exact
sizes. Without `-O`, unshield's new decompressor reports a phantom "volume 2" and fails
on `MSVCRT.DLL` / `WatsonUNInstall.dll`; with `-O` both are complete, valid PE files.
The `.ENV` files the engine probes (`ae1m11lc.ENV`) were never shipped; synthesis works
without them.
## Latency and output shape (measured 2026-09-16)
- Warm wrapper time: ~410-425 ms per short line (engine call 190-220 ms, ffmpeg measure
~110 ms, apply ~90 ms, profile write ~57 ms when it runs). First (cold) call ~730 ms.
- The Flextalk profile write is cached per voice in the Wine prefix
(`~/.wine-microslopsam/.microslopsam-profile<GUID>.reg`): unchanged profiles skip
`wine reg import`. Recreating the prefix invalidates the cache.
- Fades: the 8 ms fade-in/out is applied to the trimmed file whose 25-30 ms padding
silence is retained, so it shapes silence, not speech. Measured head: first sample
>30 at 22.6 ms, speech (>500) at 29.6 ms, natural ~15 ms attack; tail decays over
~18 ms. No click, no attenuation of the first word.
- Leading hum (default on): 80 ms of 75 Hz at -48 dBFS peak before the engine padding,
to prime Discord's pipeline. Verified 75.0 Hz / -48.0 dBFS, speech onset ~110 ms,
final -18.6 LUFS / -3.0 dBFS, apply pass +~10 ms. `VESKSLOP_TTS_HUM_MS=0` disables and
reproduces the previous output byte-for-byte. Tuning: `_HUM_HZ` (30-200), `_HUM_DB`
(-80..-6; raise toward -36 if a client still gates the start).
The hum bypasses the high-pass/trim chain, so `VESKSLOP_TTS_HIGHPASS` (up to 400 Hz)
cannot remove it (verified at 200 and 400 Hz).
## SAPI4 runtime engine discovery (`speech.dll`) ## SAPI4 runtime engine discovery (`speech.dll`)
@@ -105,6 +129,16 @@ final file `WatsonUNInstall.dll` is incomplete).
- VOX mode is Flextalk-only. The wrapper enables it with `VESKSLOP_TTS_VOX=1` - VOX mode is Flextalk-only. The wrapper enables it with `VESKSLOP_TTS_VOX=1`
(`VESKSLOP_TTS_VOX_CLEAN=1` drops the stutter wrapper) and it takes precedence (`VESKSLOP_TTS_VOX_CLEAN=1` drops the stutter wrapper) and it takes precedence
over `VESKSLOP_TTS_WORDS`. over `VESKSLOP_TTS_WORDS`.
- Half-Life presets (`VESKSLOP_TTS_PRESET=vox|hev`) target Keith Bell only. VOX values
come from NetTTS `nettts_flextalk_vox_profile.reg`: pitch 3, rate 17, prominences 22,
head size 52, volume 70 (factory: 27/33/17/46/100); `vox` also implies VOX prosody.
`hev` (pitch 15, rate 24) is an unverified starting point - HL1 credits the suit
sounds to Kelly Bailey with no published settings.
- Flextalk rate/pitch are applied as **vendor tags** (`\!R` = duration factor,
`\!%` = pitch multiplier), never `-s`/`-p`, because ITTSAttributes override the
registry profile. Neutral values emit no tag, so Veskslop's default sliders
(1.0 / 0) reproduce the preset byte-for-byte. Presets write the full 26-value NetTTS
profile plus `Default Speaker` into both HKCU and HKLM.
- Line-leading `/rate N` and `/pitch N` controls are consumed by the wrapper - Line-leading `/rate N` and `/pitch N` controls are consumed by the wrapper
(percent, 100 = normal; `<= 2.0` means multiplier). They override the env (percent, 100 = normal; `<= 2.0` means multiplier). They override the env
speed/pitch and are not spoken; a controls-only line yields 100 ms of silence. speed/pitch and are not spoken; a controls-only line yields 100 ms of silence.
+121 -7
View File
@@ -229,6 +229,22 @@ record what the engine needs to interpret, add, or hide._
- Verified: Keith Bell -18.4 LUFS, Kerry Watson -17.9 LUFS, Sam -20.6 LUFS; every file is - Verified: Keith Bell -18.4 LUFS, Kerry Watson -17.9 LUFS, Sam -20.6 LUFS; every file is
48 kHz mono s16le at -3.0 dBFS true peak. The WAV handed to Veskslop is compliant; the 48 kHz mono s16le at -3.0 dBFS true peak. The WAV handed to Veskslop is compliant; the
"Veskslop does not normalize" rule holds. "Veskslop does not normalize" rule holds.
- Fades: the 8 ms fade-in/out is applied to the trimmed file, and the retained 25-30 ms
padding silence sits at the edges, so the fade shapes silence, not the first phoneme.
Measured on a Keith Bell line: first sample >30 at 22.6 ms, speech (>500) at 29.6 ms,
attack rising naturally over about 15 ms, tail decaying over about 18 ms. No click and
no attenuation of the first word; Veskslop's 150 ms playback lead-in sits on top.
- Leading hum (on by default): 80 ms of a 75 Hz sine at -48 dBFS peak is prepended
before the engine padding, to keep Discord's audio pipeline open so the first word is
not gated. Configurable: `VESKSLOP_TTS_HUM_MS` (0 disables), `_HUM_HZ` (30-200),
`_HUM_DB` (-80..-6). It sits about 45 dB under the speech peak; raise `_HUM_DB` toward
-36 if a client still gates the start, lower it for stealth. Generated in the same
ffmpeg pass (no extra process) and not part of the EBU measurement, so the documented
loudness/peak targets still hold. The hum is mixed on its own chain and bypasses the
high-pass/trim chain, so raising `VESKSLOP_TTS_HIGHPASS` (40-400 Hz) never removes it
(verified at 200 and 400 Hz: still 75.0 Hz / -48.0 dBFS). Measured: hum 75.0 Hz /
-48.0 dBFS, speech onset at about 110 ms, final -18.6 LUFS / -3.0 dBFS; `HUM_MS=0`
reproduces the previous output byte-for-byte.
### Voice IDs ### Voice IDs
@@ -371,6 +387,94 @@ Other NetTTS features and their relevance:
our prefix runs the engines with builtin Wine libraries. our prefix runs the engines with builtin Wine libraries.
- Win32 GUI and preset sliders: Veskslop provides the UI. - Win32 GUI and preset sliders: Veskslop provides the UI.
### Half-Life VOX / HEV presets
The Half-Life announcement voice (VOX / Black Mesa Announcement System) is the Flextalk
engine's **Keith Bell** voice with an adjusted speaker profile. NetTTS publishes an
approximation of Valve's settings (`scripts/winetricks/nettts_flextalk_vox_profile.reg`,
see its issues #53/#54/#67): the profile targets Keith Bell's speaker key and leaves
Kerry Watson at factory values. The wrapper implements it as a preset:
VESKSLOP_TTS_PRESET=vox # implies VOX prosody unless VESKSLOP_TTS_VOX is set
VESKSLOP_TTS_PRESET=hev # HEV suit starting point (see note below)
| Profile value | Factory (Keith) | VOX preset | HEV preset (approx.) |
| --- | --- | --- | --- |
| Pitch | 27 | 3 | 15 |
| Speaking Rate | 33 | 17 | 24 |
| Prominences | 17 | 22 | 22 |
| Head Size | 46 | 52 | 52 |
| Lowering | 40 | 40 | 40 |
| Volume | 100 | 70 | 70 |
| Expression | 59 | 59 | 59 |
- Presets apply only to `keith-bell`; every other voice keeps its defaults.
- Precedence: preset < `VESKSLOP_TTS_PROFILE` < `VESKSLOP_TTS_EXPRESSION`.
- Equivalent explicit override:
`VESKSLOP_TTS_PROFILE='pitch:3,rate:17,volume:70,prominences:22,head_size:52,lowering:40'`.
- HEV suit: Half-Life 1 credits the suit sounds to Kelly Bailey; no settings were ever
published. The `hev` preset is a starting point (less extreme than VOX); tune pitch and
rate to taste. VOX prosody is optional there (`VESKSLOP_TTS_VOX=1`).
#### How NetTTS applies the settings (reference behaviour)
Checked against the NetTTS sources (`src/main.cpp`, `src/tts_engine.cpp`,
`scripts/winetricks/nettts_flextalk_vox_profile.reg`):
1. **Voice**: the imported profile points `Default Speaker` at Keith Bell's GUID, and
NetTTS selects the default mode (empty `TTSMODEINFO`) rather than a voice name.
2. **Speaker profile**: the full key set is imported into **both** hives
(`HKEY_CURRENT_USER` and `HKEY_LOCAL_MACHINE`) at prefix setup; every numeric value is
`REG_DWORD`.
3. **Rate and pitch are never set through `ITTSAttributes`.** NetTTS keeps UI percentages
and prepends sticky vendor tags to the utterance text:
- `\!R<factor>` = duration factor. Smaller is faster: `0.30` very fast, `1.00` 1.0x,
`1.60` slow. No tag at 100%.
- `\!%<factor>` = pitch multiplier. `0.85` lower, `1.20` higher. No tag at 100%.
4. **Volume** goes through `ITTSAttributes::VolumeSet(percent * 65535 / 100)` (Flextalk
scale; MSTTS uses 0..0xFFFFFFFF).
5. **Prosody**: the VOX parser output wrapped in `\!wH1 ... \!wH0`.
6. The tags are sticky inside an engine instance; NetTTS sends the neutral tag only to
reset. Our wrapper starts a fresh engine per line, so stickiness cannot leak.
#### How to implement it correctly (and the bug this fixed)
Earlier wrapper versions mapped `VESKSLOP_TTS_SPEED`/`_PITCH` to `ITTSAttributes`
`-s`/`-p`. Measured with the VOX profile loaded, Veskslop's neutral slider values
(`speed=1.0, pitch=0`) sent `-s 150 -p 106`, which overrode the registry profile: F0
jumped from 87 Hz back to 120 Hz and the line shortened from 5.83 s to 5.10 s. That is
the "too fast, not deep enough" report.
The correct implementation for Flextalk:
1. Write the speaker profile first (both hives, `REG_DWORD`, full key set for presets;
`Default Speaker` for presets).
2. Translate rate/pitch to vendor tags, **not** attributes:
- speed multiplier `m` -> `\!R(1/m)` (clamp 0.25-4.0)
- pitch semitones `st` -> `\!%(2^(st/12))` (clamp 0.5-2.0)
3. Emit **no tag when neutral** (`m == 1`, `st == 0`). `\!R1.00` is a literal 1.0x rate,
not the profile rate, so emitting it defeats the preset.
4. Prepend the tags to the text (`\!R0.77 \!%1.19 Attention all personnel.`); for word
mode, prepend to each word because every word is a separate engine instance.
5. Keep `-s`/`-p` only for MSTTS voices, which have no vendor tags.
6. Verify with F0 and duration, not by ear: factory Keith ~3.35 s / ~123 Hz; VOX preset
~5.83 s / ~87 Hz; neutral sliders must reproduce the preset byte-for-byte.
Verified matrix (same line, Keith Bell):
| Run | Duration | F0 median |
| --- | --- | --- |
| factory, no adjustments | 3.35 s | 123 Hz |
| VOX preset, no adjustments | 5.83 s | 87 Hz |
| VOX preset + `speed=1.0 pitch=0` | 5.83 s, byte-identical | 87 Hz |
| VOX preset + `speed=1.3` | 4.02 s | 84 Hz |
| VOX preset + `pitch=+3` | 5.83 s | 88 Hz |
| HEV preset, no adjustments | 3.79 s | - |
Registry inspection after a preset run: 26 values in the Keith speaker key in both
hives, `Pitch=0x3`, `Speaking Rate=0x11`, `Gender=0x2`, `Line Mode=0x1`,
`Default Speaker={11260610-C84A-11CE-AEC4-0000C0E9CB87}`.
### Inline rate/pitch controls (engine-side) ### Inline rate/pitch controls (engine-side)
The wrapper consumes NetTTS-style, line-leading controls, so Veskslop and the WebUI do The wrapper consumes NetTTS-style, line-leading controls, so Veskslop and the WebUI do
@@ -437,8 +541,10 @@ This tree is written to survive a copy into the Veskslop repository next to its
(`VESKSLOP_TTS_*`, `{out}`, `{text_file}`, voice/speed/pitch/expression/profile/ (`VESKSLOP_TTS_*`, `{out}`, `{text_file}`, voice/speed/pitch/expression/profile/
highpass/echo/words/word_gap_ms). New features are additive and default off. highpass/echo/words/word_gap_ms). New features are additive and default off.
3. Optional Veskslop-side follow-up: a `tts.vox` preference that exports 3. Optional Veskslop-side follow-up: a `tts.vox` preference that exports
`VESKSLOP_TTS_VOX` (like `words`) and a line in the TTS panel help. The inline `VESKSLOP_TTS_VOX` (like `words`) and a line in the TTS panel help. If presets are
`/rate` and `/pitch` controls need no UI work at all. exposed, also export `VESKSLOP_TTS_PRESET` and have the voice metadata defaults reflect
the preset values so the UI's "default" snap points match. The inline `/rate` and
`/pitch` controls need no UI work at all.
### Transport and latency ### Transport and latency
@@ -451,11 +557,15 @@ This tree is written to survive a copy into the Veskslop repository next to its
text file, transliterates UTF-8 to CP1252, starts or reuses an Xvfb when `DISPLAY` is text file, transliterates UTF-8 to CP1252, starts or reuses an Xvfb when `DISPLAY` is
unset, calls the engine, then post-processes (trim, fades, measured fixed gain, 48 kHz unset, calls the engine, then post-processes (trim, fades, measured fixed gain, 48 kHz
mono s16le). A stale private Xvfb is retried once. mono s16le). A stale private Xvfb is retried once.
- Measured on the dev host: engine-only synthesis is about 290 ms wall for Sam and about - Measured on the dev host (warm): engine call about 190 ms (Flextalk) to 220 ms (Sam)
40 ms for Flextalk, including process start; the full wrapper adds the ffmpeg including Wine start, ffmpeg measure about 110 ms, ffmpeg apply about 90 ms, profile
measure/apply passes, about 630-880 ms per short line. That is above the 500 ms target; registry write about 57 ms when it runs. Full wrapper: about 410-425 ms per short line
the known optimization is a per-voice static gain (skip the measurement pass), expected warm, about 730 ms for the first (cold) call. The 500 ms target is met warm; Veskslop's
to land around 400-500 ms. "Start engine" warm-up covers the cold case.
- Latency optimization implemented: the Flextalk profile write is cached per voice inside
the Wine prefix (`.microslopsam-profile<GUID>.reg`); an unchanged profile skips the
`wine reg import` round-trip (about 57 ms warm, 300 ms cold). Recreating the prefix
invalidates the cache automatically.
- Manual checks: `setup/run.sh -l`, `setup/run.sh -v "Keith Bell" -t "Hello." -o out.wav` - Manual checks: `setup/run.sh -l`, `setup/run.sh -v "Keith Bell" -t "Hello." -o out.wav`
(raw engine WAV), and the wrapper above for normalized output. (raw engine WAV), and the wrapper above for normalized output.
- HTTP provider (later): a persistent process returning `audio/wav` bytes and `/voices`, - HTTP provider (later): a persistent process returning `audio/wav` bytes and `/voices`,
@@ -465,6 +575,10 @@ This tree is written to survive a copy into the Veskslop repository next to its
- Flextalk numeric speaker settings must be `REG_DWORD`; `REG_SZ` values make the engine - Flextalk numeric speaker settings must be `REG_DWORD`; `REG_SZ` values make the engine
synthesize a buzz. `setup/setup-flextalk.sh` writes them correctly. synthesize a buzz. `setup/setup-flextalk.sh` writes them correctly.
- Flextalk cabinet is single-volume: `unshield -O` extracts all 450 entries with exact
sizes. Without `-O`, the new decompressor reports a phantom "volume 2" and fails on
`MSVCRT.DLL` / `WatsonUNInstall.dll`; both are complete with `-O` (verified against the
original 1997 upload log, which lists `data1.cab` only).
- The mode list includes TruVoice names with no installed voice data; filter those out of - The mode list includes TruVoice names with no installed voice data; filter those out of
`/voices` (or mark them `unavailable`). `/voices` (or mark them `unavailable`).
- Wine needs a working X display; the project helper starts a persistent Xvfb. - Wine needs a working X display; the project helper starts a persistent Xvfb.
+2 -2
View File
@@ -78,7 +78,7 @@ check "neutral flextalk has no attributes" "0" "$(attr_count)"
# Adjustments ride as tags; attributes stay out even at non-neutral values. # Adjustments ride as tags; attributes stay out even at non-neutral values.
VESKSLOP_TTS_VOICE=keith-bell VESKSLOP_TTS_VOX=0 \ VESKSLOP_TTS_VOICE=keith-bell VESKSLOP_TTS_VOX=0 \
VESKSLOP_TTS_SPEED=1.3 VESKSLOP_TTS_PITCH=3 run_wrapper VESKSLOP_TTS_SPEED=1.3 VESKSLOP_TTS_PITCH=3 run_wrapper
check "flextalk rate tag" "\!R0.769 \!%1.189 Attention all personnel." "$(text_for)" check "flextalk rate tag" "\!R0.77 \!%1.19 Attention all personnel." "$(text_for)"
check "flextalk has no attributes" "0" "$(attr_count)" check "flextalk has no attributes" "0" "$(attr_count)"
# MSTTS has no vendor tags and keeps the attributes. # MSTTS has no vendor tags and keeps the attributes.
@@ -109,7 +109,7 @@ VESKSLOP_TTS_VOICE=keith-bell VESKSLOP_TTS_PRESET=vox VESKSLOP_TTS_VOX=1 \
check "word mode with preset synthesizes every word" "3" "$(grep -c '^ARGV:' "$STUB_LOG")" check "word mode with preset synthesizes every word" "3" "$(grep -c '^ARGV:' "$STUB_LOG")"
check "word mode skips the VOX parser" "0" "$(grep -c 'wH1' "$STUB_LOG")" check "word mode skips the VOX parser" "0" "$(grep -c 'wH1' "$STUB_LOG")"
check "word mode tags every word" "3" \ check "word mode tags every word" "3" \
"$(sed -n 's/.*\[-t\] \[\(.*\)\] \[-o\].*/\1/p' "$STUB_LOG" | grep -c '^\\!R0.800 ')" "$(sed -n 's/.*\[-t\] \[\(.*\)\] \[-o\].*/\1/p' "$STUB_LOG" | grep -c '^\\!R0.80 ')"
check "word mode keeps the preset profile" "2" "$(grep -c '"Pitch"=dword:00000003' "$STUB_REG")" check "word mode keeps the preset profile" "2" "$(grep -c '"Pitch"=dword:00000003' "$STUB_REG")"
check "word mode emits no attributes" "0" "$(attr_count)" check "word mode emits no attributes" "0" "$(attr_count)"
+129 -54
View File
@@ -19,9 +19,13 @@
# VESKSLOP_TTS_WORDS 1 = synthesize each word, merge (Flextalk); # VESKSLOP_TTS_WORDS 1 = synthesize each word, merge (Flextalk);
# combines with a preset and wins over VOX prosody # combines with a preset and wins over VOX prosody
# VESKSLOP_TTS_WORD_GAP_MS silence between words in ms (0-500) # VESKSLOP_TTS_WORD_GAP_MS silence between words in ms (0-500)
# VESKSLOP_TTS_PRESET vox | hev (Keith Bell profile preset; vox implies VOX)
# VESKSLOP_TTS_VOX 1 = VOX prosody, NetTTS-style (Flextalk) # VESKSLOP_TTS_VOX 1 = VOX prosody, NetTTS-style (Flextalk)
# VESKSLOP_TTS_VOX_CLEAN 1 = VOX without the \!wH1/\!wH0 stutter # VESKSLOP_TTS_VOX_CLEAN 1 = VOX without the \!wH1/\!wH0 stutter
# VESKSLOP_TTS_HUM_MS leading low hum in ms, 0 = off (default 80)
# VESKSLOP_TTS_HUM_HZ hum frequency, 30-200 (default 75)
# VESKSLOP_TTS_HUM_DB hum peak level, -80..-6 (default -48)
# VESKSLOP_TTS_PRESET vox | hev (Half-Life profiles, Keith Bell;
# vox also enables VOX prosody)
# #
# Output: 48 kHz mono s16le WAV, trimmed, faded, loudness-normalized. # Output: 48 kHz mono s16le WAV, trimmed, faded, loudness-normalized.
set -eu set -eu
@@ -30,17 +34,18 @@ HERE=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
. "$HERE/config.sh" . "$HERE/config.sh"
ROOT=$MICROSLOP_ROOT ROOT=$MICROSLOP_ROOT
# VESKSLOP_TTS_VOICES entries: id|Name|gender|language[|flags] # The Keith Bell defaults follow the active preset so the UI's "default" snap points
# `expression=NN` marks a Flextalk voice with an Expression profile parameter and # match the values the preset actually writes.
# its registry default. Expression is applied at voice load, so the wrapper writes
# it into the Wine registry before synthesis.
# The Keith Bell defaults follow the active preset so the UI's "default" snap points match
# the values the preset actually writes.
case "${VESKSLOP_TTS_PRESET:-}" in case "${VESKSLOP_TTS_PRESET:-}" in
vox) KB_DEFAULTS="pitch:3:rate:17:prominences:22:head_size:52:lowering:40:expression:59" ;; vox) KB_DEFAULTS="pitch:3:rate:17:prominences:22:head_size:52:lowering:40:expression:59" ;;
hev) KB_DEFAULTS="pitch:15:rate:24:prominences:22:head_size:52:lowering:40:expression:59" ;; hev) KB_DEFAULTS="pitch:15:rate:24:prominences:22:head_size:52:lowering:40:expression:59" ;;
*) KB_DEFAULTS="pitch:27:rate:33:prominences:17:head_size:46:lowering:40:expression:59" ;; *) KB_DEFAULTS="pitch:27:rate:33:prominences:17:head_size:46:lowering:40:expression:59" ;;
esac esac
# VESKSLOP_TTS_VOICES entries: id|Name|gender|language[|flags]
# `expression=NN` marks a Flextalk voice with an Expression profile parameter and
# its registry default. Expression is applied at voice load, so the wrapper writes
# it into the Wine registry before synthesis.
VOICES="sam|Sam|male|en,mary|Mary|female|en,mike|Mike|male|en,keith-bell|Keith Bell|male|en|expression=59+defaults=$KB_DEFAULTS,kerry-watson|Kerry Watson|female|en|expression=100+defaults=pitch:65:rate:32:prominences:17:head_size:45:lowering:40:expression:100,mike-telephone|Mike (for Telephone)|male|en,mary-telephone|Mary (for Telephone)|female|en,mike-hall|Mike in Hall|male|en,mike-stadium|Mike in Stadium|male|en,mike-space|Mike in Space|male|en,mary-hall|Mary in Hall|female|en,mary-stadium|Mary in Stadium|female|en,mary-space|Mary in Space|female|en" VOICES="sam|Sam|male|en,mary|Mary|female|en,mike|Mike|male|en,keith-bell|Keith Bell|male|en|expression=59+defaults=$KB_DEFAULTS,kerry-watson|Kerry Watson|female|en|expression=100+defaults=pitch:65:rate:32:prominences:17:head_size:45:lowering:40:expression:100,mike-telephone|Mike (for Telephone)|male|en,mary-telephone|Mary (for Telephone)|female|en,mike-hall|Mike in Hall|male|en,mike-stadium|Mike in Stadium|male|en,mike-space|Mike in Space|male|en,mary-hall|Mary in Hall|female|en,mary-stadium|Mary in Stadium|female|en,mary-space|Mary in Space|female|en"
if [ "${1:-}" = "--voices" ]; then if [ "${1:-}" = "--voices" ]; then
@@ -62,11 +67,14 @@ WORD_GAP=${VESKSLOP_TTS_WORD_GAP_MS:-120}
VOX=${VESKSLOP_TTS_VOX:-0} VOX=${VESKSLOP_TTS_VOX:-0}
VOX_CLEAN=${VESKSLOP_TTS_VOX_CLEAN:-0} VOX_CLEAN=${VESKSLOP_TTS_VOX_CLEAN:-0}
PRESET=${VESKSLOP_TTS_PRESET:-} PRESET=${VESKSLOP_TTS_PRESET:-}
# The VOX preset is the Half-Life announcement voice: it implies VOX prosody
# The vox preset implies VOX prosody unless the caller set VESKSLOP_TTS_VOX explicitly. # unless the caller explicitly disables it.
if [ "$PRESET" = "vox" ] && [ -z "${VESKSLOP_TTS_VOX+x}" ]; then if [ "$PRESET" = "vox" ] && [ -z "${VESKSLOP_TTS_VOX:-}" ]; then
VOX=1 VOX=1
fi fi
HUM_MS=${VESKSLOP_TTS_HUM_MS:-80}
HUM_HZ=${VESKSLOP_TTS_HUM_HZ:-75}
HUM_DB=${VESKSLOP_TTS_HUM_DB:--48}
case "$VOICE" in case "$VOICE" in
sam) ENGVOICE="Sam" ;; sam) ENGVOICE="Sam" ;;
@@ -160,20 +168,24 @@ if [ -f "$TEXTFILE" ]; then
fi fi
fi fi
# Build the engine arguments from the (possibly command-overridden) speed/pitch. # Build the engine controls from the (possibly command-overridden) speed/pitch.
# Flextalk: rate and pitch ride as sticky vendor tags. Setting them through # Flextalk voices take sticky vendor tags relative to the registry profile, the
# ITTSAttributes (-s/-p) overrides the speaker profile, which is the bug that made # way NetTTS does it: \!R is a duration factor (smaller = faster, 1.0 neutral)
# presets sound "too fast and not deep enough". MSTTS has no tags, so it keeps -s/-p. # and \!% is a pitch multiplier (1.0 neutral). ITTSAttributes -s/-p would
# override the profile and make presets sound fast and shallow, so tags are used
# for Flextalk. MSTTS has no vendor tags and keeps -s/-p.
SET_ARGS="" SET_ARGS=""
TAG_PREFIX="" TAG_PREFIX=""
if [ -n "$SPEAKER_GUID" ]; then if [ -n "$SPEAKER_GUID" ]; then
if [ -n "$SPEED" ]; then if [ -n "$SPEED" ]; then
R=$(awk -v m="$SPEED" 'BEGIN{ if (m==1) exit; v=1/m; if (v<0.25) v=0.25; if (v>4.0) v=4.0; printf "%.3f", v }') # A neutral multiplier must not emit a tag: \!R1.00 means a 1.0x rate,
[ -n "$R" ] && TAG_PREFIX="${TAG_PREFIX}\\!R${R} " # which would override the profile's own speaking rate.
R=$(awk -v m="$SPEED" 'BEGIN{ if (m<=0) m=1; if (m==1) { exit } f=1/m; if (f<0.25) f=0.25; if (f>4) f=4; printf "%.2f", f }')
[ -n "$R" ] && TAG_PREFIX="$TAG_PREFIX\\!R$R "
fi fi
if [ -n "$PITCH" ]; then if [ -n "$PITCH" ]; then
P=$(awk -v st="$PITCH" 'BEGIN{ if (st==0) exit; v=exp(log(2)*st/12); if (v<0.5) v=0.5; if (v>2.0) v=2.0; printf "%.3f", v }') PCT=$(awk -v st="$PITCH" 'BEGIN{ if (st==0) { exit } f=exp(log(2)*st/12); if (f<0.5) f=0.5; if (f>2) f=2; printf "%.2f", f }')
[ -n "$P" ] && TAG_PREFIX="${TAG_PREFIX}\\!%${P} " [ -n "$PCT" ] && TAG_PREFIX="$TAG_PREFIX\\!%$PCT "
fi fi
else else
if [ -n "$SPEED" ]; then if [ -n "$SPEED" ]; then
@@ -203,14 +215,24 @@ if [ -n "$SPEAKER_GUID" ]; then
P_LOWER=40 P_LOWER=40
P_EXPR="" P_EXPR=""
# Half-Life presets target Keith Bell only. Precedence: preset < VESKSLOP_TTS_PROFILE # Half-Life presets for Keith Bell (the game's announcement voice).
# < VESKSLOP_TTS_EXPRESSION. # "vox" is the approximated Valve VOX profile published by NetTTS
if [ "$ENGVOICE" = "Keith Bell" ]; then # (scripts/winetricks/nettts_flextalk_vox_profile.reg); "hev" is a starting
case "$PRESET" in # point for the HEV suit voice, which has no published profile.
vox) P_PITCH=3; P_RATE=17; P_PROM=22; P_HEAD=52; P_LOWER=40; P_VOLUME=70; P_EXPR=59 ;; case "$PRESET" in
hev) P_PITCH=15; P_RATE=24; P_PROM=22; P_HEAD=52; P_LOWER=40; P_VOLUME=70; P_EXPR=59 ;; vox)
esac if [ "$ENGVOICE" = "Keith Bell" ]; then
fi P_PITCH=3; P_RATE=17; P_VOLUME=70
P_PROM=22; P_HEAD=52; P_LOWER=40
fi
;;
hev)
if [ "$ENGVOICE" = "Keith Bell" ]; then
P_PITCH=15; P_RATE=24; P_VOLUME=70
P_PROM=22; P_HEAD=52; P_LOWER=40
fi
;;
esac
if [ -n "$PROFILE" ]; then if [ -n "$PROFILE" ]; then
OLDIFS=$IFS OLDIFS=$IFS
@@ -250,21 +272,27 @@ if [ -n "$SPEAKER_GUID" ]; then
esac esac
done done
IS_PRESET=0 # NetTTS's VOX profile also carries Gender, Line Mode, the text-class
if [ "$ENGVOICE" = "Keith Bell" ]; then # switches and the default-speaker pointer. Write the full set for presets,
case "$PRESET" in # exactly like its nettts_flextalk_vox_profile.reg, in both hives.
vox|hev) IS_PRESET=1 ;; FULL_PROFILE=0
esac if [ "$PRESET" = "vox" ] || [ "$PRESET" = "hev" ]; then
if [ "$ENGVOICE" = "Keith Bell" ]; then FULL_PROFILE=1; fi
fi fi
REG_ROOT='Software\AT&T\Watson\2.0\FlexTalk\2.0'
# Use printf, not echo: dash's echo interprets \2 in the key path as an # Use printf, not echo: dash's echo interprets \2 in the key path as an
# escape (STX), which corrupts the key and makes the import a silent no-op. # escape (STX), which corrupts the key and makes the import a silent no-op.
# NetTTS parity: the audible profile goes to both hives. Presets also write the
# informational keys from Valve's setup, and point Default Speaker at Keith Bell.
{ {
printf 'Windows Registry Editor Version 5.00\n\n' printf 'Windows Registry Editor Version 5.00\n\n'
for HIVE in 'HKEY_LOCAL_MACHINE' 'HKEY_CURRENT_USER'; do if [ "$FULL_PROFILE" = "1" ]; then
printf '[%s\\Software\\AT&T\\Watson\\2.0\\FlexTalk\\2.0\\Speakers\\%s]\n' "$HIVE" "$SPEAKER_GUID" printf '[HKEY_LOCAL_MACHINE\\%s]\n' "$REG_ROOT"
printf '"Default Speaker"="%s"\n\n' "$SPEAKER_GUID"
printf '[HKEY_CURRENT_USER\\%s]\n' "$REG_ROOT"
printf '"Default Speaker"="%s"\n\n' "$SPEAKER_GUID"
fi
for hive in HKEY_LOCAL_MACHINE HKEY_CURRENT_USER; do
printf '[%s\\%s\\Speakers\\%s]\n' "$hive" "$REG_ROOT" "$SPEAKER_GUID"
printf '"Pitch"=dword:%08x\n' "$P_PITCH" printf '"Pitch"=dword:%08x\n' "$P_PITCH"
printf '"Speaking Rate"=dword:%08x\n' "$P_RATE" printf '"Speaking Rate"=dword:%08x\n' "$P_RATE"
printf '"Volume"=dword:%08x\n' "$P_VOLUME" printf '"Volume"=dword:%08x\n' "$P_VOLUME"
@@ -272,19 +300,29 @@ if [ -n "$SPEAKER_GUID" ]; then
printf '"Prominences"=dword:%08x\n' "$P_PROM" printf '"Prominences"=dword:%08x\n' "$P_PROM"
printf '"Head Size"=dword:%08x\n' "$P_HEAD" printf '"Head Size"=dword:%08x\n' "$P_HEAD"
printf '"Lowering"=dword:%08x\n' "$P_LOWER" printf '"Lowering"=dword:%08x\n' "$P_LOWER"
if [ "$IS_PRESET" = "1" ]; then if [ "$FULL_PROFILE" = "1" ]; then
printf '"Abbreviation Expansion"=dword:00000001\n'
printf '"Address Class"=dword:00000001\n'
printf '"Age"=dword:0000001e\n'
printf '"Alphabetic Hyphen"=dword:00000000\n'
printf '"Case Significance"=dword:00000001\n'
printf '"Date Class"=dword:00000001\n'
printf '"Fraction Class"=dword:00000001\n'
printf '"Gender"=dword:00000002\n' printf '"Gender"=dword:00000002\n'
printf '"Line Mode"=dword:00000001\n' printf '"Line Mode"=dword:00000001\n'
printf '"Math Mode"=dword:00000000\n'
printf '"Measurements Class"=dword:00000001\n'
printf '"Money Class"=dword:00000001\n'
printf '"Numerical Hyphen"=dword:00000000\n'
printf '"Ordinal Numbers Class"=dword:00000001\n'
printf '"ProofRead Mode"=dword:00000000\n'
printf '"Proper Names Class"=dword:00000001\n'
printf '"Spell Mode"=dword:00000000\n'
printf '"Telephone Numbers Class"=dword:00000001\n'
printf '"Time Class"=dword:00000001\n'
fi fi
printf '\n' printf '\n'
done done
if [ "$IS_PRESET" = "1" ]; then
for HIVE in 'HKEY_LOCAL_MACHINE' 'HKEY_CURRENT_USER'; do
printf '[%s\\Software\\AT&T\\Watson\\2.0\\FlexTalk\\2.0\\Speakers]\n' "$HIVE"
printf '"Default Speaker"="%s"\n\n' "$SPEAKER_GUID"
done
fi
} > "$TMP/profile.reg" } > "$TMP/profile.reg"
# Guard against silent reg-import failures (a malformed key would corrupt # Guard against silent reg-import failures (a malformed key would corrupt
@@ -294,21 +332,34 @@ if [ -n "$SPEAKER_GUID" ]; then
exit 1 exit 1
fi fi
if ! command -v "$MICROSLOP_WINE" >/dev/null 2>&1; then # Skip the wine round-trip when this voice's profile was already applied.
echo "wine is required to set the Flextalk profile" >&2 # The cache lives inside the prefix, so recreating the prefix invalidates
exit 1 # it automatically.
PROFILE_CACHE="$WINEPREFIX/.microslopsam-profile$SPEAKER_GUID.reg"
if [ -f "$PROFILE_CACHE" ] && cmp -s "$TMP/profile.reg" "$PROFILE_CACHE"; then
PROFILE_APPLIED=1
else
PROFILE_APPLIED=0
fi fi
if ! "$MICROSLOP_WINE" reg import "$TMP/profile.reg" >/dev/null 2>&1; then
echo "could not write the Flextalk profile" >&2 if [ "$PROFILE_APPLIED" != "1" ]; then
exit 1 if ! command -v "$MICROSLOP_WINE" >/dev/null 2>&1; then
echo "wine is required to set the Flextalk profile" >&2
exit 1
fi
if ! "$MICROSLOP_WINE" reg import "$TMP/profile.reg" >/dev/null 2>&1; then
echo "could not write the Flextalk profile" >&2
exit 1
fi
cp -f "$TMP/profile.reg" "$PROFILE_CACHE" 2>/dev/null || true
fi fi
fi fi
# SAPI4 is ANSI/CP1252. VOX mode (Flextalk only) first transforms the text into # SAPI4 is ANSI/CP1252. VOX mode (Flextalk only) first transforms the text into
# vendor tags (\!wH1/\!wH0, \!br, \!sfNN) with setup/vox_parser.py; the parser # vendor tags (\!wH1/\!wH0, \!br, \!sfNN) with setup/vox_parser.py; the parser
# works on UTF-8, so it runs before the CP1252 transliteration. Word mode builds # works on UTF-8, so it runs before the CP1252 transliteration. Word mode builds
# its own cadence from single-word instances, so the parser is skipped there: the # its own cadence from single-word instances, so the parser is skipped there: VOX
# VOX tags cannot survive a word split. # tags cannot survive a word split.
TEXT_SRC="$TEXT_IN" TEXT_SRC="$TEXT_IN"
if [ "$VOX" = "1" ] && [ -n "$SPEAKER_GUID" ] && [ "$WORDS" != "1" ]; then if [ "$VOX" = "1" ] && [ -n "$SPEAKER_GUID" ] && [ "$WORDS" != "1" ]; then
if command -v "$MICROSLOP_PYTHON" >/dev/null 2>&1 && [ -f "$MICROSLOP_ROOT/setup/vox_parser.py" ]; then if command -v "$MICROSLOP_PYTHON" >/dev/null 2>&1 && [ -f "$MICROSLOP_ROOT/setup/vox_parser.py" ]; then
@@ -370,7 +421,7 @@ if [ "$WORDS" = "1" ] && [ -n "$SPEAKER_GUID" ]; then
INDEX=0 INDEX=0
for word in $(cat "$TXT"); do for word in $(cat "$TXT"); do
INDEX=$((INDEX + 1)) INDEX=$((INDEX + 1))
try_run_host "$TMP/w$INDEX.wav" "${TAG_PREFIX}${word}" try_run_host "$TMP/w$INDEX.wav" "$TAG_PREFIX$word"
echo "file '$TMP/w$INDEX.wav'" >> "$TMP/list.txt" echo "file '$TMP/w$INDEX.wav'" >> "$TMP/list.txt"
if [ "$GAP" -gt 0 ]; then if [ "$GAP" -gt 0 ]; then
@@ -388,7 +439,7 @@ if [ "$WORDS" = "1" ] && [ -n "$SPEAKER_GUID" ]; then
exit 1 exit 1
fi fi
else else
try_run_host "$RAW" "${TAG_PREFIX}$(cat "$TXT")" try_run_host "$RAW" "$TAG_PREFIX$(cat "$TXT")"
fi fi
[ -s "$RAW" ] || { echo "engine produced no audio" >&2; exit 1; } [ -s "$RAW" ] || { echo "engine produced no audio" >&2; exit 1; }
@@ -428,7 +479,31 @@ else
fi fi
TMPOUT="$TMP/out.wav" TMPOUT="$TMP/out.wav"
if ! "$MICROSLOP_FFMPEG" -hide_banner -nostats -y -i "$RAW" -af "$PRE,volume=${GAIN}dB" \ # Leading hum: a quiet low tone in the pre-speech padding, to prime Discord's
# audio pipeline so the first syllable is not gated. Level/frequency/duration
# are configurable; 0 ms disables it.
case "$HUM_MS" in *[!0-9]*|"") HUM_MS=80 ;; esac
[ "$HUM_MS" -gt 2000 ] && HUM_MS=2000
case "$HUM_HZ" in *[!0-9.]*|"") HUM_HZ=75 ;; esac
case "$HUM_DB" in *[!0-9.-]*|""|"."|"-") HUM_DB=-48 ;; esac
if [ "$HUM_MS" -gt 0 ]; then
HUM_S=$(awk -v ms="$HUM_MS" 'BEGIN{printf "%.3f", ms/1000}')
HUM_HZ=$(awk -v v="$HUM_HZ" 'BEGIN{ if (v<30) v=30; if (v>200) v=200; printf "%.1f", v }')
HUM_DB=$(awk -v v="$HUM_DB" 'BEGIN{ if (v>-6) v=-6; if (v<-80) v=-80; printf "%.1f", v }')
HUM_AMP=$(awk -v db="$HUM_DB" 'BEGIN{printf "%.6f", 10^(db/20)}')
HUM_FADE=$(awk -v s="$HUM_S" 'BEGIN{ f=s/4; if (f>0.02) f=0.02; if (f<0.005) f=0.005; printf "%.3f", f }')
HUM_FADE_OUT=$(awk -v s="$HUM_S" -v f="$HUM_FADE" 'BEGIN{printf "%.3f", s-f}')
# The hum is mixed on its own chain and deliberately bypasses $PRE (highpass,
# trim, fades): VESKSLOP_TTS_HIGHPASS must never remove it.
if ! "$MICROSLOP_FFMPEG" -hide_banner -nostats -y \
-f lavfi -i "aevalsrc=exprs='$HUM_AMP*sin(2*PI*$HUM_HZ*t)':s=48000:d=$HUM_S" \
-i "$RAW" \
-filter_complex "[0:a]afade=t=in:st=0:d=$HUM_FADE,afade=t=out:st=$HUM_FADE_OUT:d=$HUM_FADE,aformat=sample_fmts=s16:channel_layouts=mono:sample_rates=48000[h];[1:a]$PRE,volume=${GAIN}dB,aresample=48000,aformat=sample_fmts=s16:channel_layouts=mono[a];[h][a]concat=n=2:v=0:a=1[out]" \
-map "[out]" -c:a pcm_s16le "$TMPOUT" >/dev/null 2>"$TMP/ff"; then
head -c 400 "$TMP/ff" >&2
exit 1
fi
elif ! "$MICROSLOP_FFMPEG" -hide_banner -nostats -y -i "$RAW" -af "$PRE,volume=${GAIN}dB" \
-ar 48000 -ac 1 -c:a pcm_s16le "$TMPOUT" >/dev/null 2>"$TMP/ff"; then -ar 48000 -ac 1 -c:a pcm_s16le "$TMPOUT" >/dev/null 2>"$TMP/ff"; then
head -c 400 "$TMP/ff" >&2 head -c 400 "$TMP/ff" >&2
exit 1 exit 1
+39
View File
@@ -0,0 +1,39 @@
# third_party
Vendored dependencies. Everything the tool needs to run is kept here so the project
does not depend on external downloads that can disappear. Only toolchain packages
(Wine, Winelib, ffmpeg, python3, unshield, mingw) are installed by the system.
## speech.h
`speech.h` — Microsoft Speech API 4.0 SDK header. Used by `host/sapi4host.c`. Copied
from the public SAPI4 header published in the community gist referenced by the asset
repository (see `docs/NOTES.md`).
## sapi4/
The SAPI4 runtime and the MSTTS (Sam/Mary/Mike) voices, extracted from the original
Microsoft installers. Private archival copies; do not redistribute.
- `spchapi/SPEECH.DLL`, `spchapi/SPCHAPI.INF` — SAPI4 runtime and its registration INF.
- `msttsl/msttssyn.dll`, `msttsl/*.vce`, `msttsl/*.cfg`, `msttsl/mstts.inf` — MSTTS
engine, voice data and registration.
- `installers/spchapi.exe`, `installers/msttsl.exe` — original installers, kept for
completeness (the extracted files above are what `setup-prefix.sh` uses).
## flextalk/
- `data1.cab` — InstallShield cabinet with the AT&T Flextalk 2.1 engine and the
"Keith Bell" / "Kerry Watson" voices (the archive.org package).
`setup/install.sh` extracts it with `unshield -O` into `flextalk/extracted/`
(gitignored).
## nettts-reference/
- `vox_parser.cpp`, `vox_parser.hpp` — the VOX prosody encoder from
[h4rm0n1c/NetTTS](https://github.com/h4rm0n1c/NetTTS), kept as the reference for
validating `setup/vox_parser.py`. Upstream declares no license; these files are
reference-only and are not linked into anything we ship.
- `nettts_flextalk_vox_profile.reg` — NetTTS's approximated Valve VOX speaker profile
for Keith Bell (the source of the `vox`/`hev` presets in `setup/veskslop-tts.sh`).
Binary file not shown.
@@ -0,0 +1,127 @@
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\AT&T\Watson\2.0\FlexTalk\2.0]
"Default Speaker"="{11260610-C84A-11CE-AEC4-0000C0E9CB87}"
[HKEY_CURRENT_USER\Software\AT&T\Watson\2.0\FlexTalk\2.0\Speakers\{000031CB-3699-551F-AED0-6B4893382D57}]
"Abbreviation Expansion"=dword:00000001
"Address Class"=dword:00000001
"Age"=dword:0000001e
"Alphabetic Hyphen"=dword:00000000
"Case Significance"=dword:00000001
"Date Class"=dword:00000001
"Expression"=dword:00000064
"Fraction Class"=dword:00000001
"Gender"=dword:00000001
"Head Size"=dword:0000002d
"Line Mode"=dword:00000000
"Lowering"=dword:00000028
"Math Mode"=dword:00000000
"Measurements Class"=dword:00000001
"Mode Name"="Kerry Watson"
"Money Class"=dword:00000001
"Numerical Hyphen"=dword:00000001
"Ordinal Numbers Class"=dword:00000001
"Pitch"=dword:00000041
"Prominences"=dword:00000011
"ProofRead Mode"=dword:00000000
"Proper Names Class"=dword:00000001
"Speaker Name"="Kerry Watson"
"Speaking Rate"=dword:00000020
"Spell Mode"=dword:00000000
"Telephone Numbers Class"=dword:00000001
"Time Class"=dword:00000001
"Volume"=dword:00000064
[HKEY_CURRENT_USER\Software\AT&T\Watson\2.0\FlexTalk\2.0\Speakers\{11260610-C84A-11CE-AEC4-0000C0E9CB87}]
"Abbreviation Expansion"=dword:00000001
"Address Class"=dword:00000001
"Age"=dword:0000001e
"Alphabetic Hyphen"=dword:00000000
"Case Significance"=dword:00000001
"Date Class"=dword:00000001
"Expression"=dword:0000003b
"Fraction Class"=dword:00000001
"Gender"=dword:00000002
"Head Size"=dword:00000034
"Line Mode"=dword:00000001
"Lowering"=dword:00000028
"Math Mode"=dword:00000000
"Measurements Class"=dword:00000001
"Mode Name"="Keith Bell"
"Money Class"=dword:00000001
"Numerical Hyphen"=dword:00000000
"Ordinal Numbers Class"=dword:00000001
"Pitch"=dword:00000003
"Prominences"=dword:00000016
"ProofRead Mode"=dword:00000000
"Proper Names Class"=dword:00000001
"Speaker Name"="Keith Bell"
"Speaking Rate"=dword:00000011
"Spell Mode"=dword:00000000
"Telephone Numbers Class"=dword:00000001
"Time Class"=dword:00000001
"Volume"=dword:00000046
[HKEY_LOCAL_MACHINE\Software\AT&T\Watson\2.0\FlexTalk\2.0]
"Default Speaker"="{11260610-C84A-11CE-AEC4-0000C0E9CB87}"
[HKEY_LOCAL_MACHINE\Software\AT&T\Watson\2.0\FlexTalk\2.0\Speakers\{000031CB-3699-551F-AED0-6B4893382D57}]
"Abbreviation Expansion"=dword:00000001
"Address Class"=dword:00000001
"Age"=dword:0000001e
"Alphabetic Hyphen"=dword:00000000
"Case Significance"=dword:00000001
"Date Class"=dword:00000001
"Expression"=dword:00000064
"Fraction Class"=dword:00000001
"Gender"=dword:00000001
"Head Size"=dword:0000002d
"Line Mode"=dword:00000000
"Lowering"=dword:00000028
"Math Mode"=dword:00000000
"Measurements Class"=dword:00000001
"Mode Name"="Kerry Watson"
"Money Class"=dword:00000001
"Numerical Hyphen"=dword:00000001
"Ordinal Numbers Class"=dword:00000001
"Pitch"=dword:00000041
"Prominences"=dword:00000011
"ProofRead Mode"=dword:00000000
"Proper Names Class"=dword:00000001
"Speaker Name"="Kerry Watson"
"Speaking Rate"=dword:00000020
"Spell Mode"=dword:00000000
"Telephone Numbers Class"=dword:00000001
"Time Class"=dword:00000001
"Volume"=dword:00000064
[HKEY_LOCAL_MACHINE\Software\AT&T\Watson\2.0\FlexTalk\2.0\Speakers\{11260610-C84A-11CE-AEC4-0000C0E9CB87}]
"Abbreviation Expansion"=dword:00000001
"Address Class"=dword:00000001
"Age"=dword:0000001e
"Alphabetic Hyphen"=dword:00000000
"Case Significance"=dword:00000001
"Date Class"=dword:00000001
"Expression"=dword:0000003b
"Fraction Class"=dword:00000001
"Gender"=dword:00000002
"Head Size"=dword:00000034
"Line Mode"=dword:00000001
"Lowering"=dword:00000028
"Math Mode"=dword:00000000
"Measurements Class"=dword:00000001
"Mode Name"="Keith Bell"
"Money Class"=dword:00000001
"Numerical Hyphen"=dword:00000000
"Ordinal Numbers Class"=dword:00000001
"Pitch"=dword:00000003
"Prominences"=dword:00000016
"ProofRead Mode"=dword:00000000
"Proper Names Class"=dword:00000001
"Speaker Name"="Keith Bell"
"Speaking Rate"=dword:00000011
"Spell Mode"=dword:00000000
"Telephone Numbers Class"=dword:00000001
"Time Class"=dword:00000001
"Volume"=dword:00000046
+744
View File
@@ -0,0 +1,744 @@
#include "vox_parser.hpp"
#include <vector>
#include <regex>
#include <cwctype>
#include <sstream>
#include <algorithm>
static inline std::wstring trim(const std::wstring& s){
size_t a=0,b=s.size();
while(a<b && iswspace(s[a])) ++a;
while(b>a && iswspace(s[b-1])) --b;
return s.substr(a,b-a);
}
static inline std::wstring to_lower(std::wstring s){
for(auto& c: s) c=(wchar_t)towlower(c);
return s;
}
static inline bool is_all_digits(const std::wstring& t){
if(t.empty()) return false;
for(wchar_t c: t) if(!iswdigit(c)) return false;
return true;
}
static inline bool is_titlecase_word(const std::wstring& t){
if(t.empty()) return false;
if(!iswalpha(t[0]) || !iswupper(t[0])) return false;
return true;
}
static inline std::wstring strip_trailing_punct(std::wstring t){
while(!t.empty()){
wchar_t c = t.back();
if(c==L','||c==L'.'||c==L';'||c==L':'||c==L'!'||c==L'?'||c==L'"'||c==L'\'') t.pop_back();
else break;
}
return t;
}
static inline bool ends_with_br(const std::wstring& s){
size_t n = s.size();
return n >= 5 && s.compare(n-5, 5, L" \\!br") == 0;
}
// Sentence splitter (keeps terminator punctuation attached)
static std::vector<std::wstring> split_sentences(const std::wstring& in){
std::vector<std::wstring> out;
std::wstring cur;
for(size_t i=0;i<in.size();++i){
wchar_t c = in[i];
cur.push_back(c);
if(c==L'.' || c==L'!' || c==L'?'){
size_t j=i+1;
while(j<in.size() && (in[j]==L'"' || in[j]==L'\'')) { cur.push_back(in[j]); ++j; }
out.push_back(trim(cur));
cur.clear();
i = j-1;
}
}
std::wstring tail = trim(cur);
if(!tail.empty()) out.push_back(tail);
return out;
}
// Lead-in break after short opening phrases
static void apply_leadin_break(std::wstring& s){
static const std::wregex r(LR"(^\s*((?:Now|Please|A\s+reminder|On\s+behalf\s+of|Good\s+(?:morning|evening)|This\s+(?:automated\s+train|tram)))\b)",
std::regex_constants::icase);
std::wsmatch m;
if(std::regex_search(s, m, r)){
std::wstring head = trim(m.str(0));
std::wstring rest = trim(s.substr(m.length()));
s = head + L" \\!br " + rest;
}
}
// “the” -> “thee”
// - Backward rule: after preps (to/for/of/in/on/at) or "on behalf of"
// - NEW Forward rule: before TitleCase, single letter (X or X:), or a number
// Robust across \!br tags; preserves trailing punctuation.
static void apply_thee_rule(std::wstring& s){
// tokenize by whitespace; keep tags as tokens
std::wstringstream ss(s);
std::vector<std::wstring> tok; std::wstring t;
while (ss >> t) tok.push_back(t);
if (tok.empty()) return;
auto is_tag = [](const std::wstring& w){
return (w==L"\\!br" || w==L"\\!wH1" || w==L"\\!wH0");
};
auto to_lower_copy = [](std::wstring v){ for (auto& c: v) c=(wchar_t)towlower(c); return v; };
// split trailing punctuation; return (core, punctTail)
auto split_tail = [](const std::wstring& x)->std::pair<std::wstring,std::wstring>{
std::wstring core=x, tail;
while (!core.empty()){
wchar_t c = core.back();
if (c==L','||c==L'.'||c==L';'||c==L':'||c==L'!'||c==L'?'||c==L'"'||c==L'\''){
tail.insert(tail.begin(), c);
core.pop_back();
} else break;
}
return {core, tail};
};
auto clean_lower = [&](const std::wstring& x)->std::wstring{
auto p = split_tail(x);
return to_lower_copy(p.first);
};
auto bare = [&](const std::wstring& x)->std::wstring{
return split_tail(x).first;
};
auto prev_word = [&](int i, int nth)->std::wstring{
for (int k=i-1; k>=0; --k){
if (is_tag(tok[k])) continue;
if (--nth==0) return clean_lower(tok[k]);
}
return L"";
};
auto next_word = [&](int i, int nth)->std::wstring{
for (int k=i+1; k<(int)tok.size(); ++k){
if (is_tag(tok[k])) continue;
if (--nth==0) return tok[k]; // not lowered; we want case info
}
return L"";
};
auto is_prep = [&](const std::wstring& w)->bool{
std::wstring tl = to_lower_copy(w);
return (tl==L"to"||tl==L"for"||tl==L"of"||tl==L"in"||tl==L"on"||tl==L"at");
};
auto is_title = [&](const std::wstring& w)->bool{
auto b = bare(w);
return !b.empty() && iswalpha(b[0]) && iswupper(b[0]);
};
auto is_single_letter = [&](const std::wstring& w)->bool{
auto b = bare(w);
if (b.size()==1 && iswalpha(b[0]) && iswupper(b[0])) return true;
if (b.size()==2 && iswalpha(b[0]) && iswupper(b[0]) && b[1]==L':') return true;
return false;
};
auto is_number = [&](const std::wstring& w)->bool{
auto b = bare(w);
if (b.empty()) return false;
for (wchar_t c: b) if (!iswdigit(c)) return false;
return true;
};
for (int i=0; i<(int)tok.size(); ++i){
if (is_tag(tok[i])) continue;
auto [core, tail] = split_tail(tok[i]);
std::wstring cl = to_lower_copy(core);
if (cl != L"the") { tok[i] = core + tail; continue; }
bool make_thee = false;
// Backward (prepositions, incl. "on behalf of")
std::wstring p1 = prev_word(i, 1);
if (!p1.empty()){
if (is_prep(p1)) make_thee = true;
else if (to_lower_copy(p1) == L"of"){
std::wstring p2 = prev_word(i, 2);
std::wstring p3 = prev_word(i, 3);
if (to_lower_copy(p2)==L"behalf" && to_lower_copy(p3)==L"on") make_thee = true;
}
}
// Forward (before proper names / letters / numbers)
if (!make_thee){
std::wstring n1 = next_word(i, 1);
if (!n1.empty()){
if (is_title(n1) || is_single_letter(n1) || is_number(n1)){
make_thee = true;
}
}
}
tok[i] = (make_thee ? L"thee" : core) + tail;
}
// rebuild
std::wstring out;
for (size_t i=0;i<tok.size();++i){
if (!out.empty()) out.push_back(L' ');
out += tok[i];
}
s.swap(out);
}
// Times, degrees, and 3-digit decomposition
static void apply_time_numbers_degrees(std::wstring& s){
// 12h time like 8:47 AM / A.M. / PM … (eat any trailing dot after meridiem)
{
std::wregex t12(LR"(\b(\d{1,2})[:.](\d{2})\s*((?:A\.?M\.?)|(?:P\.?M\.?))(?:\.)?\b)", std::regex_constants::icase);
std::wstring out; out.reserve(s.size()+32);
std::wsregex_iterator it(s.begin(), s.end(), t12), end;
size_t last = 0;
for(; it!=end; ++it){
auto m = *it;
out.append(s, last, m.position()-last);
std::wstring hh = m.str(1);
std::wstring mm = m.str(2);
std::wstring ap = to_lower(m.str(3));
std::wstring ap1 = (ap[0]==L'p') ? L"P:" : L"Ay:";
out += hh + L" \\!br " + mm + L" \\!br " + ap1 + L" \\!br M:";
last = m.position() + m.length();
}
out.append(s, last, std::wstring::npos);
s.swap(out);
}
// “The time is 8 …” -> break before the hour
s = std::regex_replace(s,
std::wregex(LR"((\b[Tt]he\s+time\s+is)\s+(\d+))"),
L"$1 \\!br $2");
// 24h “HH00 hours” -> “HH \!br hundred \!br hours”
s = std::regex_replace(s,
std::wregex(LR"(\b(\d{2})00\s+hours\b)", std::regex_constants::icase),
L"$1 \\!br hundred \\!br hours");
// Three-digit non-round numbers: 105 -> “100 \!br and \!br 5” (strip leading zero in remainder)
{
std::wregex n3(LR"(\b([1-9])(\d)(\d)\b)");
std::wstring out; out.reserve(s.size()+32);
std::wsregex_iterator it(s.begin(), s.end(), n3), end;
size_t last = 0;
for(; it!=end; ++it){
auto m = *it;
std::wstring yz = m.str(2)+m.str(3);
if (yz == L"00") continue; // round, leave as-is
size_t nz = 0; while (nz < yz.size() && yz[nz]==L'0') ++nz;
std::wstring rem = yz.substr(nz);
out.append(s, last, m.position()-last);
out += m.str(1)+L"00 \\!br and \\!br " + (rem.empty()? yz : rem);
last = m.position() + m.length();
}
out.append(s, last, std::wstring::npos);
s.swap(out);
}
// Degrees: “93 degrees” -> “93 \!br degrees \!br”
s = std::regex_replace(s,
std::wregex(LR"(\b(\d+)\s+degrees\b)", std::regex_constants::icase),
L"$1 \\!br degrees \\!br");
// Fix any lingering "M:." -> "M:" (meridiem shouldn’t carry a period)
s = std::regex_replace(s, std::wregex(LR"(M:\s*\.)"), L"M:");
}
// Syllable heuristic
static int syllables(const std::wstring& w){
if(w.empty()) return 0;
std::wstring s; s.reserve(w.size());
for(wchar_t c: w) s.push_back((wchar_t)towlower(c));
auto isv=[&](wchar_t c){ return c==L'a'||c==L'e'||c==L'i'||c==L'o'||c==L'u'||c==L'y'; };
int count=0; bool in=false;
for(wchar_t c: s){ if(isv(c)){ if(!in){ ++count; in=true; } } else in=false; }
if(count>1 && s.size()>1 && s.back()==L'e' && !(s.size()>2 && s[s.size()-2]==L'l')) --count; // silent 'e' (not "...le")
if(s.size()>2 && s.back()==L'e' && s[s.size()-2]==L'l') ++count; // “…le”
return std::max(1,count);
}
enum Wt { LIGHT, MEDIUM, HEAVY };
static bool is_stop(const std::wstring& tl){
static const wchar_t* sw[] = {
L"the",L"thee",L"a",L"an",L"to",L"for",L"of",L"in",L"on",L"at",L"by",L"with",L"from",
L"as",L"is",L"are",L"was",L"were",L"this",L"that"
};
for(auto* w: sw) if(tl==w) return true;
return false;
}
static bool is_lightverb(const std::wstring& tl){
static const wchar_t* vw[] = {
L"welcome",L"wait",L"stand",L"provide",L"provided",L"return",L"remain",L"maintain",
L"maintained",L"verify",L"contact",L"board",L"arriving",L"inbound",L"bound",
L"commence",L"commences"
};
for(auto* w: vw) if(tl==w) return true;
return false;
}
static bool is_unit(const std::wstring& tl){
static const wchar_t* uw[] = { L"degrees", L"hours", L"percent", L"%" };
for(auto* w: uw) if(tl==w) return true;
return false;
}
static Wt weight(const std::wstring& tok){
if(tok.empty()) return LIGHT;
std::wstring pfree = strip_trailing_punct(tok);
std::wstring tl = to_lower(pfree);
if(is_stop(tl) || is_lightverb(tl)) return LIGHT;
if(is_all_digits(pfree)) return HEAVY;
if(pfree.find(L'-')!=std::wstring::npos) return HEAVY;
if(is_titlecase_word(pfree)) return HEAVY;
if(is_unit(tl)) return HEAVY;
int syl = syllables(pfree);
if(syl>=3 || pfree.size()>=8) return HEAVY; // long or many-syllable content words
return MEDIUM;
}
static bool is_and(const std::wstring& t){ return to_lower(strip_trailing_punct(t))==L"and"; }
static bool starts_with_punct(const std::wstring& t){
if(t.empty()) return false;
wchar_t c = t.front();
return (c==L'.'||c==L','||c==L';'||c==L':'||c==L'!'||c==L'?'||c==L')');
}
static bool is_open_punct(const std::wstring& t){
if(t.empty()) return false;
wchar_t c=t.front(); return (c==L'('||c==L'"'||c==L'\'');
}
// Tokenize on whitespace (keep punctuation with token)
static std::vector<std::wstring> tokenize_ws(const std::wstring& s){
std::wstringstream ss(s);
std::vector<std::wstring> v; std::wstring t;
while(ss >> t) v.push_back(t);
return v;
}
// Insert TitleCase run breaks and Area/Level/Sector blocks
static void emit_titlecase_run(const std::vector<std::wstring>& v, size_t i, size_t j, std::wstring& out){
// place a break before the run
if(!out.empty() && !ends_with_br(out)) out += L" \\!br";
for(size_t k=i;k<j;++k){
out += L" " + v[k] + L" \\!br";
}
}
// Core beat builder (single pass), generic prosody.
// Keeps: TitleCase runs, Area/Level/Sector, "and" join, soft head span,
// comma/semicolon boundary, symmetric linker isolation [BR] linker [BR],
// heavy-gate, 3-beat limiter.
// NEW: Split hyphenated/en-dash/em-dash compounds into parts with breaks.
// Standalone -, –, — act as hard breaks (not spoken).
static std::wstring build_beats(const std::wstring& sentence){
auto v = tokenize_ws(sentence);
if(v.empty()) return sentence;
std::wstring out;
bool since_break_all_light = true;
Wt prev_w = LIGHT;
int content_run = 0; // consecutive MEDIUM/HEAVY since last break
auto reset_after_break = [&](){
since_break_all_light = true;
content_run = 0;
prev_w = LIGHT;
};
auto bare = [](const std::wstring& w){ return strip_trailing_punct(w); };
auto is_area_head = [&](const std::wstring& w){ return w==L"Area"||w==L"Level"||w==L"Sector"; };
auto is_tag = [&](const std::wstring& w){ return (w==L"\\!br" || w==L"\\!wH1" || w==L"\\!wH0"); };
auto lower = [&](std::wstring s){ return to_lower(std::move(s)); };
auto is_single_letter = [&](const std::wstring& w)->bool{
std::wstring b = bare(w);
if (b.size()==1 && iswalpha(b[0]) && iswupper(b[0])) return true; // C
if (b.size()==2 && iswalpha(b[0]) && iswupper(b[0]) && b[1]==L':') return true; // C:
return false;
};
// split trailing punctuation; return (core, punctTail)
auto split_tail = [](const std::wstring& x)->std::pair<std::wstring,std::wstring>{
std::wstring core=x, tail;
while (!core.empty()){
wchar_t c = core.back();
if (c==L','||c==L'.'||c==L';'||c==L':'||c==L'!'||c==L'?'||c==L'"'||c==L'\''){
tail.insert(tail.begin(), c);
core.pop_back();
} else break;
}
return {core, tail};
};
// emit hyphen/dash-split parts with breaks between them; keep tail on last part
auto emit_dash_split = [&](const std::wstring& tok)->bool{
auto [core, tail] = split_tail(tok);
// find internal separators
std::vector<size_t> cuts;
for(size_t p=0;p<core.size();++p){
wchar_t c = core[p];
if (c==L'-' || c==0x2013 /*–*/ || c==0x2014 /*—*/){
// only split if letters on both sides (avoid leading/trailing)
if (p>0 && p+1<core.size() && iswalpha(core[p-1]) && iswalpha(core[p+1]))
cuts.push_back(p);
else
return false; // treat as punctuation case elsewhere
}
}
if (cuts.empty()) return false;
size_t start = 0;
for(size_t idx=0; idx<=cuts.size(); ++idx){
size_t end = (idx<cuts.size() ? cuts[idx] : core.size());
std::wstring part = core.substr(start, end-start);
// spacing before part
if(!out.empty() && !ends_with_br(out) && !starts_with_punct(part) && !is_open_punct(part))
out.push_back(L' ');
// last part gets the tail
if (idx == cuts.size()) part += tail;
out += part;
// break after each part
if(!ends_with_br(out)) out += L" \\!br";
reset_after_break();
start = end + (idx<cuts.size() ? 1 : 0);
}
return true;
};
for(size_t i=0;i<v.size();){
// ---- Proper-noun blocks ----
if (is_area_head(v[i])){
size_t j=i+1;
while(j<v.size()){
std::wstring wj = bare(v[j]);
if(is_all_digits(wj) || is_titlecase_word(wj)) ++j;
else break;
}
if(j>i+1){
emit_titlecase_run(v,i,j,out);
i=j;
reset_after_break();
continue;
}
}
if (is_titlecase_word(bare(v[i]))){
size_t j=i;
while(j<v.size() && is_titlecase_word(bare(v[j]))) ++j;
if(j>=i+2){
emit_titlecase_run(v,i,j,out);
i=j;
reset_after_break();
continue;
}
}
// ---- "and" between heavier items ----
if(is_and(v[i]) && i>0 && i+1<v.size()){
Wt lw = weight(v[i-1]);
Wt rw = weight(v[i+1]);
if(lw>=MEDIUM && rw>=MEDIUM){
if(!ends_with_br(out)) out += L" \\!br";
out += L" and \\!br";
++i;
reset_after_break();
continue;
}
}
// ---- Standalone dash ( -, –, — ) => hard boundary ----
if (v[i]==L"-" || v[i]==L"\u2013" || v[i]==L"\u2014"){
if(!ends_with_br(out)) out += L" \\!br";
reset_after_break();
++i;
continue;
}
// ---- Symmetric linker isolation: [BR] linker [BR] ----
{
std::wstring tok = v[i];
std::wstring tl = lower(bare(tok));
bool in_head_span = (i < 2);
if (!in_head_span && (tl==L"at" || tl==L"in" || tl==L"on" || tl==L"to"
|| tl==L"of" || tl==L"for"|| tl==L"from"|| tl==L"by")){
if(!ends_with_br(out)) out += L" \\!br"; // BEFORE linker
reset_after_break();
if(!out.empty() && !starts_with_punct(tok) && !is_open_punct(tok)) out.push_back(L' ');
out += tok;
if(!ends_with_br(out)) out += L" \\!br"; // AFTER linker
reset_after_break();
++i;
continue;
}
}
// ---- Pre-copula break: put a beat BEFORE "is" when followed by determiner/contenty ----
{
std::wstring tl_is = to_lower(bare(v[i]));
bool in_head_span = (i < 2);
auto is_tag_local = [&](const std::wstring& w){ return (w==L"\\!br" || w==L"\\!wH1" || w==L"\\!wH0"); };
auto is_single_letter = [&](const std::wstring& w)->bool{
std::wstring b = strip_trailing_punct(w);
if (b.size()==1 && iswalpha(b[0]) && iswupper(b[0])) return true; // C
if (b.size()==2 && iswalpha(b[0]) && iswupper(b[0]) && b[1]==L':') return true; // C:
return false;
};
auto is_determiner = [&](const std::wstring& w)->bool{
std::wstring b = to_lower(strip_trailing_punct(w));
return (b==L"the"||b==L"thee"||b==L"a"||b==L"an"||
b==L"this"||b==L"that"||b==L"these"||b==L"those"||
b==L"some"||b==L"any"||b==L"each"||b==L"every"||b==L"no");
};
if (!in_head_span && tl_is == L"is") {
// peek next non-tag token
size_t k = i + 1;
while (k < v.size() && is_tag_local(v[k])) ++k;
bool trigger = false;
if (k < v.size()) {
const std::wstring& n1 = v[k];
if (is_determiner(n1) ||
is_titlecase_word(strip_trailing_punct(n1)) ||
is_all_digits(strip_trailing_punct(n1)) ||
is_single_letter(n1) ||
weight(n1) == HEAVY)
{
trigger = true;
}
}
if (trigger && !ends_with_br(out)) {
out += L" \\!br";
// reset run state like a real boundary
since_break_all_light = true;
content_run = 0;
prev_w = LIGHT;
}
}
}
// ---- Hyphenated / en-dash / em-dash compounds inside token ----
if (emit_dash_split(v[i])) { ++i; continue; }
// ---- Generic token logic ----
std::wstring tok = v[i];
Wt w_eff = weight(tok); // effective weight; may be softened at sentence start
// Soft-start: first two tokens—avoid pre-breaks unless necessary.
bool in_head_span = (i < 2);
if (i==0 && is_titlecase_word(bare(tok))) {
bool next_is_title = (i+1 < v.size()) && is_titlecase_word(bare(v[i+1]));
if (!next_is_title && w_eff == HEAVY) w_eff = MEDIUM; // e.g., "Good evening"
}
// ---- HEAVY-GATE ----
if (w_eff==HEAVY && content_run >= 1){
int k = static_cast<int>(i) - 1;
while (k >= 0 && is_tag(v[k])) --k;
bool exempt = false;
if (k >= 0){
std::wstring prev = v[k];
if (is_titlecase_word(bare(prev)) || is_all_digits(bare(prev)) || is_single_letter(prev)) {
exempt = true;
}
}
if (!exempt){
if(!ends_with_br(out)) out += L" \\!br";
reset_after_break();
}
}
// 3-beat limiter
if (w_eff==HEAVY && content_run >= 2){
if(!ends_with_br(out)) out += L" \\!br";
reset_after_break();
}
// Heavy after only LIGHT (but not inside head span)
if (w_eff==HEAVY && since_break_all_light && !in_head_span){
if(!out.empty() && !ends_with_br(out)) out += L" \\!br";
reset_after_break();
}
// Heavy-Heavy adjacency (outside TitleCase run)
if (i>0 && prev_w==HEAVY && w_eff==HEAVY && !in_head_span){
if(!ends_with_br(out)) out += L" \\!br";
reset_after_break();
}
// Append token with spacing
if(!out.empty() && !starts_with_punct(tok) && !is_open_punct(tok)) out.push_back(L' ');
out += tok;
// Punctuation boundary: break after ',' or ';'
if (!tok.empty()){
wchar_t last = tok.back();
if ((last==L',' || last==L';') && !ends_with_br(out)){
out += L" \\!br";
reset_after_break();
++i;
continue;
}
}
// Update run stats
if (w_eff==LIGHT){
// remain in light span
}else{
++content_run; // MEDIUM or HEAVY
since_break_all_light = false;
}
prev_w = w_eff;
++i;
}
return trim(out);
}
// Tidy spaces and tags
static std::wstring tidy(const std::wstring& s){
std::wstring t = std::regex_replace(s, std::wregex(LR"(\s+)"), L" "); // collapse spaces
t = std::regex_replace(t, std::wregex(LR"(\s*\\!br\s*)"), L" \\!br "); // normalize tag spacing
t = std::regex_replace(t, std::wregex(LR"((\s*\\!br\s*){2,})"), L" \\!br "); // collapse multiple breaks
t = std::regex_replace(t, std::wregex(LR"(\s+([.,!?;:]))"), L"$1"); // no space before punctuation
// trimyou
size_t a=0,b=t.size();
while(a<b && iswspace(t[a])) ++a;
while(b>a && iswspace(t[b-1])) --b;
return t.substr(a,b-a);
}
// Convert standalone letters into stable "letter tokens" for FlexTalk.
// - "A:" / "a:" / bare "A"/"a" near a boundary -> "Ay:"
// - any single UPPERCASE letter near a boundary -> "X:" (exactly one colon)
// Boundaries are start/end or a \!br tag on either side. We preserve trailing punctuation.
static void normalize_letter_tokens(std::wstring& s){
// split by whitespace; keep tags as tokens
std::wstringstream ss(s);
std::vector<std::wstring> tok; std::wstring t;
while (ss >> t) tok.push_back(t);
if (tok.empty()) return;
auto is_tag = [](const std::wstring& w){
return (w==L"\\!br" || w==L"\\!wH1" || w==L"\\!wH0");
};
// strip trailing punctuation, but lift out a single trailing ':' as a flag
auto split_tail = [](const std::wstring& x)->std::tuple<std::wstring,bool,std::wstring>{
std::wstring core = x, punct;
bool had_colon = false;
// peel general punctuation, but remember a single trailing ':'
while(!core.empty()){
wchar_t c = core.back();
if(c==L':' && !had_colon){ had_colon = true; core.pop_back(); continue; }
if(c==L','||c==L'.'||c==L';'||c==L'!'||c==L'?'||c==L'"'||c==L'\''){
punct.insert(punct.begin(), c);
core.pop_back();
continue;
}
break;
}
return {core, had_colon, punct};
};
auto is_boundary = [&](int idx)->bool{
return (idx < 0 || idx >= (int)tok.size() || is_tag(tok[idx]));
};
for (int i=0;i<(int)tok.size();++i){
if (is_tag(tok[i])) continue;
auto [coreOrig, had_colon, tail] = split_tail(tok[i]);
std::wstring core = coreOrig;
const bool near_left = is_boundary(i-1);
const bool near_right = is_boundary(i+1);
const bool near_bound = (near_left || near_right);
// Normalize A / a cases to "Ay:" when isolated or already written as A:
if ((core==L"A" || core==L"a") && (near_bound || had_colon)){
core = L"Ay";
had_colon = true; // ensure exactly one colon added below
}
// Any other single UPPERCASE letter becomes a letter token near a boundary
else if (core.size()==1 && iswalpha(core[0]) && iswupper(core[0]) && near_bound){
// ensure exactly one colon
// (if there was already one as trailing punct, we won't add another)
// special "A" handled above
had_colon = true;
}
// Reassemble: add colon iff had_colon is true, then the rest of punctuation
std::wstring rebuilt = core;
if (had_colon) rebuilt.push_back(L':');
rebuilt += tail;
tok[i] = rebuilt;
}
// Rebuild s (tidy() will normalize spaces/tags later)
std::wstring out;
for (size_t i=0;i<tok.size();++i){
if (!out.empty()) out.push_back(L' ');
out += tok[i];
}
s.swap(out);
}
std::wstring vox_process(const std::wstring& in, bool wrap_vox_tags){
auto sents = split_sentences(in);
std::wstring out;
for (auto sent : sents){
if (sent.empty()) continue;
// ORDER: make "thee" first, then lead-in, then time/nums
apply_thee_rule(sent);
apply_leadin_break(sent);
apply_time_numbers_degrees(sent);
// beats + letter normalization
std::wstring with_beats = build_beats(sent);
normalize_letter_tokens(with_beats);
with_beats = tidy(with_beats);
// sentence-end cadence: add ~300ms pause, then a boundary
if (!with_beats.empty() && with_beats.back()!=L' ') with_beats.push_back(L' ');
with_beats += L"\\!sf500 \\!br";
if (!out.empty()) out.push_back(L' ');
out += with_beats;
}
out = trim(out);
// collapse accidental double breaks from joins, normalize commas before breaks, etc.
out = std::regex_replace(out, std::wregex(LR"((\s*\\!br\s*){2,})"), L" \\!br ");
out = std::regex_replace(out, std::wregex(LR"(\\!br\s*([,;:]))"), L"$1 \\!br");
if (!out.empty()) {
if (wrap_vox_tags) {
out = L"\\!wH1 " + out + L" \\!wH0 ";
} else {
out = out + L" ";
}
}
return out;
}
@@ -0,0 +1,8 @@
#pragma once
#include <string>
// Transform plain text into FlexTalk VOX style with vendor tags.
// - Wraps with \!wH1 ... \!wH0 (trailing space after \!wH0 for safety)
// - Inserts \!br at sentence ends & cadence points
// - Uses a generic prosody engine (no word-specific hacks)
std::wstring vox_process(const std::wstring& in, bool wrap_vox_tags);
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+185
View File
@@ -0,0 +1,185 @@
[Version]
Signature="$Chicago$"
AdvancedINF=2.5,"You need a new version of advpack.dll"
[SourceDisksNames]
1=%AppName%,,1
[DefaultInstall]
CustomDestination=MyCustomDestination
Copyfiles=LexTools,TTSFiles,InfSection
AddReg=TTSReg
DelFiles=DelOldTTSFiles
[DefaultInstall.NT]
CustomDestination=MyCustomDestination
Copyfiles=LexTools,TTSFiles,InfSection
AddReg=TTSReg
DelFiles=DelOldTTSFiles
[MyCustomDestination]
49010=ProgramFilesDestination,21
49000,49001,49002,49003=PackageDestination49000,5
[UninstallDestination]
49010=ProgramFilesDestination,5
49000=PackageDestination49000,5
[ProgramFilesDestination]
HKLM,software\microsoft\windows\currentversion,CommonFilesDir,"%InstallPrompt%","c:\program files\common files"
[PackageDestination49000]
HKLM,Software\Microsoft\MSTTS,InstallDir,"%InstallPrompt%","%49010%\%DefaultDir%"
[Uninstall]
BeginPrompt=BeginPromptSection
EndPrompt=EndPromptSection
RunPreSetupCommands=UninstallUserDict
CustomDestination=UninstallDestination
DelFiles=LexTools,TTSFiles,TTSFiles2
Deldirs=RemoveFolder
DelReg=DelRegSection
SmartReboot=I
Cleanup=1
[Uninstall.Quiet]
RunPreSetupCommands=UninstallUserDict
CustomDestination=UninstallDestination
DelFiles=LexTools,TTSFiles,TTSFiles2
Deldirs=RemoveFolder
DelReg=DelRegSection
SmartReboot=I
Cleanup=1
[UninstallUserDict]
%25%\delttsul.exe
[DestinationDirs]
TTSFiles=49000
TTSFiles2=49000
InfSection=17
DelOldTTSFiles=49000
LexTools=25
[LexTools]
delttsul.exe
[TTSFiles]
msttssyn.dll
female.vce
male.vce
sam.vce
female8.vce
male8.vce
female.cfg
male.cfg
sam.cfg
female8.cfg
male8.cfg
wraptts.dll
wttsf22.dll
wttsm22.dll
wttss22.dll
wttsa22.dll
wttsmm.dll
[TTSFiles2]
freddy.vce
brutus.vce
malew.vce
femalew.vce
[DelOldTTSFiles]
mark.vce
melanie.vce
mark8.vce
melanie8.vce
[InfSection]
msTTS.inf
[RemoveFolder]
%49000%
[TTSReg]
HKLM,Software\Voice\TextToSpeech\Engine,MSTTSSyn,,{E0725551-286F-11d0-8E73-00A0C9083363}
HKCR,CLSID\{E0725551-286F-11d0-8E73-00A0C9083363},,,"Microsoft TTS Engine"
HKCR,CLSID\{E0725551-286F-11d0-8E73-00A0C9083363}\InprocServer32,,,"%49000%\MSTTSSYN.dll"
HKCR,CLSID\{E0725551-286F-11d0-8E73-00A0C9083363}\InprocServer32,ThreadingModel,,Apartment
; use the following reg edit to see which version installed for ActiveX downloads
HKCR,CLSID\{161FA782-A52C-11d0-8D7C-00A0C9034A7E},,,"Downloadable Whistler 3.0"
HKCR,CLSID\{161FA782-A52C-11d0-8D7C-00A0C9034A7E}\Control,,,
HKCR,CLSID\{161FA782-A52C-11d0-8D7C-00A0C9034A7E}\InprocServer32,,,"%49000%\wraptts.dll"
HKCR,CLSID\{161FA782-A52C-11d0-8D7C-00A0C9034A7E}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{161FA782-A52C-11d0-8D7C-00A0C9034A7E}\MiscStatus,,,"0"
HKCR,CLSID\{161FA782-A52C-11d0-8D7C-00A0C9034A7E}\MiscStatus\1,,,"0132497"
HKCR,CLSID\{FD913800-5CA2-11d2-A1E6-00A0C913D1EF},,,"Downloadable Whistler 4.0"
HKCR,CLSID\{FD913800-5CA2-11d2-A1E6-00A0C913D1EF}\Control,,,
HKCR,CLSID\{FD913800-5CA2-11d2-A1E6-00A0C913D1EF}\InprocServer32,,,"%49000%\wttsf22.dll"
HKCR,CLSID\{FD913800-5CA2-11d2-A1E6-00A0C913D1EF}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{FD913800-5CA2-11d2-A1E6-00A0C913D1EF}\MiscStatus,,,"0"
HKCR,CLSID\{FD913800-5CA2-11d2-A1E6-00A0C913D1EF}\MiscStatus\1,,,"0132497"
HKCR,CLSID\{FD913801-5CA2-11d2-A1E6-00A0C913D1EF},,,"Downloadable Whistler 4.0"
HKCR,CLSID\{FD913801-5CA2-11d2-A1E6-00A0C913D1EF}\Control,,,
HKCR,CLSID\{FD913801-5CA2-11d2-A1E6-00A0C913D1EF}\InprocServer32,,,"%49000%\wttsm22.dll"
HKCR,CLSID\{FD913801-5CA2-11d2-A1E6-00A0C913D1EF}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{FD913801-5CA2-11d2-A1E6-00A0C913D1EF}\MiscStatus,,,"0"
HKCR,CLSID\{FD913801-5CA2-11d2-A1E6-00A0C913D1EF}\MiscStatus\1,,,"0132497"
HKCR,CLSID\{FD913802-5CA2-11d2-A1E6-00A0C913D1EF},,,"Downloadable Whistler 4.0"
HKCR,CLSID\{FD913802-5CA2-11d2-A1E6-00A0C913D1EF}\Control,,,
HKCR,CLSID\{FD913802-5CA2-11d2-A1E6-00A0C913D1EF}\InprocServer32,,,"%49000%\wttss22.dll"
HKCR,CLSID\{FD913802-5CA2-11d2-A1E6-00A0C913D1EF}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{FD913802-5CA2-11d2-A1E6-00A0C913D1EF}\MiscStatus,,,"0"
HKCR,CLSID\{FD913802-5CA2-11d2-A1E6-00A0C913D1EF}\MiscStatus\1,,,"0132497"
HKCR,CLSID\{FD913803-5CA2-11d2-A1E6-00A0C913D1EF},,,"Downloadable Whistler 4.0"
HKCR,CLSID\{FD913803-5CA2-11d2-A1E6-00A0C913D1EF}\Control,,,
HKCR,CLSID\{FD913803-5CA2-11d2-A1E6-00A0C913D1EF}\InprocServer32,,,"%49000%\wttsa22.dll"
HKCR,CLSID\{FD913803-5CA2-11d2-A1E6-00A0C913D1EF}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{FD913803-5CA2-11d2-A1E6-00A0C913D1EF}\MiscStatus,,,"0"
HKCR,CLSID\{FD913803-5CA2-11d2-A1E6-00A0C913D1EF}\MiscStatus\1,,,"0132497"
HKCR,CLSID\{FD913804-5CA2-11d2-A1E6-00A0C913D1EF},,,"Downloadable Whistler 4.0"
HKCR,CLSID\{FD913804-5CA2-11d2-A1E6-00A0C913D1EF}\Control,,,
HKCR,CLSID\{FD913804-5CA2-11d2-A1E6-00A0C913D1EF}\InprocServer32,,,"%49000%\wttsmm.dll"
HKCR,CLSID\{FD913804-5CA2-11d2-A1E6-00A0C913D1EF}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{FD913804-5CA2-11d2-A1E6-00A0C913D1EF}\MiscStatus,,,"0"
HKCR,CLSID\{FD913804-5CA2-11d2-A1E6-00A0C913D1EF}\MiscStatus\1,,,"0132497"
; cache information, so enumerates faster
HKLM,Software\Voice\TextToSpeech\Engine\{E0725551-286F-11d0-8E73-00A0C9083363},Dirty,1,1
; for uninstall
HKLM,Software\Microsoft\MSTTS,InstallDir,,"%49000%"
HKLM,Software\Microsoft\Windows\CurrentVersion\Uninstall\MSTTS,"DisplayName",,"%AppName%
HKLM,Software\Microsoft\Windows\CurrentVersion\Uninstall\MSTTS,"UninstallString",,"RunDll32 advpack.dll,LaunchINFSection %17%\msTTS.inf, Uninstall"
[DelRegSection]
HKCU,Software\Microsoft\Whisper
HKLM,Software\Voice\TextToSpeech\Engine,MSTTSSyn
HKCR,CLSID\{E0725551-286F-11d0-8E73-00A0C9083363}
HKCR,CLSID\{161FA782-A52C-11d0-8D7C-00A0C9034A7E}
HKCR,CLSID\{FD913800-5CA2-11d2-A1E6-00A0C913D1EF}
HKCR,CLSID\{FD913801-5CA2-11d2-A1E6-00A0C913D1EF}
HKCR,CLSID\{FD913802-5CA2-11d2-A1E6-00A0C913D1EF}
HKCR,CLSID\{FD913803-5CA2-11d2-A1E6-00A0C913D1EF}
HKCR,CLSID\{FD913804-5CA2-11d2-A1E6-00A0C913D1EF}
HKLM,Software\Voice\TextToSpeech\Engine\{E0725551-286F-11d0-8E73-00A0C9083363}
; uninstall
HKLM,Software\Microsoft\Windows\CurrentVersion\Uninstall\MSTTS
HKLM,Software\Microsoft\MSTTS
[BeginPromptSection]
Prompt=%BeginPrompt%
ButtonType=YESNO
Title=%AppName%
[EndPromptSection]
Prompt=%EndPrompt%
[Strings]
AppName="Microsoft Text-to-Speech Engine 4.0 (English)"
BeginPrompt="Are you sure you want to remove the Microsoft text-to-speech engine? It may prevent text-to-speech from working."
EndPrompt="Uninstall complete."
DefaultDir="microsoft shared\SpeechEngines\TTS"
Binary file not shown.
Binary file not shown.
Binary file not shown.
+900
View File
@@ -0,0 +1,900 @@
[Version]
Signature="$Chicago$"
AdvancedINF=2.5,"You need a new version of advpack.dll"
[SourceDisksNames]
1=%AppName%,,1
[DefaultInstall]
CustomDestination=MyCustomDestination
Copyfiles=APIFiles,InfSection,VCRT
AddReg=APIReg
;RegisterOCXs=RegisterOCXSection
[DefaultInstall.NT]
CustomDestination=MyCustomDestination
Copyfiles=APIFiles,InfSection,VCRT
AddReg=APIReg
;RegisterOCXs=RegisterOCXSection
[MyCustomDestination]
49000,49001,49002,49003=PackageDestination49000,5
[UninstallDestination]
49000=UninstallDestination49000,5
[PackageDestination49000]
HKLM,Software\Microsoft\SpeechAPI,InstallDir,"%InstallPrompt%","%25%\speech"
[UninstallDestination49000]
HKLM,Software\Microsoft\SpeechAPI,InstallDir,"%InstallPrompt%","%25%\speech"
[Uninstall]
;BeginPrompt=BeginPromptSection
;EndPrompt=EndPromptSection
CustomDestination=UninstallDestination
DelFiles=APIFiles,VCmdVDctFiles
Deldirs=RemoveFolder
DelReg=DelRegSection
SmartReboot=I
Cleanup=1
;UnRegisterOCXs=RegisterOCXSection
[DestinationDirs]
APIFiles=49000
VCmdVDctFiles=49000
InfSection=17
VCRT=11
[APIFiles]
speech.dll,,,96
spchtel.dll,,,96
vcmd.exe,,,96
vcauto.tlb,,,96
vtxtauto.tlb,,,96
vcmshl.dll,,,96
speech.hlp
speech.cnt
Xlisten.dll,,,96
Xvoice.dll,,,96
Xcommand.dll,,,96
Vdict.dll,,,96
VText.dll,,,96
XTel.Dll,,,96
WrapSAPI.dll,,,96
[VCRT]
msvcrt.dll,,,16
[InfSection]
spchapi.inf
[VCmdVDctFiles]
speech.gid
vcmd0001.vcd
vcmd0002.vcd
vcmd0003.vcd
vcmd0004.vcd
vcmd0005.vcd
vcmd0006.vcd
vcmd0007.vcd
vcmd0008.vcd
vcmd0009.vcd
vcmd0010.vcd
vcmd0011.vcd
vcmd0012.vcd
vcmd0013.vcd
vcmd0014.vcd
vcmd0015.vcd
vcmd0016.vcd
vcmd0017.vcd
vcmd0018.vcd
vcmd0019.vcd
vdct0001.dct
vdct0002.dct
vdct0003.dct
vdct0004.dct
vdct0005.dct
vdct0006.dct
vdct0007.dct
vdct0008.dct
vdct0009.dct
vdct0010.dct
vdct0011.dct
vdct0012.dct
vdct0013.dct
vdct0014.dct
vdct0015.dct
vdct0016.dct
vdct0017.dct
vdct0018.dct
vdct0019.dct
[RemoveFolder]
%49000%
[APIReg]
HKCR,CLSID\{C63A2B30-5543-11b9-C000-5611722E1D15},,,IVCmd_PSFactory
HKCR,CLSID\{C63A2B30-5543-11b9-C000-5611722E1D15}\InprocServer32,,,%49000%\vcmshl.dll
HKCR,CLSID\{6D40D820-0BA7-11ce-A166-00AA004CD65C},,,"Voice Command Manager"
HKCR,CLSID\{6D40D820-0BA7-11ce-A166-00AA004CD65C}\LocalServer32,,,%49000%\vcmd.exe
HKCR,CLSID\{F1DC95A0-0BA7-11ce-A166-00AA004CD65C},,,"Voice Text Manager"
HKCR,CLSID\{F1DC95A0-0BA7-11ce-A166-00AA004CD65C}\LocalServer32,,,%49000%\vcmd.exe
HKCR,CLSID\{B9BD3860-44DB-101B-90A8-00AA003E4B50},,,ISRShare_PSFactory
HKCR,CLSID\{B9BD3860-44DB-101B-90A8-00AA003E4B50}\InprocServer32,,,%49000%\vcmshl.dll
HKCR,CLSID\{89F70C30-8636-11ce-B763-00AA004CD65C},,,"Speech Recognition Enumerator/Share Object"
HKCR,CLSID\{89F70C30-8636-11ce-B763-00AA004CD65C}\LocalServer32,,,%49000%\vcmd.exe
HKCR,CLSID\{D67C0280-C743-11cd-80E5-00AA003E4B50},,,"Text to Speech Enumerator"
HKCR,CLSID\{D67C0280-C743-11cd-80E5-00AA003E4B50}\InprocServer32,,,%49000%\Speech.dll
HKCR,CLSID\{D67C0280-C743-11cd-80E5-00AA003E4B50}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{554667BB-7213-11cf-B210-00AA00A215ED},,,"Lexicon Enumerator"
HKCR,CLSID\{554667BB-7213-11cf-B210-00AA00A215ED}\InprocServer32,,,%49000%\Speech.dll
HKCR,CLSID\{554667BB-7213-11cf-B210-00AA00A215ED}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{CB96B400-C743-11cd-80E5-00AA003E4B50},,,"Audio Destination Object"
HKCR,CLSID\{CB96B400-C743-11cd-80E5-00AA003E4B50}\InprocServer32,,,%49000%\Speech.dll
HKCR,CLSID\{CB96B400-C743-11cd-80E5-00AA003E4B50}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{E02D16C0-C743-11cd-80E5-00AA003E4B50},,,"Speech Recognition Enumerator"
HKCR,CLSID\{E02D16C0-C743-11cd-80E5-00AA003E4B50}\InprocServer32,,,%49000%\Speech.dll
HKCR,CLSID\{E02D16C0-C743-11cd-80E5-00AA003E4B50}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{D24FE500-C743-11cd-80E5-00AA003E4B50},,,"Audio Source Object"
HKCR,CLSID\{D24FE500-C743-11cd-80E5-00AA003E4B50}\InprocServer32,,,%49000%\Speech.dll
HKCR,CLSID\{D24FE500-C743-11cd-80E5-00AA003E4B50}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{D4023720-E4B9-11cf-8D56-00A0C9034A7E},,,"Instrumented Audio Source Object"
HKCR,CLSID\{D4023720-E4B9-11cf-8D56-00A0C9034A7E}\InprocServer32,,,%49000%\Speech.dll
HKCR,CLSID\{D4023720-E4B9-11cf-8D56-00A0C9034A7E}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{D4123720-E4B9-11cf-8D56-00A0C9034A7E},,,"Suspeding Audio Source Object"
HKCR,CLSID\{D4123720-E4B9-11cf-8D56-00A0C9034A7E}\InprocServer32,,,%49000%\Speech.dll
HKCR,CLSID\{D4123720-E4B9-11cf-8D56-00A0C9034A7E}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{D4523720-E4B9-11cf-8D56-00A0C9034A7E},,,"Audio Source from File Object"
HKCR,CLSID\{D4523720-E4B9-11cf-8D56-00A0C9034A7E}\InprocServer32,,,%49000%\Speech.dll
HKCR,CLSID\{D4523720-E4B9-11cf-8D56-00A0C9034A7E}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{D4623720-E4B9-11cf-8D56-00A0C9034A7E},,,"Audio Destination to File Object"
HKCR,CLSID\{D4623720-E4B9-11cf-8D56-00A0C9034A7E}\InprocServer32,,,%49000%\Speech.dll
HKCR,CLSID\{D4623720-E4B9-11cf-8D56-00A0C9034A7E}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{B9F11A90-90E3-11d0-8D77-00A0C9034A7E},,,"DirectSound Destination Object"
HKCR,CLSID\{B9F11A90-90E3-11d0-8D77-00A0C9034A7E}\InprocServer32,,,%49000%\Speech.dll
HKCR,CLSID\{B9F11A90-90E3-11d0-8D77-00A0C9034A7E}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{32C35401-D04F-11d0-99B3-00AA004CD65C},,,"DirectSound Source Object"
HKCR,CLSID\{32C35401-D04F-11d0-99B3-00AA004CD65C}\InprocServer32,,,%49000%\Speech.dll
HKCR,CLSID\{32C35401-D04F-11d0-99B3-00AA004CD65C}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{B9F11A95-90E3-11d0-8D77-00A0C9034A7E},,,"Microphone Setup Wizard"
HKCR,CLSID\{B9F11A95-90E3-11d0-8D77-00A0C9034A7E}\InprocServer32,,,%49000%\Speech.dll
HKCR,CLSID\{B9F11A95-90E3-11d0-8D77-00A0C9034A7E}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{B9F11A96-90E3-11d0-8D77-00A0C9034A7E},,,"Phoneme Converter"
HKCR,CLSID\{B9F11A96-90E3-11d0-8D77-00A0C9034A7E}\InprocServer32,,,%49000%\Speech.dll
HKCR,CLSID\{B9F11A96-90E3-11d0-8D77-00A0C9034A7E}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{70618F72-D1ED-11d0-8FAC-08002BE4E62A},,,"Speech Tools Grammar Compiler"
HKCR,CLSID\{70618F72-D1ED-11d0-8FAC-08002BE4E62A}\InprocServer32,,,%49000%\Speech.dll
HKCR,CLSID\{70618F72-D1ED-11d0-8FAC-08002BE4E62A}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{EFD0E6BA-DB5F-11d0-8FAC-08002BE4E62A},,,"Speech Tools TTS Queue"
HKCR,CLSID\{EFD0E6BA-DB5F-11d0-8FAC-08002BE4E62A}\InprocServer32,,,%49000%\Speech.dll
HKCR,CLSID\{EFD0E6BA-DB5F-11d0-8FAC-08002BE4E62A}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{B3613D9F-E26E-11d0-8FAC-08002BE4E62A},,,"Speech Tools Log"
HKCR,CLSID\{B3613D9F-E26E-11d0-8FAC-08002BE4E62A}\InprocServer32,,,%49000%\Speech.dll
HKCR,CLSID\{B3613D9F-E26E-11d0-8FAC-08002BE4E62A}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{B3613DA0-E26E-11d0-8FAC-08002BE4E62A},,,"Logging Audio Source"
HKCR,CLSID\{B3613DA0-E26E-11d0-8FAC-08002BE4E62A}\InprocServer32,,,%49000%\Speech.dll
HKCR,CLSID\{B3613DA0-E26E-11d0-8FAC-08002BE4E62A}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{2EC5A8A5-E65B-11d0-8FAC-08002BE4E62A},,,"Telephony Audio Source"
HKCR,CLSID\{2EC5A8A5-E65B-11d0-8FAC-08002BE4E62A}\InprocServer32,,,%49000%\Speech.dll
HKCR,CLSID\{2EC5A8A5-E65B-11d0-8FAC-08002BE4E62A}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{2EC5A8A6-E65B-11d0-8FAC-08002BE4E62A},,,"Telephony Audio Destination"
HKCR,CLSID\{2EC5A8A6-E65B-11d0-8FAC-08002BE4E62A}\InprocServer32,,,%49000%\Speech.dll
HKCR,CLSID\{2EC5A8A6-E65B-11d0-8FAC-08002BE4E62A}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{61935832-FC85-11d0-8FAE-08002BE4E62A},,,"Audio Record Object"
HKCR,CLSID\{61935832-FC85-11d0-8FAE-08002BE4E62A}\InprocServer32,,,%49000%\Speech.dll
HKCR,CLSID\{61935832-FC85-11d0-8FAE-08002BE4E62A}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{92655FB1-ADF9-11d1-BEB9-006008317CE8},,,"Lexicon Dialog"
HKCR,CLSID\{92655FB1-ADF9-11d1-BEB9-006008317CE8}\InprocServer32,,,%49000%\Speech.dll
HKCR,CLSID\{92655FB1-ADF9-11d1-BEB9-006008317CE8}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{F9D18BF8-E0ED-11d0-AB8B-08002BE4E3B7},,,"Telephony Controls Information Store"
HKCR,CLSID\{F9D18BF8-E0ED-11d0-AB8B-08002BE4E3B7}\InprocServer32,,,%49000%\SpchTel.dll
HKCR,CLSID\{F9D18BF8-E0ED-11d0-AB8B-08002BE4E3B7}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{A26D7620-6FA0-11ce-A166-00AA004CD65C},,,"Voice Command Object"
HKCR,CLSID\{A26D7620-6FA0-11ce-A166-00AA004CD65C}\ProgID,,,Speech.VoiceCommand.1
HKCR,CLSID\{A26D7620-6FA0-11ce-A166-00AA004CD65C}\VersionIndependentProgID,,,Speech.VoiceCommand
HKCR,CLSID\{A26D7620-6FA0-11ce-A166-00AA004CD65C}\LocalServer32,,,%49000%\vcmd.exe
HKCR,CLSID\{FF2C7A52-78F9-11ce-B762-00AA004CD65C},,,"Voice Text Object"
HKCR,CLSID\{FF2C7A52-78F9-11ce-B762-00AA004CD65C}\ProgID,,,Speech.VoiceText.1
HKCR,CLSID\{FF2C7A52-78F9-11ce-B762-00AA004CD65C}\VersionIndependentProgID,,,Speech.VoiceText
HKCR,CLSID\{FF2C7A52-78F9-11ce-B762-00AA004CD65C}\LocalServer32,,,%49000%\vcmd.exe
HKCR,CLSID\{35522CA0-67CE-11cf-9B8B-08005AFC3A41},,,"Voice Dictation Manager"
HKCR,CLSID\{35522CA0-67CE-11cf-9B8B-08005AFC3A41}\LocalServer32,,,%49000%\vcmd.exe
HKCR,Speech.VoiceCommand,,,"VoiceCommand Application"
HKCR,Speech.VoiceCommand\Clsid,,,{A26D7620-6FA0-11ce-A166-00AA004CD65C}
HKCR,Speech.VoiceCommand.1,,,"VCmd Application"
HKCR,Speech.VoiceCommand.1\Clsid,,,{A26D7620-6FA0-11ce-A166-00AA004CD65C}
HKCR,TypeLib\{A26D7621-6FA0-11ce-A166-00AA004CD65C}
HKCR,TypeLib\{A26D7621-6FA0-11ce-A166-00AA004CD65C}\1.0,,,"Voice Command Object Library"
HKCR,TypeLib\{A26D7621-6FA0-11ce-A166-00AA004CD65C}\1.0\HELPDIR
HKCR,TypeLib\{A26D7621-6FA0-11ce-A166-00AA004CD65C}\1.0\409\win32,,,%49000%\vcauto.tlb
HKCR,Interface\{A26D7622-6FA0-11ce-A166-00AA004CD65C},,,IVCmdAuto
HKCR,Interface\{A26D7622-6FA0-11ce-A166-00AA004CD65C}\TypeLib,,,{A26D7621-6FA0-11ce-A166-00AA004CD65C}
HKCR,Interface\{A26D7622-6FA0-11ce-A166-00AA004CD65C}\ProxyStubClsid,,,{00020424-0000-0000-C000-000000000046}
HKCR,Interface\{A26D7622-6FA0-11ce-A166-00AA004CD65C}\ProxyStubClsid32,,,{00020424-0000-0000-C000-000000000046}
HKCR,Interface\{A26D7623-6FA0-11ce-A166-00AA004CD65C},,,IVCmdMenu
HKCR,Interface\{A26D7623-6FA0-11ce-A166-00AA004CD65C}\TypeLib,,,{A26D7621-6FA0-11ce-A166-00AA004CD65C}
HKCR,Interface\{A26D7623-6FA0-11ce-A166-00AA004CD65C}\ProxyStubClsid,,,{00020424-0000-0000-C000-000000000046}
HKCR,Interface\{A26D7623-6FA0-11ce-A166-00AA004CD65C}\ProxyStubClsid32,,,{00020424-0000-0000-C000-000000000046}
HKCR,Speech.VoiceText,,,"VoiceText Application"
HKCR,Speech.VoiceText\Clsid,,,{FF2C7A52-78F9-11ce-B762-00AA004CD65C}
HKCR,Speech.VoiceText.1,,,"VCmd Application"
HKCR,Speech.VoiceText.1\Clsid,,,{FF2C7A52-78F9-11ce-B762-00AA004CD65C}
HKCR,TypeLib\{FF2C7A51-78F9-11ce-B762-00AA004CD65C}
HKCR,TypeLib\{FF2C7A51-78F9-11ce-B762-00AA004CD65C}\1.0,,,"Voice Text Object Library"
HKCR,TypeLib\{FF2C7A51-78F9-11ce-B762-00AA004CD65C}\1.0\HELPDIR
HKCR,TypeLib\{FF2C7A51-78F9-11ce-B762-00AA004CD65C}\1.0\409\win32,,,%49000%\vtxtauto.tlb
HKCR,Interface\{FF2C7A50-78F9-11ce-B762-00AA004CD65C},,,IVTxtAuto
HKCR,Interface\{FF2C7A50-78F9-11ce-B762-00AA004CD65C}\TypeLib,,,{FF2C7A51-78F9-11ce-B762-00AA004CD65C}
HKCR,Interface\{FF2C7A50-78F9-11ce-B762-00AA004CD65C}\ProxyStubClsid,,,{00020424-0000-0000-C000-000000000046}
HKCR,Interface\{FF2C7A50-78F9-11ce-B762-00AA004CD65C}\ProxyStubClsid32,,,{00020424-0000-0000-C000-000000000046}
HKCR,Interface\{CCFD7A60-604D-101B-9926-00AA003CFC2C},,,IVCmdNotifySinkW
HKCR,Interface\{CCFD7A60-604D-101B-9926-00AA003CFC2C}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{80B25CC0-5540-11b9-C000-5611722E1D15},,,IVCmdNotifySinkA
HKCR,Interface\{80B25CC0-5540-11b9-C000-5611722E1D15}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{D3CC0820-604D-101B-9926-00AA003CFC2C},,,IVCmdEnumW
HKCR,Interface\{D3CC0820-604D-101B-9926-00AA003CFC2C}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{E86F9540-DCA2-11CD-A166-00AA004CD65C},,,IVCmdEnumA
HKCR,Interface\{E86F9540-DCA2-11CD-A166-00AA004CD65C}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{DAC54F60-604D-101B-9926-00AA003CFC2C},,,IVCmdMenuW
HKCR,Interface\{DAC54F60-604D-101B-9926-00AA003CFC2C}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{746141E0-5543-11b9-C000-5611722E1D15},,,IVCmdMenuA
HKCR,Interface\{746141E0-5543-11b9-C000-5611722E1D15}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{E0DCC220-604D-101B-9926-00AA003CFC2C},,,IVoiceCommandW
HKCR,Interface\{E0DCC220-604D-101B-9926-00AA003CFC2C}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{C63A2B30-5543-11b9-C000-5611722E1D15},,,IVoiceCommandA
HKCR,Interface\{C63A2B30-5543-11b9-C000-5611722E1D15}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{D981C420-6053-101B-9926-00AA003CFC2C},,,IVCmdMenuSetW
HKCR,Interface\{D981C420-6053-101B-9926-00AA003CFC2C}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{AEB2A680-5544-11b9-C000-5611722E1D15},,,IVCmdMenuSetA
HKCR,Interface\{AEB2A680-5544-11b9-C000-5611722E1D15}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{E5F24680-6053-101B-9926-00AA003CFC2C},,,IVCmdAttributesW
HKCR,Interface\{E5F24680-6053-101B-9926-00AA003CFC2C}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{FFF5DF80-5544-11b9-C000-5611722E1D15},,,IVCmdAttributesA
HKCR,Interface\{FFF5DF80-5544-11b9-C000-5611722E1D15}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{EE39B8A0-6053-101B-9926-00AA003CFC2C},,,IVCmdDialogsW
HKCR,Interface\{EE39B8A0-6053-101B-9926-00AA003CFC2C}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{AA8FE260-5545-11b9-C000-5611722E1D15},,,IVCmdDialogsA
HKCR,Interface\{AA8FE260-5545-11b9-C000-5611722E1D15}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{FD3A2430-E090-11cd-A166-00AA004CD65C},,,IVMsgNotifySinkW
HKCR,Interface\{FD3A2430-E090-11cd-A166-00AA004CD65C}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{D2C840E0-E092-11cd-A166-00AA004CD65C},,,IVMsgNotifySinkA
HKCR,Interface\{D2C840E0-E092-11cd-A166-00AA004CD65C}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{C4FE8740-E093-11cd-A166-00AA004CD65C},,,IVoiceMessageW
HKCR,Interface\{C4FE8740-E093-11cd-A166-00AA004CD65C}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{E1B7A180-E093-11cd-A166-00AA004CD65C},,,IVoiceMessageA
HKCR,Interface\{E1B7A180-E093-11cd-A166-00AA004CD65C}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{6A8D6140-E095-11cd-A166-00AA004CD65C},,,IVMsgAttributesW
HKCR,Interface\{6A8D6140-E095-11cd-A166-00AA004CD65C}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{8BE9CC30-E095-11cd-A166-00AA004CD65C},,,IVMsgAttributesA
HKCR,Interface\{8BE9CC30-E095-11cd-A166-00AA004CD65C}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{D6469210-E095-11cd-A166-00AA004CD65C},,,IVMsgDialogsW
HKCR,Interface\{D6469210-E095-11cd-A166-00AA004CD65C}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{E8F6FA20-E095-11cd-A166-00AA004CD65C},,,IVMsgDialogsA
HKCR,Interface\{E8F6FA20-E095-11cd-A166-00AA004CD65C}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{2F440FB4-CE01-11cf-B234-00AA00A215ED},,,IVCmdNotifySinkExW
HKCR,Interface\{2F440FB4-CE01-11cf-B234-00AA00A215ED}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{2F440FB8-CE01-11cf-B234-00AA00A215ED},,,IVCmdNotifySinkExA
HKCR,Interface\{2F440FB8-CE01-11cf-B234-00AA00A215ED}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{68A33AA0-44CD-101B-90A8-00AA003E4B50},,,ISRAttributesW
HKCR,Interface\{68A33AA0-44CD-101B-90A8-00AA003E4B50}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{2F26B9C1-DB31-11CD-B3CA-00AA0047BA4F},,,ISRAttributesA
HKCR,Interface\{2F26B9C1-DB31-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{F106BFA0-C743-11CD-80E5-00AA003E4B50},,,ISRGramNotifySinkW
HKCR,Interface\{F106BFA0-C743-11CD-80E5-00AA003E4B50}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{EFEEA350-CE5E-11CD-9D96-00AA002FC7C9},,,ISRGramNotifySinkA
HKCR,Interface\{EFEEA350-CE5E-11CD-9D96-00AA002FC7C9}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{090CD9B0-DA1A-11CD-B3CA-00AA0047BA4F},,,ISRNotifySink
HKCR,Interface\{090CD9B0-DA1A-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{9B445332-E39F-11d1-BED7-006008317CE8},,,ISRNotifySink2
HKCR,Interface\{9B445332-E39F-11d1-BED7-006008317CE8}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{B9BD3860-44DB-101B-90A8-00AA003E4B50},,,ISRCentralW
HKCR,Interface\{B9BD3860-44DB-101B-90A8-00AA003E4B50}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{2F26B9C2-DB31-11CD-B3CA-00AA0047BA4F},,,ISRCentralA
HKCR,Interface\{2F26B9C2-DB31-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{BCFB4C60-44DB-101B-90A8-00AA003E4B50},,,ISRDialogsW
HKCR,Interface\{BCFB4C60-44DB-101B-90A8-00AA003E4B50}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{05EB6C60-DBAB-11CD-B3CA-00AA0047BA4F},,,ISRDialogsA
HKCR,Interface\{05EB6C60-DBAB-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{9B445330-E39F-11d1-BED7-006008317CE8},,,ISRDialogs2W
HKCR,Interface\{9B445330-E39F-11d1-BED7-006008317CE8}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{9B445331-E39F-11d1-BED7-006008317CE8},,,ISRDialogs2A
HKCR,Interface\{9B445331-E39F-11d1-BED7-006008317CE8}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{BFA9F1A0-44DB-101B-90A8-00AA003E4B50},,,ISREnumW
HKCR,Interface\{BFA9F1A0-44DB-101B-90A8-00AA003E4B50}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{05EB6C61-DBAB-11CD-B3CA-00AA0047BA4F},,,ISREnumA
HKCR,Interface\{05EB6C61-DBAB-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{C2835060-44DB-101B-90A8-00AA003E4B50},,,ISRFindW
HKCR,Interface\{C2835060-44DB-101B-90A8-00AA003E4B50}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{05EB6C62-DBAB-11CD-B3CA-00AA0047BA4F},,,ISRFindA
HKCR,Interface\{05EB6C62-DBAB-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{E8C3E160-C743-11CD-80E5-00AA003E4B50},,,ISRGramCommonW
HKCR,Interface\{E8C3E160-C743-11CD-80E5-00AA003E4B50}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{05EB6C63-DBAB-11CD-B3CA-00AA0047BA4F},,,ISRGramCommonA
HKCR,Interface\{05EB6C63-DBAB-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{ECC0B180-C743-11CD-80E5-00AA003E4B50},,,ISRGramCFGW
HKCR,Interface\{ECC0B180-C743-11CD-80E5-00AA003E4B50}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{05EB6C64-DBAB-11CD-B3CA-00AA0047BA4F},,,ISRGramCFGA
HKCR,Interface\{05EB6C64-DBAB-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{090CD9A3-DA1A-11CD-B3CA-00AA0047BA4F},,,ISRGramDictationW
HKCR,Interface\{090CD9A3-DA1A-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{05EB6C65-DBAB-11CD-B3CA-00AA0047BA4F},,,ISRGramDictationA
HKCR,Interface\{05EB6C65-DBAB-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{090CD9A4-DA1A-11CD-B3CA-00AA0047BA4F},,,ISRGramInsertionGUI
HKCR,Interface\{090CD9A4-DA1A-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{090CD9A5-DA1A-11CD-B3CA-00AA0047BA4F},,,ISRResBasicW
HKCR,Interface\{090CD9A5-DA1A-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{05EB6C66-DBAB-11CD-B3CA-00AA0047BA4F},,,ISRResBasicA
HKCR,Interface\{05EB6C66-DBAB-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{090CD9A6-DA1A-11CD-B3CA-00AA0047BA4F},,,ISRResMerge
HKCR,Interface\{090CD9A6-DA1A-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{090CD9A7-DA1A-11CD-B3CA-00AA0047BA4F},,,ISRResAudio
HKCR,Interface\{090CD9A7-DA1A-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{aad74c30-4b02-11d1-b792-0060979841b4},,,ISRResAudioEx
HKCR,Interface\{aad74c30-4b02-11d1-b792-0060979841b4}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{090CD9A8-DA1A-11CD-B3CA-00AA0047BA4F},,,ISRResCorrectionW
HKCR,Interface\{090CD9A8-DA1A-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{05EB6C67-DBAB-11CD-B3CA-00AA0047BA4F},,,ISRResCorrectionA
HKCR,Interface\{05EB6C67-DBAB-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{090CD9A9-DA1A-11CD-B3CA-00AA0047BA4F},,,ISRResEval
HKCR,Interface\{090CD9A9-DA1A-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{090CD9AA-DA1A-11CD-B3CA-00AA0047BA4F},,,ISRResGraphW
HKCR,Interface\{090CD9AA-DA1A-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{05EB6C68-DBAB-11CD-B3CA-00AA0047BA4F},,,ISRResGraphA
HKCR,Interface\{05EB6C68-DBAB-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{be8f63a0-b915-11d1-b7bc-0060979841b4},,,ISRResGraphEx
HKCR,Interface\{be8f63a0-b915-11d1-b7bc-0060979841b4}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{090CD9AB-DA1A-11CD-B3CA-00AA0047BA4F},,,ISRResMemory
HKCR,Interface\{090CD9AB-DA1A-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{090CD9AC-DA1A-11CD-B3CA-00AA0047BA4F},,,ISRResModifyGUI
HKCR,Interface\{090CD9AC-DA1A-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{090CD9AD-DA1A-11CD-B3CA-00AA0047BA4F},,,ISRResSpeakerW
HKCR,Interface\{090CD9AD-DA1A-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{05EB6C69-DBAB-11CD-B3CA-00AA0047BA4F},,,ISRResSpeakerA
HKCR,Interface\{05EB6C69-DBAB-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{9B445333-E39F-11d1-BED7-006008317CE8},,,ISRSpeakerW
HKCR,Interface\{9B445333-E39F-11d1-BED7-006008317CE8}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{9B445334-E39F-11d1-BED7-006008317CE8},,,ISRSpeakerA
HKCR,Interface\{9B445334-E39F-11d1-BED7-006008317CE8}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{090CD9AE-DA1A-11CD-B3CA-00AA0047BA4F},,,ISRSpeaker2W
HKCR,Interface\{090CD9AE-DA1A-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{090CD9AF-DA1A-11CD-B3CA-00AA0047BA4F},,,ISRSpeaker2A
HKCR,Interface\{090CD9AF-DA1A-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{E97F05C0-81B3-11ce-B763-00AA004CD65C},,,IEnumSRShareW
HKCR,Interface\{E97F05C0-81B3-11ce-B763-00AA004CD65C}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{E97F05C1-81B3-11ce-B763-00AA004CD65C},,,IEnumSRShareA
HKCR,Interface\{E97F05C1-81B3-11ce-B763-00AA004CD65C}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{0B37F1E0-B8DE-11cf-B22E-00AA00A215ED},,,ISRResScores
HKCR,Interface\{0B37F1E0-B8DE-11cf-B22E-00AA00A215ED}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{1D59DED1-E367-11d1-BED7-006008317CE8},,,IAttributesW
HKCR,Interface\{1D59DED1-E367-11d1-BED7-006008317CE8}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{1D59DED2-E367-11d1-BED7-006008317CE8},,,IAttributesA
HKCR,Interface\{1D59DED2-E367-11d1-BED7-006008317CE8}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{090CD9A2-DA1A-11CD-B3CA-00AA0047BA4F},,,ILexPronounceW
HKCR,Interface\{090CD9A2-DA1A-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{2F26B9C0-DB31-11CD-B3CA-00AA0047BA4F},,,ILexPronounceA
HKCR,Interface\{2F26B9C0-DB31-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{D6E56341-B3EA-11d1-AFA5-0000F81E880D},,,ILexPronounce2W
HKCR,Interface\{D6E56341-B3EA-11d1-AFA5-0000F81E880D}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{D6E56342-B3EA-11d1-AFA5-0000F81E880D},,,ILexPronounce2A
HKCR,Interface\{D6E56342-B3EA-11d1-AFA5-0000F81E880D}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{9B445335-E39F-11d1-BED7-006008317CE8},,,ISpchErrorW
HKCR,Interface\{9B445335-E39F-11d1-BED7-006008317CE8}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{9B445336-E39F-11d1-BED7-006008317CE8},,,ISpchErrorA
HKCR,Interface\{9B445336-E39F-11d1-BED7-006008317CE8}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{05EB6C6A-DBAB-11CD-B3CA-00AA0047BA4F},,,ITTSCentralA
HKCR,Interface\{05EB6C6A-DBAB-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{28016060-4A47-101B-931A-00AA0047BA4F},,,ITTSCentralW
HKCR,Interface\{28016060-4A47-101B-931A-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{0FD6E2A1-E77D-11CD-B3CA-00AA0047BA4F},,,ITTSAttributesA
HKCR,Interface\{0FD6E2A1-E77D-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{1287A280-4A47-101B-931A-00AA0047BA4F},,,ITTSAttributesW
HKCR,Interface\{1287A280-4A47-101B-931A-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{e4963d40-c743-11cd-80e5-00aa003e4b50},,,ITTSBufNotifySink
HKCR,Interface\{e4963d40-c743-11cd-80e5-00aa003e4b50}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{05EB6C6B-DBAB-11CD-B3CA-00AA0047BA4F},,,ITTSDialogsA
HKCR,Interface\{05EB6C6B-DBAB-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{47F59D00-4A47-101B-931A-00AA0047BA4F},,,ITTSDialogsW
HKCR,Interface\{47F59D00-4A47-101B-931A-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{05EB6C6D-DBAB-11CD-B3CA-00AA0047BA4F},,,ITTSEnumA
HKCR,Interface\{05EB6C6D-DBAB-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{6B837B20-4A47-101B-931A-00AA0047BA4F},,,ITTSEnumW
HKCR,Interface\{6B837B20-4A47-101B-931A-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{05EB6C6E-DBAB-11CD-B3CA-00AA0047BA4F},,,ITTSFindA
HKCR,Interface\{05EB6C6E-DBAB-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{7AA42960-4A47-101B-931A-00AA0047BA4F},,,ITTSFindW
HKCR,Interface\{7AA42960-4A47-101B-931A-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{05EB6C6F-DBAB-11CD-B3CA-00AA0047BA4F},,,ITTSNotifySinkA
HKCR,Interface\{05EB6C6F-DBAB-11CD-B3CA-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{C0FA8F40-4A46-101B-931A-00AA0047BA4F},,,ITTSNotifySinkW
HKCR,Interface\{C0FA8F40-4A46-101B-931A-00AA0047BA4F}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{599F77E2-E42E-11d1-BED8-006008317CE8},,,ITTSNotifySink2A
HKCR,Interface\{599F77E2-E42E-11d1-BED8-006008317CE8}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{599F77E1-E42E-11d1-BED8-006008317CE8},,,ITTSNotifySink2W
HKCR,Interface\{599F77E1-E42E-11d1-BED8-006008317CE8}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{F546B340-C743-11cd-80E5-00AA003E4B50},,,IAudio
HKCR,Interface\{F546B340-C743-11cd-80E5-00AA003E4B50}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{BC06A220-C743-11cd-80E5-00AA003E4B50},,,IAudioSource
HKCR,Interface\{BC06A220-C743-11cd-80E5-00AA003E4B50}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{2EC34DA0-C743-11cd-80E5-00AA003E4B50},,,IAudioDest
HKCR,Interface\{2EC34DA0-C743-11cd-80E5-00AA003E4B50}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{C0BD9A80-C743-11cd-80E5-00AA003E4B50},,,IAudioSourceNotifySink
HKCR,Interface\{C0BD9A80-C743-11cd-80E5-00AA003E4B50}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{ACB08C00-C743-11cd-80E5-00AA003E4B50},,,IAudioDestNotifySink
HKCR,Interface\{ACB08C00-C743-11cd-80E5-00AA003E4B50}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{492FE490-51E7-11b9-C000-FED6CBA3B1A9},,,IAudioFileNotifySink
HKCR,Interface\{492FE490-51E7-11b9-C000-FED6CBA3B1A9}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{FD7C2320-3D6D-11b9-C000-FED6CBA3B1A9},,,IAudioFile
HKCR,Interface\{FD7C2320-3D6D-11b9-C000-FED6CBA3B1A9}\ProxyStubClsid32,,,{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{88AD7DC3-67D5-11cf-9B8B-08005AFC3A41},,,IVoiceDictationW
HKCR,Interface\{88AD7DC3-67D5-11cf-9B8B-08005AFC3A41}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{88AD7DC4-67D5-11cf-9B8B-08005AFC3A41},,,IVoiceDictationA
HKCR,Interface\{88AD7DC4-67D5-11cf-9B8B-08005AFC3A41}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{6D62B3A0-6893-11cf-9B8B-08005AFC3A41},,,IVDctTextW
HKCR,Interface\{6D62B3A0-6893-11cf-9B8B-08005AFC3A41}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{6D62B3A1-6893-11cf-9B8B-08005AFC3A41},,,IVDctTextA
HKCR,Interface\{6D62B3A1-6893-11cf-9B8B-08005AFC3A41}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{238004E1-F0C4-11d1-BED9-006008317CE8},,,IVDctText2W
HKCR,Interface\{238004E1-F0C4-11d1-BED9-006008317CE8}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{238004E2-F0C4-11d1-BED9-006008317CE8},,,IVDctText2A
HKCR,Interface\{238004E2-F0C4-11d1-BED9-006008317CE8}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{238004E3-F0C4-11d1-BED9-006008317CE8},,,IVDctTextCache
HKCR,Interface\{238004E3-F0C4-11d1-BED9-006008317CE8}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{88AD7DC5-67D5-11cf-9B8B-08005AFC3A41},,,IVDctAttributesW
HKCR,Interface\{88AD7DC5-67D5-11cf-9B8B-08005AFC3A41}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{88AD7DC6-67D5-11cf-9B8B-08005AFC3A41},,,IVDctAttributesA
HKCR,Interface\{88AD7DC6-67D5-11cf-9B8B-08005AFC3A41}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{88AD7DC7-67D5-11cf-9B8B-08005AFC3A41},,,IVDctDialogsW
HKCR,Interface\{88AD7DC7-67D5-11cf-9B8B-08005AFC3A41}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{88AD7DC8-67D5-11cf-9B8B-08005AFC3A41},,,IVDctDialogsA
HKCR,Interface\{88AD7DC8-67D5-11cf-9B8B-08005AFC3A41}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{5FEB8800-67D5-11cf-9B8B-08005AFC3A41},,,IVDctNotifySinkW
HKCR,Interface\{5FEB8800-67D5-11cf-9B8B-08005AFC3A41}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{88AD7DC0-67D5-11cf-9B8B-08005AFC3A41},,,IVDctNotifySinkA
HKCR,Interface\{88AD7DC0-67D5-11cf-9B8B-08005AFC3A41}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{599F77E3-E42E-11d1-BED8-006008317CE8},,,IVDctNotifySink2W
HKCR,Interface\{599F77E3-E42E-11d1-BED8-006008317CE8}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{599F77E4-E42E-11d1-BED8-006008317CE8},,,IVDctNotifySink2A
HKCR,Interface\{599F77E4-E42E-11d1-BED8-006008317CE8}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{8953F1A0-7E80-11cf-8D15-00A0C9034A7E},,,IVDctGUI
HKCR,Interface\{8953F1A0-7E80-11cf-8D15-00A0C9034A7E}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{A02C2CA0-AE50-11cf-833A-00AA00A21A29},,,IVDctCommandsW
HKCR,Interface\{A02C2CA0-AE50-11cf-833A-00AA00A21A29}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{A02C2CA1-AE50-11cf-833A-00AA00A21A29},,,IVDctCommandsA
HKCR,Interface\{A02C2CA1-AE50-11cf-833A-00AA00A21A29}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{A02C2CA2-AE50-11cf-833A-00AA00A21A29},,,IVDctGlossaryW
HKCR,Interface\{A02C2CA2-AE50-11cf-833A-00AA00A21A29}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{A02C2CA3-AE50-11cf-833A-00AA00A21A29},,,IVDctGlossaryA
HKCR,Interface\{A02C2CA3-AE50-11cf-833A-00AA00A21A29}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{90A84EA0-6E51-11D0-9BC2-08005AFC3A41},,,IVDctInvTextNormW
HKCR,Interface\{90A84EA0-6E51-11D0-9BC2-08005AFC3A41}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{90A84EA1-6E51-11D0-9BC2-08005AFC3A41},,,IVDctInvTextNormA
HKCR,Interface\{90A84EA1-6E51-11D0-9BC2-08005AFC3A41}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{D4E3F8E0-6521-11d1-8C35-006097DF5D01},,,IVDctCommandsBuiltInW
HKCR,Interface\{D4E3F8E0-6521-11d1-8C35-006097DF5D01}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{D4E3F8E1-6521-11d1-8C35-006097DF5D01},,,IVDctCommandsAppW
HKCR,Interface\{D4E3F8E1-6521-11d1-8C35-006097DF5D01}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{8763AFD1-7ADE-11d1-BEA7-006008317CE8},,,IVDctCommandsBuiltInA
HKCR,Interface\{8763AFD1-7ADE-11d1-BEA7-006008317CE8}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{8763AFD2-7ADE-11d1-BEA7-006008317CE8},,,IVDctCommandsAppA
HKCR,Interface\{8763AFD2-7ADE-11d1-BEA7-006008317CE8}\ProxyStubClsid32,,,{C63A2B30-5543-11b9-C000-5611722E1D15}
; for uninstall
HKLM,Software\Microsoft\SpeechAPI,InstallDir,,%49000%
; controls
HKCR,CLSID\{53961A01-459B-11d1-BE77-006008317CE8},,,"Yes/No Control"
HKCR,CLSID\{53961A01-459B-11d1-BE77-006008317CE8}\InprocServer32,,,%49000%\spchtel.dll
HKCR,CLSID\{53961A01-459B-11d1-BE77-006008317CE8}\InprocServer32,ThreadingModel,,Apartment
HKLM,SOFTWARE\Microsoft\SpeechAPI\TelephonyControls,"Yes/No Control",,"{53961A01-459B-11d1-BE77-006008317CE8}"
HKCR,CLSID\{53961A02-459B-11d1-BE77-006008317CE8},,,"Extension Control"
HKCR,CLSID\{53961A02-459B-11d1-BE77-006008317CE8}\InprocServer32,,,%49000%\spchtel.dll
HKCR,CLSID\{53961A02-459B-11d1-BE77-006008317CE8}\InprocServer32,ThreadingModel,,Apartment
HKLM,SOFTWARE\Microsoft\SpeechAPI\TelephonyControls,"Extension Control",,"{53961A02-459B-11d1-BE77-006008317CE8}"
HKCR,CLSID\{53961A03-459B-11d1-BE77-006008317CE8},,,"Phone Number Control"
HKCR,CLSID\{53961A03-459B-11d1-BE77-006008317CE8}\InprocServer32,,,%49000%\spchtel.dll
HKCR,CLSID\{53961A03-459B-11d1-BE77-006008317CE8}\InprocServer32,ThreadingModel,,Apartment
HKLM,SOFTWARE\Microsoft\SpeechAPI\TelephonyControls,"Phone Number Control",,"{53961A03-459B-11d1-BE77-006008317CE8}"
HKCR,CLSID\{53961A04-459B-11d1-BE77-006008317CE8},,,"Grammar Control"
HKCR,CLSID\{53961A04-459B-11d1-BE77-006008317CE8}\InprocServer32,,,%49000%\spchtel.dll
HKCR,CLSID\{53961A04-459B-11d1-BE77-006008317CE8}\InprocServer32,ThreadingModel,,Apartment
HKLM,SOFTWARE\Microsoft\SpeechAPI\TelephonyControls,"Grammar Control",,"{53961A04-459B-11d1-BE77-006008317CE8}"
HKCR,CLSID\{53961A05-459B-11d1-BE77-006008317CE8},,,"Date Control"
HKCR,CLSID\{53961A05-459B-11d1-BE77-006008317CE8}\InprocServer32,,,%49000%\spchtel.dll
HKCR,CLSID\{53961A05-459B-11d1-BE77-006008317CE8}\InprocServer32,ThreadingModel,,Apartment
HKLM,SOFTWARE\Microsoft\SpeechAPI\TelephonyControls,"Date Control",,"{53961A05-459B-11d1-BE77-006008317CE8}"
HKCR,CLSID\{53961A06-459B-11d1-BE77-006008317CE8},,,"Time Control"
HKCR,CLSID\{53961A06-459B-11d1-BE77-006008317CE8}\InprocServer32,,,%49000%\spchtel.dll
HKCR,CLSID\{53961A06-459B-11d1-BE77-006008317CE8}\InprocServer32,ThreadingModel,,Apartment
HKLM,SOFTWARE\Microsoft\SpeechAPI\TelephonyControls,"Time Control",,"{53961A06-459B-11d1-BE77-006008317CE8}"
HKCR,CLSID\{53961A07-459B-11d1-BE77-006008317CE8},,,"Record Control"
HKCR,CLSID\{53961A07-459B-11d1-BE77-006008317CE8}\InprocServer32,,,%49000%\spchtel.dll
HKCR,CLSID\{53961A07-459B-11d1-BE77-006008317CE8}\InprocServer32,ThreadingModel,,Apartment
HKLM,SOFTWARE\Microsoft\SpeechAPI\TelephonyControls,"Record Control",,"{53961A07-459B-11d1-BE77-006008317CE8}"
HKCR,CLSID\{53961A08-459B-11d1-BE77-006008317CE8},,,"Spelling Control"
HKCR,CLSID\{53961A08-459B-11d1-BE77-006008317CE8}\InprocServer32,,,%49000%\spchtel.dll
HKCR,CLSID\{53961A08-459B-11d1-BE77-006008317CE8}\InprocServer32,ThreadingModel,,Apartment
HKLM,SOFTWARE\Microsoft\SpeechAPI\TelephonyControls,"Spelling Control",,"{53961A08-459B-11d1-BE77-006008317CE8}"
HKCR,CLSID\{53961A09-459B-11d1-BE77-006008317CE8},,,"Name Control"
HKCR,CLSID\{53961A09-459B-11d1-BE77-006008317CE8}\InprocServer32,,,%49000%\spchtel.dll
HKCR,CLSID\{53961A09-459B-11d1-BE77-006008317CE8}\InprocServer32,ThreadingModel,,Apartment
HKLM,SOFTWARE\Microsoft\SpeechAPI\TelephonyControls,"Name Control",,"{53961A09-459B-11d1-BE77-006008317CE8}"
HKLM,SOFTWARE\Microsoft\SpeechAPI,"PronMailCompany",,"Microsoft"
HKLM,SOFTWARE\Microsoft\SpeechAPI,"PronMailAddRess",,"SpchData@Microsoft.com"
; ActiveX controls
;DirectSR
HKCR,CLSID\{4E3D9D1F-0C63-11D1-8BFB-0060081841DE},,,"DirectSR Class"
HKCR,CLSID\{4E3D9D1F-0C63-11D1-8BFB-0060081841DE}\InprocServer32,,,%49000%\Xlisten.dll
HKCR,CLSID\{4E3D9D1F-0C63-11D1-8BFB-0060081841DE}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{4E3D9D1F-0C63-11D1-8BFB-0060081841DE}\ProgId,,,"DirectSR.DirectSR.1"
HKCR,CLSID\{4E3D9D1F-0C63-11D1-8BFB-0060081841DE}\ToolboxBitmap32,,,"%49000%\Xlisten.dll,1"
HKCR,CLSID\{4E3D9D1F-0C63-11D1-8BFB-0060081841DE}\TypeLib,,,"{4E3D9D11-0C63-11D1-8BFB-0060081841DE}"
HKCR,CLSID\{4E3D9D1F-0C63-11D1-8BFB-0060081841DE}\Version,,,"1.0"
HKCR,CLSID\{4E3D9D1F-0C63-11D1-8BFB-0060081841DE}\VersionIndependendProgId,,,"DirectSR.DirectSR"
HKCR,CLSID\{4E3D9D1F-0C63-11D1-8BFB-0060081841DE}\Control
HKCR,CLSID\{4E3D9D1F-0C63-11D1-8BFB-0060081841DE}\Insertable
HKCR,CLSID\{4E3D9D1F-0C63-11D1-8BFB-0060081841DE}\Programmable
HKCR,CLSID\{4E3D9D1F-0C63-11D1-8BFB-0060081841DE}\MiscStatus
HKCR,CLSID\{4E3D9D1F-0C63-11D1-8BFB-0060081841DE}\MiscStatus\1,,,"131473"
HKCR,TypeLib\{4E3D9D11-0C63-11D1-8BFB-0060081841DE}
HKCR,TypeLib\{4E3D9D11-0C63-11D1-8BFB-0060081841DE}\1.0,,,"Microsoft Direct Speech Recognition"
HKCR,TypeLib\{4E3D9D11-0C63-11D1-8BFB-0060081841DE}\1.0\0\win32,,,"%49000%\Xlisten.dll"
;DirectSS
HKCR,CLSID\{EEE78591-FE22-11D0-8BEF-0060081841DE},,,"DirectSS Class"
HKCR,CLSID\{EEE78591-FE22-11D0-8BEF-0060081841DE}\InprocServer32,,,%49000%\XVoice.dll
HKCR,CLSID\{EEE78591-FE22-11D0-8BEF-0060081841DE}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{EEE78591-FE22-11D0-8BEF-0060081841DE}\ProgId,,,"DirectSS.DirectSS.1"
HKCR,CLSID\{EEE78591-FE22-11D0-8BEF-0060081841DE}\ToolboxBitmap32,,,"%49000%\XVoice.dll,1"
HKCR,CLSID\{EEE78591-FE22-11D0-8BEF-0060081841DE}\TypeLib,,,"{EEE78583-FE22-11D0-8BEF-0060081841DE}"
HKCR,CLSID\{EEE78591-FE22-11D0-8BEF-0060081841DE}\Version,,,"1.0"
HKCR,CLSID\{EEE78591-FE22-11D0-8BEF-0060081841DE}\VersionIndependendProgId,,,"DirectSS.DirectSS"
HKCR,CLSID\{EEE78591-FE22-11D0-8BEF-0060081841DE}\Control
HKCR,CLSID\{EEE78591-FE22-11D0-8BEF-0060081841DE}\Insertable
HKCR,CLSID\{EEE78591-FE22-11D0-8BEF-0060081841DE}\Programmable
HKCR,CLSID\{EEE78591-FE22-11D0-8BEF-0060081841DE}\MiscStatus
HKCR,CLSID\{EEE78591-FE22-11D0-8BEF-0060081841DE}\MiscStatus\1,,,"131473"
HKCR,TypeLib\{EEE78583-FE22-11D0-8BEF-0060081841DE}
HKCR,TypeLib\{EEE78583-FE22-11D0-8BEF-0060081841DE}\1.0,,,"Microsoft Direct Text-to-Speech"
HKCR,TypeLib\{EEE78583-FE22-11D0-8BEF-0060081841DE}\1.0\0\win32,,,"%49000%\XVoice.dll"
;Vcommand
HKCR,CLSID\{66523042-35FE-11D1-8C4D-0060081841DE},,,"VCommand Class"
HKCR,CLSID\{66523042-35FE-11D1-8C4D-0060081841DE}\InprocServer32,,,%49000%\Xcommand.dll
HKCR,CLSID\{66523042-35FE-11D1-8C4D-0060081841DE}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{66523042-35FE-11D1-8C4D-0060081841DE}\ProgId,,,"Vcommand.Vcommand.1"
HKCR,CLSID\{66523042-35FE-11D1-8C4D-0060081841DE}\ToolboxBitmap32,,,"%49000%\Xcommand.dll,1"
HKCR,CLSID\{66523042-35FE-11D1-8C4D-0060081841DE}\TypeLib,,,"{60462311-3373-11D1-8C43-0060081841DE}"
HKCR,CLSID\{66523042-35FE-11D1-8C4D-0060081841DE}\Version,,,"1.0"
HKCR,CLSID\{66523042-35FE-11D1-8C4D-0060081841DE}\VersionIndependendProgId,,,"Vcommand.Vcommand"
HKCR,CLSID\{66523042-35FE-11D1-8C4D-0060081841DE}\Control
HKCR,CLSID\{66523042-35FE-11D1-8C4D-0060081841DE}\Insertable
HKCR,CLSID\{66523042-35FE-11D1-8C4D-0060081841DE}\Programmable
HKCR,CLSID\{66523042-35FE-11D1-8C4D-0060081841DE}\MiscStatus
HKCR,CLSID\{66523042-35FE-11D1-8C4D-0060081841DE}\MiscStatus\1,,,"131473"
HKCR,TypeLib\{60462311-3373-11D1-8C43-0060081841DE}
HKCR,TypeLib\{60462311-3373-11D1-8C43-0060081841DE}\1.0,,,"Microsoft Voice Commands"
HKCR,TypeLib\{60462311-3373-11D1-8C43-0060081841DE}\1.0\0\win32,,,"%49000%\Xcommand.dll"
;Vdict
HKCR,CLSID\{582C2191-4016-11D1-8C55-0060081841DE},,,"VDict Class"
HKCR,CLSID\{582C2191-4016-11D1-8C55-0060081841DE}\InprocServer32,,,%49000%\Vdict.dll
HKCR,CLSID\{582C2191-4016-11D1-8C55-0060081841DE}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{582C2191-4016-11D1-8C55-0060081841DE}\ProgId,,,"Vdict.Vdict.1"
HKCR,CLSID\{582C2191-4016-11D1-8C55-0060081841DE}\ToolboxBitmap32,,,"%49000%\Vdict.dll,1"
HKCR,CLSID\{582C2191-4016-11D1-8C55-0060081841DE}\TypeLib,,,"{582C2183-4016-11D1-8C55-0060081841DE}"
HKCR,CLSID\{582C2191-4016-11D1-8C55-0060081841DE}\Version,,,"1.0"
HKCR,CLSID\{582C2191-4016-11D1-8C55-0060081841DE}\VersionIndependendProgId,,,"Vdict.Vdict"
HKCR,CLSID\{582C2191-4016-11D1-8C55-0060081841DE}\Control
HKCR,CLSID\{582C2191-4016-11D1-8C55-0060081841DE}\Insertable
HKCR,CLSID\{582C2191-4016-11D1-8C55-0060081841DE}\Programmable
HKCR,CLSID\{582C2191-4016-11D1-8C55-0060081841DE}\MiscStatus
HKCR,CLSID\{582C2191-4016-11D1-8C55-0060081841DE}\MiscStatus\1,,,"131473"
HKCR,TypeLib\{582C2183-4016-11D1-8C55-0060081841DE}
HKCR,TypeLib\{582C2183-4016-11D1-8C55-0060081841DE}\1.0,,,"Microsoft Voice Dictation"
HKCR,TypeLib\{582C2183-4016-11D1-8C55-0060081841DE}\1.0\0\win32,,,"%49000%\Vdict.dll"
;VText
HKCR,CLSID\{2398E32F-5C6E-11D1-8C65-0060081841DE},,,"TextToSpeech Class"
HKCR,CLSID\{2398E32F-5C6E-11D1-8C65-0060081841DE}\InprocServer32,,,%49000%\Vtext.dll
HKCR,CLSID\{2398E32F-5C6E-11D1-8C65-0060081841DE}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{2398E32F-5C6E-11D1-8C65-0060081841DE}\ProgId,,,"Vtext.Vtext.1"
HKCR,CLSID\{2398E32F-5C6E-11D1-8C65-0060081841DE}\ToolboxBitmap32,,,"%49000%\Vtext.dll,1"
HKCR,CLSID\{2398E32F-5C6E-11D1-8C65-0060081841DE}\TypeLib,,,"{2398E321-5C6E-11D1-8C65-0060081841DE}"
HKCR,CLSID\{2398E32F-5C6E-11D1-8C65-0060081841DE}\Version,,,"1.0"
HKCR,CLSID\{2398E32F-5C6E-11D1-8C65-0060081841DE}\VersionIndependendProgId,,,"Vtext.Vtext
HKCR,CLSID\{2398E32F-5C6E-11D1-8C65-0060081841DE}\Control
HKCR,CLSID\{2398E32F-5C6E-11D1-8C65-0060081841DE}\Insertable
HKCR,CLSID\{2398E32F-5C6E-11D1-8C65-0060081841DE}\Programmable
HKCR,CLSID\{2398E32F-5C6E-11D1-8C65-0060081841DE}\MiscStatus
HKCR,CLSID\{2398E32F-5C6E-11D1-8C65-0060081841DE}\MiscStatus\1,,,"131473"
HKCR,TypeLib\{2398E321-5C6E-11D1-8C65-0060081841DE}
HKCR,TypeLib\{2398E321-5C6E-11D1-8C65-0060081841DE}\1.0,,,"Microsoft Voice Text"
HKCR,TypeLib\{2398E321-5C6E-11D1-8C65-0060081841DE}\1.0\0\win32,,,"%49000%\Vtext.dll"
;Xtel
HKCR,CLSID\{FC9E740F-6058-11D1-8C66-0060081841DE},,,"Telephony Class"
HKCR,CLSID\{FC9E740F-6058-11D1-8C66-0060081841DE}\InprocServer32,,,%49000%\Xtel.dll
HKCR,CLSID\{FC9E740F-6058-11D1-8C66-0060081841DE}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{FC9E740F-6058-11D1-8C66-0060081841DE}\ProgId,,,"Xtel.XTel.1"
HKCR,CLSID\{FC9E740F-6058-11D1-8C66-0060081841DE}\ToolboxBitmap32,,,"%49000%\XTel.dll,1"
HKCR,CLSID\{FC9E740F-6058-11D1-8C66-0060081841DE}\TypeLib,,,"{FC9E7401-6058-11D1-8C66-0060081841DE}"
HKCR,CLSID\{FC9E740F-6058-11D1-8C66-0060081841DE}\Version,,,"1.0"
HKCR,CLSID\{FC9E740F-6058-11D1-8C66-0060081841DE}f\VersionIndependendProgId,,,"Xtel.Xtel"
HKCR,CLSID\{FC9E740F-6058-11D1-8C66-0060081841DE}\Control
HKCR,CLSID\{FC9E740F-6058-11D1-8C66-0060081841DE}\Insertable
HKCR,CLSID\{FC9E740F-6058-11D1-8C66-0060081841DE}\Programmable
HKCR,CLSID\{FC9E740F-6058-11D1-8C66-0060081841DE}\MiscStatus
HKCR,CLSID\{FC9E740F-6058-11D1-8C66-0060081841DE}\MiscStatus\1,,,"131473"
HKCR,TypeLib\{FC9E7401-6058-11D1-8C66-0060081841DE}
HKCR,TypeLib\{FC9E7401-6058-11D1-8C66-0060081841DE}\1.0,,,"Microsoft Telephony"
HKCR,TypeLib\{FC9E7401-6058-11D1-8C66-0060081841DE}\1.0\0\win32,,,"%49000%\Xtel.dll"
; Wrapper DLL
HKCR,CLSID\{0C7F3F20-8BAB-11d2-9432-00C04F8EF48F},,,"Downloadable Speech API"
HKCR,CLSID\{0C7F3F20-8BAB-11d2-9432-00C04F8EF48F}\Control,,,
HKCR,CLSID\{0C7F3F20-8BAB-11d2-9432-00C04F8EF48F}\InprocServer32,,,"%49000%\WrapSAPI.dll"
HKCR,CLSID\{0C7F3F20-8BAB-11d2-9432-00C04F8EF48F}\InprocServer32,ThreadingModel,,Apartment
HKCR,CLSID\{0C7F3F20-8BAB-11d2-9432-00C04F8EF48F}\MiscStatus,,,"0"
HKCR,CLSID\{0C7F3F20-8BAB-11d2-9432-00C04F8EF48F}\MiscStatus\1,,,"132497"
; Work around issues with Dragon NS
HKCR,CLSID\{05EB6C68-DBAB-11CD-B3CA-00AA0047BA4F}\InprocServer32
HKCR,CLSID\{090CD9AA-DA1A-11CD-B3CA-00AA0047BA4F}\InprocServer32
HKCR,CLSID\{090CD9A2-DA1A-11CD-B3CA-00AA0047BA4F}\InprocServer32
HKCR,CLSID\{2F26B9C0-DB31-11CD-B3CA-00AA0047BA4F}\InprocServer32
HKCR,CLSID\{090CD9AE-DA1A-11CD-B3CA-00AA0047BA4F}\InprocServer32
HKCR,CLSID\{090CD9AF-DA1A-11CD-B3CA-00AA0047BA4F}\InprocServer32
; cache information, to work around bugs encountered in older engines
HKLM,Software\Voice\TextToSpeech\Engine\{F063EDA0-8C65-11CF-8FC8-0020AF14F271},Dirty,1,1
HKLM,Software\Voice\TextToSpeech\Engine\{1B6BF820-9299-101B-8A19-265D428C60FF},Dirty,1,1
[DelRegSection]
HKCR,CLSID\{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,CLSID\{6D40D820-0BA7-11ce-A166-00AA004CD65C}
HKCR,CLSID\{F1DC95A0-0BA7-11ce-A166-00AA004CD65C}
HKCR,CLSID\{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,CLSID\{89F70C30-8636-11ce-B763-00AA004CD65C}
HKCR,CLSID\{D67C0280-C743-11cd-80E5-00AA003E4B50}
HKCR,CLSID\{CB96B400-C743-11cd-80E5-00AA003E4B50}
HKCR,CLSID\{E02D16C0-C743-11cd-80E5-00AA003E4B50}
HKCR,CLSID\{D24FE500-C743-11cd-80E5-00AA003E4B50}
HKCR,CLSID\{D4023720-E4B9-11cf-8D56-00A0C9034A7E}
HKCR,CLSID\{D4123720-E4B9-11cf-8D56-00A0C9034A7E}
HKCR,CLSID\{A26D7620-6FA0-11ce-A166-00AA004CD65C}
HKCR,CLSID\{FF2C7A52-78F9-11ce-B762-00AA004CD65C}
HKCR,CLSID\{35522CA0-67CE-11cf-9B8B-08005AFC3A41}
HKCR,CLSID\{554667BB-7213-11cf-B210-00AA00A215ED}
HKCR,CLSID\{B9F11A90-90E3-11d0-8D77-00A0C9034A7E}
HKCR,CLSID\{92655FB1-ADF9-11d1-BEB9-006008317CE8}
HKCR,CLSID\{32C35401-D04F-11d0-99B3-00AA004CD65C}
HKCR,CLSID\{B9F11A95-90E3-11d0-8D77-00A0C9034A7E}
HKCR,CLSID\{B9F11A96-90E3-11d0-8D77-00A0C9034A7E}
HKCR,CLSID\{D4523720-E4B9-11cf-8D56-00A0C9034A7E}
HKCR,CLSID\{D4623720-E4B9-11cf-8D56-00A0C9034A7E}
HKCR,CLSID\{B9F11A95-90E3-11d0-8D77-00A0C9034A7E}
HKCR,CLSID\{B9F11A96-90E3-11d0-8D77-00A0C9034A7E}
HKCR,CLSID\{70618F72-D1ED-11d0-8FAC-08002BE4E62A}
HKCR,CLSID\{EFD0E6BA-DB5F-11d0-8FAC-08002BE4E62A}
HKCR,CLSID\{B3613D9F-E26E-11d0-8FAC-08002BE4E62A}
HKCR,CLSID\{B3613DA0-E26E-11d0-8FAC-08002BE4E62A}
HKCR,CLSID\{2EC5A8A5-E65B-11d0-8FAC-08002BE4E62A}
HKCR,CLSID\{2EC5A8A6-E65B-11d0-8FAC-08002BE4E62A}
HKCR,CLSID\{F9D18BF8-E0ED-11d0-AB8B-08002BE4E3B7}
HKCR,CLSID\{D1352B68-E2B5-11d0-AB8B-08002BE4E3B7}
HKCR,CLSID\{61935832-FC85-11d0-8FAE-08002BE4E62A}
HKCR,Speech.VoiceCommand
HKCR,Speech.VoiceCommand.1
HKCR,TypeLib\{A26D7621-6FA0-11ce-A166-00AA004CD65C}
HKCR,Interface\{A26D7622-6FA0-11ce-A166-00AA004CD65C}
HKCR,Speech.VoiceText
HKCR,Speech.VoiceText.1
HKCR,TypeLib\{FF2C7A51-78F9-11ce-B762-00AA004CD65C}
HKCR,Interface\{FF2C7A50-78F9-11ce-B762-00AA004CD65C}
HKCR,Interface\{CCFD7A60-604D-101B-9926-00AA003CFC2C}
HKCR,Interface\{80B25CC0-5540-11b9-C000-5611722E1D15}
HKCR,Interface\{D3CC0820-604D-101B-9926-00AA003CFC2C}
HKCR,Interface\{E86F9540-DCA2-11CD-A166-00AA004CD65C}
HKCR,Interface\{DAC54F60-604D-101B-9926-00AA003CFC2C}
HKCR,Interface\{746141E0-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{E0DCC220-604D-101B-9926-00AA003CFC2C}
HKCR,Interface\{C63A2B30-5543-11b9-C000-5611722E1D15}
HKCR,Interface\{D981C420-6053-101B-9926-00AA003CFC2C}
HKCR,Interface\{AEB2A680-5544-11b9-C000-5611722E1D15}
HKCR,Interface\{E5F24680-6053-101B-9926-00AA003CFC2C}
HKCR,Interface\{FFF5DF80-5544-11b9-C000-5611722E1D15}
HKCR,Interface\{EE39B8A0-6053-101B-9926-00AA003CFC2C}
HKCR,Interface\{AA8FE260-5545-11b9-C000-5611722E1D15}
HKCR,Interface\{FD3A2430-E090-11cd-A166-00AA004CD65C}
HKCR,Interface\{D2C840E0-E092-11cd-A166-00AA004CD65C}
HKCR,Interface\{C4FE8740-E093-11cd-A166-00AA004CD65C}
HKCR,Interface\{E1B7A180-E093-11cd-A166-00AA004CD65C}
HKCR,Interface\{6A8D6140-E095-11cd-A166-00AA004CD65C}
HKCR,Interface\{8BE9CC30-E095-11cd-A166-00AA004CD65C}
HKCR,Interface\{D6469210-E095-11cd-A166-00AA004CD65C}
HKCR,Interface\{E8F6FA20-E095-11cd-A166-00AA004CD65C}
HKCR,Interface\{2F440FB4-CE01-11cf-B234-00AA00A215ED}
HKCR,Interface\{2F440FB8-CE01-11cf-B234-00AA00A215ED}
HKCR,Interface\{9B445332-E39F-11d1-BED7-006008317CE8}
HKCR,Interface\{be8f63a0-b915-11d1-b7bc-0060979841b4}
HKCR,Interface\{9B445333-E39F-11d1-BED7-006008317CE8}
HKCR,Interface\{9B445334-E39F-11d1-BED7-006008317CE8}
HKCR,Interface\{9B445335-E39F-11d1-BED7-006008317CE8}
HKCR,Interface\{9B445336-E39F-11d1-BED7-006008317CE8}
HKCR,Interface\{599F77E3-E42E-11d1-BED8-006008317CE8}
HKCR,Interface\{599F77E4-E42E-11d1-BED8-006008317CE8}
HKCR,Interface\{238004E1-F0C4-11d1-BED9-006008317CE8}
HKCR,Interface\{238004E2-F0C4-11d1-BED9-006008317CE8}
HKCR,Interface\{238004E3-F0C4-11d1-BED9-006008317CE8}
HKCR,Interface\{68A33AA0-44CD-101B-90A8-00AA003E4B50}
HKCR,Interface\{2F26B9C1-DB31-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{F106BFA0-C743-11CD-80E5-00AA003E4B50}
HKCR,Interface\{EFEEA350-CE5E-11CD-9D96-00AA002FC7C9}
HKCR,Interface\{090CD9B0-DA1A-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{B9BD3860-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{2F26B9C2-DB31-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{BCFB4C60-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{05EB6C60-DBAB-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{BFA9F1A0-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{05EB6C61-DBAB-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{C2835060-44DB-101B-90A8-00AA003E4B50}
HKCR,Interface\{05EB6C62-DBAB-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{E8C3E160-C743-11CD-80E5-00AA003E4B50}
HKCR,Interface\{05EB6C63-DBAB-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{ECC0B180-C743-11CD-80E5-00AA003E4B50}
HKCR,Interface\{05EB6C64-DBAB-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{090CD9A3-DA1A-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{05EB6C65-DBAB-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{090CD9A4-DA1A-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{090CD9A5-DA1A-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{05EB6C66-DBAB-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{090CD9A6-DA1A-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{aad74c30-4b02-11d1-b792-0060979841b4}
HKCR,Interface\{090CD9A7-DA1A-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{090CD9A8-DA1A-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{05EB6C67-DBAB-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{090CD9A9-DA1A-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{090CD9AA-DA1A-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{05EB6C68-DBAB-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{090CD9AB-DA1A-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{090CD9AC-DA1A-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{090CD9AD-DA1A-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{05EB6C69-DBAB-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{090CD9AE-DA1A-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{090CD9AF-DA1A-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{E97F05C0-81B3-11ce-B763-00AA004CD65C}
HKCR,Interface\{E97F05C1-81B3-11ce-B763-00AA004CD65C}
HKCR,Interface\{0B37F1E0-B8DE-11cf-B22E-00AA00A215ED}
HKCR,Interface\{090CD9A2-DA1A-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{2F26B9C0-DB31-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{D6E56341-B3EA-11d1-AFA5-0000F81E880D}
HKCR,Interface\{D6E56342-B3EA-11d1-AFA5-0000F81E880D}
HKCR,Interface\{1D59DED1-E367-11d1-BED7-006008317CE8}
HKCR,Interface\{1D59DED2-E367-11d1-BED7-006008317CE8}
HKCR,Interface\{9B445330-E39F-11d1-BED7-006008317CE8}
HKCR,Interface\{9B445331-E39F-11d1-BED7-006008317CE8}
HKCR,Interface\{05EB6C6A-DBAB-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{28016060-4A47-101B-931A-00AA0047BA4F}
HKCR,Interface\{0FD6E2A1-E77D-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{1287A280-4A47-101B-931A-00AA0047BA4F}
HKCR,Interface\{e4963d40-c743-11cd-80e5-00aa003e4b50}
HKCR,Interface\{05EB6C6B-DBAB-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{47F59D00-4A47-101B-931A-00AA0047BA4F}
HKCR,Interface\{05EB6C6D-DBAB-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{6B837B20-4A47-101B-931A-00AA0047BA4F}
HKCR,Interface\{05EB6C6E-DBAB-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{7AA42960-4A47-101B-931A-00AA0047BA4F}
HKCR,Interface\{05EB6C6F-DBAB-11CD-B3CA-00AA0047BA4F}
HKCR,Interface\{C0FA8F40-4A46-101B-931A-00AA0047BA4F}
HKCR,Interface\{599F77E2-E42E-11d1-BED8-006008317CE8}
HKCR,Interface\{599F77E1-E42E-11d1-BED8-006008317CE8}
HKCR,Interface\{F546B340-C743-11cd-80E5-00AA003E4B50}
HKCR,Interface\{BC06A220-C743-11cd-80E5-00AA003E4B50}
HKCR,Interface\{2EC34DA0-C743-11cd-80E5-00AA003E4B50}
HKCR,Interface\{C0BD9A80-C743-11cd-80E5-00AA003E4B50}
HKCR,Interface\{ACB08C00-C743-11cd-80E5-00AA003E4B50}
HKCR,Interface\{492FE490-51E7-11b9-C000-FED6CBA3B1A9}
HKCR,Interface\{FD7C2320-3D6D-11b9-C000-FED6CBA3B1A9}
HKCR,Interface\{88AD7DC3-67D5-11cf-9B8B-08005AFC3A41}
HKCR,Interface\{88AD7DC4-67D5-11cf-9B8B-08005AFC3A41}
HKCR,Interface\{6D62B3A0-6893-11cf-9B8B-08005AFC3A41}
HKCR,Interface\{6D62B3A1-6893-11cf-9B8B-08005AFC3A41}
HKCR,Interface\{88AD7DC5-67D5-11cf-9B8B-08005AFC3A41}
HKCR,Interface\{88AD7DC6-67D5-11cf-9B8B-08005AFC3A41}
HKCR,Interface\{88AD7DC7-67D5-11cf-9B8B-08005AFC3A41}
HKCR,Interface\{88AD7DC8-67D5-11cf-9B8B-08005AFC3A41}
HKCR,Interface\{5FEB8800-67D5-11cf-9B8B-08005AFC3A41}
HKCR,Interface\{88AD7DC0-67D5-11cf-9B8B-08005AFC3A41}
HKCR,Interface\{8953F1A0-7E80-11cf-8D15-00A0C9034A7E}
HKCR,Interface\{A02C2CA0-AE50-11cf-833A-00AA00A21A29}
HKCR,Interface\{A02C2CA1-AE50-11cf-833A-00AA00A21A29}
HKCR,Interface\{A02C2CA2-AE50-11cf-833A-00AA00A21A29}
HKCR,Interface\{A02C2CA3-AE50-11cf-833A-00AA00A21A29}
HKCR,Interface\{90A84EA0-6E51-11D0-9BC2-08005AFC3A41}
HKCR,Interface\{90A84EA1-6E51-11D0-9BC2-08005AFC3A41}
HKCR,Interface\{D4E3F8E0-6521-11d1-8C35-006097DF5D01}
HKCR,Interface\{D4E3F8E1-6521-11d1-8C35-006097DF5D01}
HKCR,Interface\{8763AFD1-7ADE-11d1-BEA7-006008317CE8}
HKCR,Interface\{8763AFD2-7ADE-11d1-BEA7-006008317CE8}
; wrapper dll
HKCR,CLSID\{0C7F3F20-8BAB-11d2-9432-00C04F8EF48F}
; registry entries created by components
HKCU,Software\Voice
HKLM,Software\Voice\VoiceCommands
HKLM,Software\Voice\VoiceDictation
HKCU,Software\Microsoft\SpeechAPI
HKLM,Software\Microsoft\SpeechAPI
; uninstall
HKLM,Software\Microsoft\Windows\CurrentVersion\Uninstall\SpeechAPI
HKLM,Software\Microsoft\SpchAPI
HKCR,CLSID\{53961A01-459B-11d1-BE77-006008317CE8}
HKLM,SOFTWARE\Microsoft\SpeechAPI\TelephonyControls,"Yes/No Control"
HKCR,CLSID\{53961A02-459B-11d1-BE77-006008317CE8}
HKLM,SOFTWARE\Microsoft\SpeechAPI\TelephonyControls,"Extension Control"
HKCR,CLSID\{53961A03-459B-11d1-BE77-006008317CE8}
HKLM,SOFTWARE\Microsoft\SpeechAPI\TelephonyControls,"Phone Number Control"
HKCR,CLSID\{53961A04-459B-11d1-BE77-006008317CE8}
HKLM,SOFTWARE\Microsoft\SpeechAPI\TelephonyControls,"Grammar Control"
HKCR,CLSID\{53961A05-459B-11d1-BE77-006008317CE8}
HKLM,SOFTWARE\Microsoft\SpeechAPI\TelephonyControls,"Date Control"
HKCR,CLSID\{53961A06-459B-11d1-BE77-006008317CE8}
HKLM,SOFTWARE\Microsoft\SpeechAPI\TelephonyControls,"Time Control"
HKCR,CLSID\{53961A07-459B-11d1-BE77-006008317CE8}
HKLM,SOFTWARE\Microsoft\SpeechAPI\TelephonyControls,"Record Control"
HKCR,CLSID\{53961A08-459B-11d1-BE77-006008317CE8}
HKLM,SOFTWARE\Microsoft\SpeechAPI\TelephonyControls,"Spelling Control"
HKCR,CLSID\{53961A09-459B-11d1-BE77-006008317CE8}
HKLM,SOFTWARE\Microsoft\SpeechAPI\TelephonyControls,"Name Control"
; uninstall ActiveX controls
HKCR,CLSID\{4E3D9D1F-0C63-11D1-8BFB-0060081841DE},,,"DirectSR Class"
HKCR,CLSID\{EEE78591-FE22-11D0-8BEF-0060081841DE},,,"DirectSS Class"
HKCR,CLSID\{66523042-35FE-11D1-8C4D-0060081841DE},,,"VCommand Class"
HKCR,CLSID\{582C2191-4016-11D1-8C55-0060081841DE},,,"VDict Class"
HKCR,CLSID\{2398E32F-5C6E-11D1-8C65-0060081841DE},,,"TextToSpeech Class"
HKCR,CLSID\{FC9E740F-6058-11D1-8C66-0060081841DE},,,"Telephony Class"
[BeginPromptSection]
Prompt=%BeginPrompt%
ButtonType=YESNO
Title=%AppName%
[EndPromptSection]
Prompt=%EndPrompt%
[Strings]
AppName="Microsoft Speech API 4.0"
BeginPrompt="Are you sure you want to remove the Speech API? It will prevent speech recognition and text-to-speech from working."
EndPrompt="Uninstall complete. You may wish to uninstall any text-to-speech and speech recognition engines since they will no longer work."
;we dont register the OCX by default because oleaut32.dll and olepro32.dll are not
;up to date on clean win 95 gold machines; they are if you have an activex server
;like office or IE however.
;[RegisterOCXSection]
;%49000%\xvoice.dll
Binary file not shown.
+6635
View File
File diff suppressed because it is too large Load Diff