Parakeet v Whisper h2h #26
No files matched your search
@@ -0,0 +1,14 @@
|
||||
# Fix: whisper.cpp (whisper-rs-sys) is configured by the cmake crate, which on
|
||||
# MSVC *without an explicit generator* overwrites CMAKE_C_FLAGS_RELEASE with
|
||||
# unoptimized flags (it also strips any -O*/O* flag from CFLAGS, so env
|
||||
# optimization flags can't survive). Result: ggml's CPU kernels compiled at
|
||||
# /Od — CPU-only transcription ran ~40x slower than real time (bench finding
|
||||
# W1, docs/benchmarks/2026-07-parakeet-vs-whisper.md). With a generator set,
|
||||
# cmake-rs skips that override (`if generator.is_none() && msvc` in
|
||||
# cmake-0.1.58) and CMake's default Release flags (/O2 /Ob2 /DNDEBUG) apply.
|
||||
# Ninja ships with VS Build Tools; builds already require vcvars64 (which puts
|
||||
# it on PATH). NDEBUG kept explicitly so C deps never build with asserts on.
|
||||
[env]
|
||||
CMAKE_GENERATOR = "Ninja"
|
||||
CFLAGS = "/DNDEBUG"
|
||||
CXXFLAGS = "/DNDEBUG"
|
||||
+4
-1
@@ -46,4 +46,7 @@ packaging/npu-runtime/*.zip
|
||||
# --features vulkan build (bundled into the installer); a redistributable blob,
|
||||
# not committed.
|
||||
src-tauri/vulkan-1.dll
|
||||
MEMORY.md
|
||||
MEMORY.md
|
||||
# ASR bench corpus (test_parakeet branch): LibriSpeech-derived WAVs + refs,
|
||||
# staged by scripts/bench/fetch-corpus.ps1 — audio never enters the repo.
|
||||
bench-corpus/
|
||||
@@ -0,0 +1,78 @@
|
||||
# WhispAssist v0.7.4
|
||||
|
||||
**Privacy-first, Windows-native meeting assistant — everything on-device, nothing leaves unless you say so.**
|
||||
|
||||
A small, focused performance release for **CPU transcription**. If WhispAssist runs the Whisper
|
||||
engine on your CPU — either because your machine has no usable GPU/NPU, or because you selected
|
||||
the CPU backend — this update takes it from far-slower-than-real-time to comfortably real-time.
|
||||
Machines on the NPU or GPU backends are unaffected in behavior and simply pick up a
|
||||
better-optimized build. Nothing here changes the privacy posture; there are no new downloads.
|
||||
|
||||
One universal installer (**MSI** and **NSIS**) covers every machine: **Vulkan** for all GPUs
|
||||
(NVIDIA/AMD/Intel), the Intel **NPU** (OpenVINO), a **DirectML** fallback, and **CPU**.
|
||||
|
||||
---
|
||||
|
||||
## ⚡ CPU transcription fixed (up to ~90× faster on hybrid Intel CPUs)
|
||||
|
||||
Whisper-on-CPU previously spawned one worker thread per logical CPU. On modern hybrid Intel
|
||||
processors (P-cores + E-cores + low-power E-cores) the workers synchronize in lock-step, so the
|
||||
two slow low-power cores stalled *every* step while the remaining threads burned CPU waiting —
|
||||
transcription ran ~20× slower than real time while looking like it was using the whole machine.
|
||||
|
||||
WhispAssist now caps Whisper's CPU decode at **4 threads** (the whisper.cpp upstream default).
|
||||
Measured on a Core Ultra 5 135U over a 4-minute test corpus, same accuracy:
|
||||
|
||||
| | before | after |
|
||||
|---|---|---|
|
||||
| Speed vs real time | 20× **slower** | **4.6× faster** (RTF 0.218) |
|
||||
| CPU cost per second of audio | 232.6 cpu-sec | 0.83 cpu-sec |
|
||||
|
||||
Live (streaming) transcription shares this code path and benefits equally. If you want to
|
||||
experiment, the `WA_WHISPER_THREADS` environment variable overrides the cap.
|
||||
|
||||
## 🔧 Native code now built fully optimized
|
||||
|
||||
A build-toolchain issue caused the bundled native libraries (including whisper.cpp's CPU
|
||||
kernels) to be compiled **without compiler optimization**. That's fixed; this release ships
|
||||
optimized native code across the board. (For CPU transcription the thread fix above is the
|
||||
dominant win; this one is belt-and-suspenders for everything else.)
|
||||
|
||||
---
|
||||
|
||||
## 📦 Install
|
||||
|
||||
**Requirements:** Windows 10 or 11 (x64). WhispAssist needs **WebView2** (preinstalled on Windows 11;
|
||||
the installer fetches it on Windows 10). Importing from a file/URL additionally needs **`ffmpeg`**
|
||||
(and **`yt-dlp`** for URLs) on your PATH — the Import dialog links to both.
|
||||
|
||||
1. Download **`WhispAssist_0.7.4_x64_en-US.msi`** (or the NSIS **`WhispAssist_0.7.4_x64-setup.exe`**).
|
||||
2. Run it and accept the UAC prompt. If SmartScreen appears, choose **More info → Run anyway**.
|
||||
3. Launch **WhispAssist** from the Start menu.
|
||||
|
||||
On first run WA picks the best transcription backend (**NPU → NVIDIA → AMD → Intel → CPU**). It runs
|
||||
without admin rights, does **not** add itself to startup unless you opt in, and keeps all data under
|
||||
`%LOCALAPPDATA%\WhispAssist`.
|
||||
|
||||
Deploying to many machines? See [`docs/enterprise-deployment.md`](docs/enterprise-deployment.md).
|
||||
|
||||
## 🔐 Checksums (SHA-256)
|
||||
|
||||
```
|
||||
5c4e6d6b23a4b404c6fa200b6491e74f143c3a886042dc3bef3c2861168ef17c WhispAssist_0.7.4_x64_en-US.msi
|
||||
eb2ececff06373e9cbb43ee6455c433c1b88785e9060b68ef7bed193191d9761 WhispAssist_0.7.4_x64-setup.exe
|
||||
```
|
||||
|
||||
Verify after download:
|
||||
|
||||
```powershell
|
||||
Get-FileHash .\WhispAssist_0.7.4_x64_en-US.msi -Algorithm SHA256
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Privacy, unchanged
|
||||
Everything optional is **off by default**. With nothing configured, WhispAssist makes **no content
|
||||
egress at all**. Recording is opt-in; sync/AI credentials live only in the OS credential store; the
|
||||
MCP server is loopback-only and adds no egress; the deployment file never carries secrets. The
|
||||
reachable-host allowlist is derived from your settings and enforced in the core.
|
||||
@@ -0,0 +1,4 @@
|
||||
contender,file,audio_secs,load_ms,wall_ms,cpu_ms,wer_errors,ref_words,hypothesis
|
||||
w2-vulkan-base,bank_deposits,61.85,324,1398,765,135,4,"Bank deposits are not securities and are not covered by the securities investor protection corporation. Funds used to purchase or sweep to a bank deposit are SIPC protected until deposited to a program bank at which time funds may be eligible for FDIC insurance. Customers are responsible for monitoring their total deposits at each program bank to determine the extent of available FDIC insurance. Refer to the bank deposit details section which appears later in this statement for information on the banks holding your deposits. If your account was established on the last business day of the month, your statement will not include a bank deposit detailed section. The interest rate below is the interest rate effective for cash balances and your FDIC insured bank deposit suite on the last day of the statement period."
|
||||
w4-npu-onnx,bank_deposits,61.85,5709,3396,2938,137,4,"Bank deposits are not securities and are not covered by the Securities Investor Protection Corporation. Funds used to purchase or sweep to a bank deposit or SIPC protected until deposited to a program bank at which time funds may be eligible for FDIC insurance. Customers are responsible for monitoring their total deposits at each program bank to determine the extent of available FDIC insurance. Refer to the Bank Deposit D-Tales section, which appears later in this statement for information on the banks holding your deposits. If your account was established on the last business day of the month, your statement will not include a Bank Deposit D-Tales section. The interest rate below is the interest rate effective for cash balances in your FDIC insured bank deposit suite on the last day of the state. period."
|
||||
p1-parakeet-t4,bank_deposits,61.85,5244,3570,14047,135,4," Bank deposits are not securities and are not covered by the Securities Investor Protection Corporation. Funds used to purchase or sweep to a bank deposit are SIPC protected until deposited to a program bank at which time funds may be eligible for FDIC insurance. Customers are responsible for monitoring their total deposits at each program bank to determine the extent of available FDIC insurance. Refer to the bank deposit details section, which appears later in this statement, for information on the banks holding your deposits. If your account was established on the last business day of the month, your statement will not include a bank deposit detail section. The interest rate below is the interest rate effective for cash balances in your FDIC insured bank deposit suite on the last day of the statement period."
|
||||
|
@@ -0,0 +1,31 @@
|
||||
contender,file,audio_secs,load_ms,wall_ms,cpu_ms,wer_errors,ref_words,hypothesis
|
||||
w1-cpu-base,1089-134686-0000,10.44,163,2606,8219,1,28,"He hoped there would be stew for dinner, turnips and carrots and bruised potatoes and fat mutton pieces to be ladled out in thick, peppered, flour-fatten sauce."
|
||||
w1-cpu-base,1089-134686-0001,3.27,163,2111,7469,1,8,"Stuff it into you, his belly counseled him."
|
||||
w1-cpu-base,1089-134686-0002,6.62,163,2067,7360,0,18,"After early nightfall the yellow lamps would light up here and there the squalid quarter of the brothels."
|
||||
w1-cpu-base,1089-134686-0003,2.68,163,1844,6999,0,7,"Hello Bertie, any good in your mind?"
|
||||
w1-cpu-base,1089-134686-0004,5.22,163,1941,7250,1,11,"Number 10. Fresh Nelly is waiting on you. Good night husband."
|
||||
w1-cpu-base,1089-134686-0005,9.63,163,1778,6719,0,22,"The music came nearer and he recalled the words, the words of Shelley's fragment upon the moon wandering companionless pale for weariness."
|
||||
w1-cpu-base,1089-134686-0006,10.55,163,1860,7000,2,24,"The dull light fell more faintly upon the page, where on another equation began to unfold itself slowly, and to spread abroad its widening tail."
|
||||
w1-cpu-base,1089-134686-0007,4.28,163,1659,6500,0,8,"A cold, lucid indifference reigned in his soul."
|
||||
w1-cpu-base,1089-134686-0008,6.73,163,1727,6594,1,15,"The chaos in which his order extinguished itself was a cold, indifferent knowledge of himself."
|
||||
w1-cpu-base,1089-134686-0009,10.57,163,1779,6890,0,27,"At most, by an alms given to a beggar whose blessing he fled from, he might hope wearily to win for himself some measure of actual grace."
|
||||
w1-cpu-base,1089-134686-0010,4.41,163,1673,6547,0,14,"""Well now, Ennis, I declare you have a head and so has my stick."""
|
||||
w1-cpu-base,1089-134686-0011,12.45,163,1835,7000,2,39,"On Saturday mornings when the so dallity met in the chapel to recite the little office, his place was a cushioned kneeling desk at the right of the altar from which he led his wing of boys through the responses."
|
||||
w1-cpu-base,1089-134686-0012,11.64,163,1713,6312,0,28,"Her eyes seemed to regard him with mild pity. Her holiness, a strange light glowing faintly upon her frail flesh, did not humiliate the sinner who approached her."
|
||||
w1-cpu-base,1089-134686-0013,7.92,163,1684,6423,1,25,"If ever he was impelled to cast sin from him and to repent, the impulse that moved him was the wish to be her night."
|
||||
w1-cpu-base,1089-134686-0014,2.23,163,1573,6155,0,8,"He tried to think how it could be."
|
||||
w1-cpu-base,1089-134686-0015,5.82,163,1615,6298,0,14,"but the dusk deepening in the schoolroom covered over his thoughts. The bell rang."
|
||||
w1-cpu-base,1089-134686-0016,3.54,163,1568,6125,1,10,"Then you can ask him questions on the Catechism Daedalus."
|
||||
w1-cpu-base,1089-134686-0017,8.87,163,1640,6359,0,24,"Stephen, leaning back and drawing idly on his scribbler, listened to the talk about him which Heron checked from time to time by saying,"
|
||||
w1-cpu-base,1089-134686-0018,15.72,163,1697,6641,0,41,"It was strange, too, that he found an arid pleasure in following up to the end the rigid lines of the doctrines of the church and penetrating into obscure silences only to hear and feel the more deeply his own condemnation."
|
||||
w1-cpu-base,1089-134686-0019,13.89,163,1713,6593,1,39,"The sentence of St. James, which says that he who offends against one commandment becomes guilty of all, had seemed to him first a swollen phrase, until he had begun to grope in the darkness of his own state."
|
||||
w1-cpu-base,1089-134686-0020,16.79,163,1806,6922,0,50,"If a man had stolen a pound in his youth and had used that pound to amass a huge fortune, how much was he obliged to give back? The pound he had stolen only, or the pound together with the compound interest accruing upon it, or all his huge fortune."
|
||||
w1-cpu-base,1089-134686-0021,6.55,163,1689,6656,1,17,"If a layman in giving baptism poor the water before saying the words is the child baptized."
|
||||
w1-cpu-base,1089-134686-0022,11.18,163,1651,6470,2,32,"How comes it that while the first beattitude promises the kingdom of heaven to the poor of heart, the second beattitude promises also to the meek that they shall possess the land?"
|
||||
w1-cpu-base,1089-134686-0023,13.28,163,1706,6734,0,36,"Why was the sacrament of the Eucharist instituted under the two species of bread and wine if Jesus Christ be present, body and blood, soul and divinity in the bread alone and in the wine alone?"
|
||||
w1-cpu-base,1089-134686-0024,11.65,163,1757,6829,0,30,"If the wine change into vinegar and the host crumble into corruption after they have been consecrated, is Jesus Christ still present under their species as God and as man?"
|
||||
w1-cpu-base,1089-134686-0025,6.61,163,1618,6280,0,18,"A gentle kick from the tall boy in the bench behind urged Stephen to ask a difficult question."
|
||||
w1-cpu-base,1089-134686-0026,4.01,163,1591,6110,0,13,"The rector did not ask for a catechism to hear the lesson from."
|
||||
w1-cpu-base,1089-134686-0027,2.71,163,1549,5937,0,9,"He clasped his hands on the desk and said,"
|
||||
w1-cpu-base,1089-134686-0028,7.83,163,1602,6204,2,18,"The retreat will begin on Wednesday afternoon in honor of St. Francis Xavier, whose feast day is Saturday."
|
||||
w1-cpu-base,1089-134686-0029,4.67,163,1601,6280,0,11,"On Friday, confession will be heard all the afternoon after beads."
|
||||
|
@@ -0,0 +1,31 @@
|
||||
contender,file,audio_secs,load_ms,wall_ms,cpu_ms,wer_errors,ref_words,hypothesis
|
||||
w1-cpu-base,1089-134686-0000,10.44,112,216077,2510125,1,28,"He hoped there would be stew for dinner, turnips and carrots and bruised potatoes and fat mutton pieces to be ladled out in thick, peppered, flour-fatten sauce."
|
||||
w1-cpu-base,1089-134686-0001,3.27,112,82717,961829,1,8,"Stuff it into you, his belly counseled him."
|
||||
w1-cpu-base,1089-134686-0002,6.62,112,148497,1736531,0,18,"After early nightfall the yellow lamps would light up here and there the squalid quarter of the brothels."
|
||||
w1-cpu-base,1089-134686-0003,2.68,112,77434,887500,0,7,"Hello Bertie, any good in your mind?"
|
||||
w1-cpu-base,1089-134686-0004,5.22,112,99168,1158844,1,11,"Number 10. Fresh Nelly is waiting on you. Good night husband."
|
||||
w1-cpu-base,1089-134686-0005,9.63,112,167320,1939858,0,22,"The music came nearer and he recalled the words, the words of Shelley's fragment upon the moon wandering companionless pale for weariness."
|
||||
w1-cpu-base,1089-134686-0006,10.55,112,175803,2025703,2,24,"The dull light fell more faintly upon the page, where on another equation began to unfold itself slowly, and to spread abroad its widening tail."
|
||||
w1-cpu-base,1089-134686-0007,4.28,112,81833,956001,0,8,"A cold, lucid indifference reigned in his soul."
|
||||
w1-cpu-base,1089-134686-0008,6.73,112,116962,1353344,1,15,"The chaos in which his order extinguished itself was a cold, indifferent knowledge of himself."
|
||||
w1-cpu-base,1089-134686-0009,10.57,112,194254,2274906,0,27,"At most, by an alms given to a beggar whose blessing he fled from, he might hope wearily to win for himself some measure of actual grace."
|
||||
w1-cpu-base,1089-134686-0010,4.41,112,116123,1357843,0,14,"""Well now, Ennis, I declare you have a head and so has my stick."""
|
||||
w1-cpu-base,1089-134686-0011,12.45,112,266344,3091765,2,39,"On Saturday mornings when the so dallity met in the chapel to recite the little office, his place was a cushioned kneeling desk at the right of the altar from which he led his wing of boys through the responses."
|
||||
w1-cpu-base,1089-134686-0012,11.64,112,216072,2501111,0,28,"Her eyes seemed to regard him with mild pity. Her holiness, a strange light glowing faintly upon her frail flesh, did not humiliate the sinner who approached her."
|
||||
w1-cpu-base,1089-134686-0013,7.92,112,169507,1978264,1,25,"If ever he was impelled to cast sin from him and to repent, the impulse that moved him was the wish to be her night."
|
||||
w1-cpu-base,1089-134686-0014,2.23,112,70139,820125,0,8,"He tried to think how it could be."
|
||||
w1-cpu-base,1089-134686-0015,5.82,112,120268,1383735,0,14,"but the dusk deepening in the schoolroom covered over his thoughts. The bell rang."
|
||||
w1-cpu-base,1089-134686-0016,3.54,112,108330,1241142,1,10,"Then you can ask him questions on the Catechism Daedalus."
|
||||
w1-cpu-base,1089-134686-0017,8.87,112,194063,2182906,0,24,"Stephen, leaning back and drawing idly on his scribbler, listened to the talk about him which Heron checked from time to time by saying,"
|
||||
w1-cpu-base,1089-134686-0018,15.72,112,305117,3388062,0,41,"It was strange, too, that he found an arid pleasure in following up to the end the rigid lines of the doctrines of the church and penetrating into obscure silences only to hear and feel the more deeply his own condemnation."
|
||||
w1-cpu-base,1089-134686-0019,13.89,112,280828,3258859,1,39,"The sentence of St. James, which says that he who offends against one commandment becomes guilty of all, had seemed to him first a swollen phrase, until he had begun to grope in the darkness of his own state."
|
||||
w1-cpu-base,1089-134686-0020,16.79,112,341186,3965438,0,50,"If a man had stolen a pound in his youth and had used that pound to amass a huge fortune, how much was he obliged to give back? The pound he had stolen only, or the pound together with the compound interest accruing upon it, or all his huge fortune."
|
||||
w1-cpu-base,1089-134686-0021,6.55,112,121607,1409156,1,17,"If a layman in giving baptism poor the water before saying the words is the child baptized."
|
||||
w1-cpu-base,1089-134686-0022,11.18,112,227716,2617797,2,32,"How comes it that while the first beattitude promises the kingdom of heaven to the poor of heart, the second beattitude promises also to the meek that they shall possess the land?"
|
||||
w1-cpu-base,1089-134686-0023,13.28,112,242491,2812172,0,36,"Why was the sacrament of the Eucharist instituted under the two species of bread and wine if Jesus Christ be present, body and blood, soul and divinity in the bread alone and in the wine alone?"
|
||||
w1-cpu-base,1089-134686-0024,11.65,112,195153,2262469,0,30,"If the wine change into vinegar and the host crumble into corruption after they have been consecrated, is Jesus Christ still present under their species as God and as man?"
|
||||
w1-cpu-base,1089-134686-0025,6.61,112,124006,1425344,0,18,"A gentle kick from the tall boy in the bench behind urged Stephen to ask a difficult question."
|
||||
w1-cpu-base,1089-134686-0026,4.01,112,111022,1272891,0,13,"The rector did not ask for a catechism to hear the lesson from."
|
||||
w1-cpu-base,1089-134686-0027,2.71,112,70567,820750,0,9,"He clasped his hands on the desk and said,"
|
||||
w1-cpu-base,1089-134686-0028,7.83,112,139096,1612905,2,18,"The retreat will begin on Wednesday afternoon in honor of St. Francis Xavier, whose feast day is Saturday."
|
||||
w1-cpu-base,1089-134686-0029,4.67,112,87495,1024704,0,11,"On Friday, confession will be heard all the afternoon after beads."
|
||||
|
@@ -0,0 +1,181 @@
|
||||
contender,file,audio_secs,load_ms,wall_ms,cpu_ms,wer_errors,ref_words,hypothesis
|
||||
w1-cpu-base,1089-134686-0000,10.44,188,235064,2608516,1,28,"He hoped there would be stew for dinner, turnips and carrots and bruised potatoes and fat mutton pieces to be ladled out in thick, peppered, flour-fatten sauce."
|
||||
w1-cpu-base,1089-134686-0001,3.27,188,82564,917655,1,8,"Stuff it into you, his belly counseled him."
|
||||
w1-cpu-base,1089-134686-0002,6.62,188,141113,1583500,0,18,"After early nightfall the yellow lamps would light up here and there the squalid quarter of the brothels."
|
||||
w1-cpu-base,1089-134686-0003,2.68,188,73065,818720,0,7,"Hello Bertie, any good in your mind?"
|
||||
w1-cpu-base,1089-134686-0004,5.22,188,109834,1145937,1,11,"Number 10. Fresh Nelly is waiting on you. Good night husband."
|
||||
w1-cpu-base,1089-134686-0005,9.63,188,191016,2067515,0,22,"The music came nearer and he recalled the words, the words of Shelley's fragment upon the moon wandering companionless pale for weariness."
|
||||
w1-cpu-base,1089-134686-0006,10.55,188,229757,2240907,2,24,"The dull light fell more faintly upon the page, where on another equation began to unfold itself slowly, and to spread abroad its widening tail."
|
||||
w1-cpu-base,1089-134686-0007,4.28,188,90484,890719,0,8,"A cold, lucid indifference reigned in his soul."
|
||||
w1-cpu-base,1089-134686-0008,6.73,188,149468,1484047,1,15,"The chaos in which his order extinguished itself was a cold, indifferent knowledge of himself."
|
||||
w1-cpu-base,1089-134686-0009,10.57,188,245502,2490203,0,27,"At most, by an alms given to a beggar whose blessing he fled from, he might hope wearily to win for himself some measure of actual grace."
|
||||
w1-cpu-base,1089-134686-0010,4.41,188,138481,1458718,0,14,"""Well now, Ennis, I declare you have a head and so has my stick."""
|
||||
w1-cpu-base,1089-134686-0011,12.45,188,297210,3179094,2,39,"On Saturday mornings when the so dallity met in the chapel to recite the little office, his place was a cushioned kneeling desk at the right of the altar from which he led his wing of boys through the responses."
|
||||
w1-cpu-base,1089-134686-0012,11.64,188,213355,2401078,0,28,"Her eyes seemed to regard him with mild pity. Her holiness, a strange light glowing faintly upon her frail flesh, did not humiliate the sinner who approached her."
|
||||
w1-cpu-base,1089-134686-0013,7.92,188,178175,2032875,1,25,"If ever he was impelled to cast sin from him and to repent, the impulse that moved him was the wish to be her night."
|
||||
w1-cpu-base,1089-134686-0014,2.23,188,66047,748750,0,8,"He tried to think how it could be."
|
||||
w1-cpu-base,1089-134686-0015,5.82,188,110044,1269406,0,14,"but the dusk deepening in the schoolroom covered over his thoughts. The bell rang."
|
||||
w1-cpu-base,1089-134686-0016,3.54,188,88080,1015922,1,10,"Then you can ask him questions on the Catechism Daedalus."
|
||||
w1-cpu-base,1089-134686-0017,8.87,188,195530,2211422,0,24,"Stephen, leaning back and drawing idly on his scribbler, listened to the talk about him which Heron checked from time to time by saying,"
|
||||
w1-cpu-base,1089-134686-0018,15.72,188,264086,3047875,0,41,"It was strange, too, that he found an arid pleasure in following up to the end the rigid lines of the doctrines of the church and penetrating into obscure silences only to hear and feel the more deeply his own condemnation."
|
||||
w1-cpu-base,1089-134686-0019,13.89,188,253612,2945906,1,39,"The sentence of St. James, which says that he who offends against one commandment becomes guilty of all, had seemed to him first a swollen phrase, until he had begun to grope in the darkness of his own state."
|
||||
w1-cpu-base,1089-134686-0020,16.79,188,329473,3803813,0,50,"If a man had stolen a pound in his youth and had used that pound to amass a huge fortune, how much was he obliged to give back? The pound he had stolen only, or the pound together with the compound interest accruing upon it, or all his huge fortune."
|
||||
w1-cpu-base,1089-134686-0021,6.55,188,103520,1196969,1,17,"If a layman in giving baptism poor the water before saying the words is the child baptized."
|
||||
w1-cpu-base,1089-134686-0022,11.18,188,225421,2617859,2,32,"How comes it that while the first beattitude promises the kingdom of heaven to the poor of heart, the second beattitude promises also to the meek that they shall possess the land?"
|
||||
w1-cpu-base,1089-134686-0023,13.28,188,239276,2776860,0,36,"Why was the sacrament of the Eucharist instituted under the two species of bread and wine if Jesus Christ be present, body and blood, soul and divinity in the bread alone and in the wine alone?"
|
||||
w1-cpu-base,1089-134686-0024,11.65,188,185962,2162656,0,30,"If the wine change into vinegar and the host crumble into corruption after they have been consecrated, is Jesus Christ still present under their species as God and as man?"
|
||||
w1-cpu-base,1089-134686-0025,6.61,188,113562,1311750,0,18,"A gentle kick from the tall boy in the bench behind urged Stephen to ask a difficult question."
|
||||
w1-cpu-base,1089-134686-0026,4.01,188,102779,1173296,0,13,"The rector did not ask for a catechism to hear the lesson from."
|
||||
w1-cpu-base,1089-134686-0027,2.71,188,69835,812876,0,9,"He clasped his hands on the desk and said,"
|
||||
w1-cpu-base,1089-134686-0028,7.83,188,129944,1503437,2,18,"The retreat will begin on Wednesday afternoon in honor of St. Francis Xavier, whose feast day is Saturday."
|
||||
w1-cpu-base,1089-134686-0029,4.67,188,86115,1006610,0,11,"On Friday, confession will be heard all the afternoon after beads."
|
||||
w2-vulkan-base,1089-134686-0000,10.44,248,1388,1375,2,28,"He hoped there would be stew for dinner, turnips and carrots and bruised potatoes and fat mutton pieces to be ladled out in thick, peppered flower-faton sauce."
|
||||
w2-vulkan-base,1089-134686-0001,3.27,248,491,172,1,8,"Stuff it into you, his belly counseled him."
|
||||
w2-vulkan-base,1089-134686-0002,6.62,248,771,297,0,18,"After early nightfall the yellow lamps would light up here and there the squalid quarter of the brothels."
|
||||
w2-vulkan-base,1089-134686-0003,2.68,248,546,140,0,7,"Hello Bertie, any good in your mind?"
|
||||
w2-vulkan-base,1089-134686-0004,5.22,248,371,219,1,11,"Number 10. Fresh Nelly is waiting on you. Good night husband."
|
||||
w2-vulkan-base,1089-134686-0005,9.63,248,535,375,0,22,"The music came nearer and he recalled the words, the words of Shelley's fragment upon the moon wandering companionless pale for weariness."
|
||||
w2-vulkan-base,1089-134686-0006,10.55,248,316,141,2,24,"The dull light fell more faintly upon the page, where on another equation began to unfold itself slowly, and to spread abroad its widening tail."
|
||||
w2-vulkan-base,1089-134686-0007,4.28,248,261,125,0,8,"A cold, lucid indifference reigned in his soul."
|
||||
w2-vulkan-base,1089-134686-0008,6.73,248,423,202,1,15,"The chaos in which his order extinguished itself was a cold, indifferent knowledge of himself."
|
||||
w2-vulkan-base,1089-134686-0009,10.57,248,525,219,0,27,"At most, by an alms given to a beggar whose blessing he fled from, he might hope wearily to win for himself some measure of actual grace."
|
||||
w2-vulkan-base,1089-134686-0010,4.41,248,268,78,0,14,"""Well now, Ennis, I declare you have a head and so has my stick."""
|
||||
w2-vulkan-base,1089-134686-0011,12.45,248,390,234,2,39,"On Saturday mornings when the so-dality met in the chapel to recite the little office, his place was a cushioned kneeling desk at the right of the altar from which he led his wing of boys through the responses."
|
||||
w2-vulkan-base,1089-134686-0012,11.64,248,761,375,0,28,"Her eyes seemed to regard him with mild pity. Her holiness, a strange light glowing faintly upon her frail flesh, did not humiliate the sinner who approached her."
|
||||
w2-vulkan-base,1089-134686-0013,7.92,248,771,344,1,25,"If ever he was impelled to cast sin from him and to repent, the impulse that moved him was the wish to be her night."
|
||||
w2-vulkan-base,1089-134686-0014,2.23,248,377,126,0,8,"He tried to think how it could be."
|
||||
w2-vulkan-base,1089-134686-0015,5.82,248,419,108,0,14,"but the dusk deepening in the schoolroom covered over his thoughts. The bell rang."
|
||||
w2-vulkan-base,1089-134686-0016,3.54,248,252,78,1,10,"Then you can ask him questions on the Catechism Daedalus."
|
||||
w2-vulkan-base,1089-134686-0017,8.87,248,320,157,0,24,"Stephen, leaning back and drawing idly on his scribbler, listened to the talk about him which Heron checked from time to time by saying,"
|
||||
w2-vulkan-base,1089-134686-0018,15.72,248,454,157,0,41,"It was strange, too, that he found an arid pleasure in following up to the end the rigid lines of the doctrines of the church and penetrating into obscure silences only to hear and feel the more deeply his own condemnation."
|
||||
w2-vulkan-base,1089-134686-0019,13.89,248,756,468,1,39,"The sentence of St. James, which says that he who offends against one commandment becomes guilty of all, had seemed to him first a swollen phrase, until he had begun to grope in the darkness of his own state."
|
||||
w2-vulkan-base,1089-134686-0020,16.79,248,540,172,0,50,"If a man had stolen a pound in his youth and had used that pound to amass a huge fortune, how much was he obliged to give back? The pound he had stolen only, or the pound together with the compound interest accruing upon it, or all his huge fortune."
|
||||
w2-vulkan-base,1089-134686-0021,6.55,248,664,234,1,17,"If a layman in giving baptism poor the water before saying the words is the child baptized."
|
||||
w2-vulkan-base,1089-134686-0022,11.18,248,926,391,2,32,"How comes it that while the first beattitude promises the kingdom of heaven to the poor of heart, the second beattitude promises also to the meek that they shall possess the land?"
|
||||
w2-vulkan-base,1089-134686-0023,13.28,248,849,344,0,36,"Why was the sacrament of the Eucharist instituted under the two species of bread and wine if Jesus Christ be present, body and blood, soul and divinity in the bread alone and in the wine alone?"
|
||||
w2-vulkan-base,1089-134686-0024,11.65,248,883,327,0,30,"If the wine change into vinegar and the host crumble into corruption after they have been consecrated, is Jesus Christ still present under their species as God and as man?"
|
||||
w2-vulkan-base,1089-134686-0025,6.61,248,629,234,0,18,"A gentle kick from the tall boy in the bench behind urged Stephen to ask a difficult question."
|
||||
w2-vulkan-base,1089-134686-0026,4.01,248,649,236,0,13,"The rector did not ask for a catechism to hear the lesson from."
|
||||
w2-vulkan-base,1089-134686-0027,2.71,248,603,186,0,9,"He clasped his hands on the desk and said,"
|
||||
w2-vulkan-base,1089-134686-0028,7.83,248,590,204,2,18,"The retreat will begin on Wednesday afternoon in honor of St. Francis Xavier, whose feast day is Saturday."
|
||||
w2-vulkan-base,1089-134686-0029,4.67,248,553,172,0,11,"On Friday, confession will be heard all the afternoon after beads."
|
||||
w3-vulkan-medium,1089-134686-0000,10.44,724,5211,2187,0,28,"He hoped there would be stew for dinner, turnips and carrots and bruised potatoes and fat mutton pieces to be ladled out in thick peppered flour-fattened sauce."
|
||||
w3-vulkan-medium,1089-134686-0001,3.27,724,2691,625,1,8,"""Stuff it into you,"" his belly counseled him."
|
||||
w3-vulkan-medium,1089-134686-0002,6.62,724,3736,813,0,18,"After early nightfall the yellow lamps would light up here and there the squalid quarter of the brothels."
|
||||
w3-vulkan-medium,1089-134686-0003,2.68,724,1895,484,0,7,"Hello Bertie, any good in your mind?"
|
||||
w3-vulkan-medium,1089-134686-0004,5.22,724,2074,578,1,11,"Number ten! Fresh Nellie is waiting on you. Good night, husband."
|
||||
w3-vulkan-medium,1089-134686-0005,9.63,724,2304,656,0,22,"The music came nearer and he recalled the words, the words of Shelley's fragment upon the moon wandering companionless, pale for weariness."
|
||||
w3-vulkan-medium,1089-134686-0006,10.55,724,2267,641,0,24,"The dull light fell more faintly upon the page whereon another equation began to unfold itself slowly and to spread abroad its widening tail."
|
||||
w3-vulkan-medium,1089-134686-0007,4.28,724,1917,500,0,8,"A cold lucid indifference reigned in his soul."
|
||||
w3-vulkan-medium,1089-134686-0008,6.73,724,2074,516,1,15,"The chaos in which his ardor extinguished itself was a cold indifferent knowledge of himself."
|
||||
w3-vulkan-medium,1089-134686-0009,10.57,724,2433,640,0,27,"At most, by an alms given to a beggar whose blessing he fled from, he might hope wearily to win for himself some measure of actual grace."
|
||||
w3-vulkan-medium,1089-134686-0010,4.41,724,2078,594,0,14,"""Well now, Ennis, I declare you have a head and so has my stick."""
|
||||
w3-vulkan-medium,1089-134686-0011,12.45,724,2687,735,0,39,"On Saturday mornings when the Sodality met in the chapel to recite the little office, his place was a cushioned kneeling desk at the right of the altar from which he led his wing of boys through the responses."
|
||||
w3-vulkan-medium,1089-134686-0012,11.64,724,2495,718,0,28,"Her eyes seemed to regard him with mild pity; her holiness, a strange light glowing faintly upon her frail flesh, did not humiliate the sinner who approached her."
|
||||
w3-vulkan-medium,1089-134686-0013,7.92,724,2318,673,0,25,"If ever he was impelled to cast sin from him and to repent, the impulse that moved him was the wish to be her knight."
|
||||
w3-vulkan-medium,1089-134686-0014,2.23,724,1847,453,0,8,"He tried to think how it could be."
|
||||
w3-vulkan-medium,1089-134686-0015,5.82,724,2144,468,0,14,"but the dusk, deepening in the schoolroom, covered over his thoughts. The bell rang."
|
||||
w3-vulkan-medium,1089-134686-0016,3.54,724,2009,657,1,10,"Then you can ask him questions on the catechism, Daedalus."
|
||||
w3-vulkan-medium,1089-134686-0017,8.87,724,2558,874,7,24,"Stephen, leaning back and drawing idly on his scribbler, listened to the talk about him which Harren checked from time to time by saying, ""I'm not going to do it."""
|
||||
w3-vulkan-medium,1089-134686-0018,15.72,724,2722,876,0,41,"It was strange, too, that he found an arid pleasure in following up to the end the rigid lines of the doctrines of the Church and penetrating into obscure silences only to hear and feel the more deeply his own condemnation."
|
||||
w3-vulkan-medium,1089-134686-0019,13.89,724,2754,735,1,39,"The sentence of St. James, which says that he who offends against one commandment becomes guilty of all, had seemed to him first a swollen phrase, until he had begun to grope in the darkness of his own state."
|
||||
w3-vulkan-medium,1089-134686-0020,16.79,724,3047,1265,0,50,"If a man had stolen a pound in his youth, and had used that pound to amass a huge fortune, how much was he obliged to give back? The pound he had stolen only, or the pound together with the compound interest accruing upon it, or all his huge fortune?"
|
||||
w3-vulkan-medium,1089-134686-0021,6.55,724,2168,547,0,17,"If a layman, in giving baptism, pour the water before saying the words, ""Is the child baptized?"""
|
||||
w3-vulkan-medium,1089-134686-0022,11.18,724,2522,687,0,32,"How comes it that while the first beatitude promises the kingdom of heaven to the poor of heart, the second beatitude promises also to the meek that they shall possess the land?"
|
||||
w3-vulkan-medium,1089-134686-0023,13.28,724,2674,812,0,36,"""Why was the sacrament of the Eucharist instituted under the two species of bread and wine if Jesus Christ be present body and blood, soul and divinity, in the bread alone and in the wine alone?"""
|
||||
w3-vulkan-medium,1089-134686-0024,11.65,724,2397,735,0,30,"If the wine change into vinegar and the host crumble into corruption after they have been consecrated, is Jesus Christ still present under their species as God and as man?"
|
||||
w3-vulkan-medium,1089-134686-0025,6.61,724,2080,578,0,18,"A gentle kick from the tall boy in the bench behind urged Stephen to ask a difficult question."
|
||||
w3-vulkan-medium,1089-134686-0026,4.01,724,2033,578,0,13,"The rector did not ask for a catechism to hear the lesson from."
|
||||
w3-vulkan-medium,1089-134686-0027,2.71,724,2145,515,7,9,"He clasped his hands on the desk and said, ""I'm not going to go to bed."""
|
||||
w3-vulkan-medium,1089-134686-0028,7.83,724,2140,516,2,18,"The retreat will begin on Wednesday afternoon in honor of St. Francis Xavier whose feast day is Saturday."
|
||||
w3-vulkan-medium,1089-134686-0029,4.67,724,1954,672,0,11,"On Friday, confession will be heard all the afternoon after beads."
|
||||
w4-npu-onnx,1089-134686-0000,10.44,4723,975,1062,2,28,"He hoped there would be stew for dinner, turnips and carrots and bruised potatoes and fat mutton pieces to be ladled out in thick, peppered flower-faten sauce."
|
||||
w4-npu-onnx,1089-134686-0001,3.27,4723,286,189,3,8,"Stuffered into you, his belly counseled him."
|
||||
w4-npu-onnx,1089-134686-0002,6.62,4723,409,328,0,18,"After early nightfall the yellow lamps would light up here and there the squalid quarter of the brothels."
|
||||
w4-npu-onnx,1089-134686-0003,2.68,4723,262,172,0,7,"Hello Bertie, any good in your mind?"
|
||||
w4-npu-onnx,1089-134686-0004,5.22,4723,356,265,1,11,"Number 10. Fresh Nelly is waiting on you. Good night, husband."
|
||||
w4-npu-onnx,1089-134686-0005,9.63,4723,475,422,0,22,"The music came nearer, and he recalled the words, the words of Shelley's fragment upon the moon wandering companionless, pale for weariness."
|
||||
w4-npu-onnx,1089-134686-0006,10.55,4723,471,390,2,24,"The dull light fell more faintly upon the page, where on another equation began to unfold itself slowly, and to spread abroad its widening tail."
|
||||
w4-npu-onnx,1089-134686-0007,4.28,4723,261,188,0,8,"A cold, lucid indifference reigned in his soul."
|
||||
w4-npu-onnx,1089-134686-0008,6.73,4723,354,297,1,15,"The chaos in which his order extinguished itself was a cold, indifferent knowledge of himself."
|
||||
w4-npu-onnx,1089-134686-0009,10.57,4723,524,469,0,27,"At most, by an alms given to a beggar whose blessing he fled from, he might hope wearily to win for himself some measure of actual grace."
|
||||
w4-npu-onnx,1089-134686-0010,4.41,4723,372,296,0,14,"""Well now, Ennis, I declare you have a head, and so has my stick."""
|
||||
w4-npu-onnx,1089-134686-0011,12.45,4723,682,626,2,39,"On Saturday mornings, when the so-dality met in the chapel to recite the little office, his place was a cushioned kneeling desk at the right of the altar from which he led his wing of boys through the responses."
|
||||
w4-npu-onnx,1089-134686-0012,11.64,4723,558,468,0,28,"Her eyes seemed to regard him with mild pity. Her holiness, a strange light glowing faintly upon her frail flesh, did not humiliate the sinner who approached her."
|
||||
w4-npu-onnx,1089-134686-0013,7.92,4723,461,376,1,25,"If ever he was impelled to cast sin from him and to repent, the impulse that moved him was the wish to be her night."
|
||||
w4-npu-onnx,1089-134686-0014,2.23,4723,242,156,0,8,"He tried to think how it could be."
|
||||
w4-npu-onnx,1089-134686-0015,5.82,4723,339,282,0,14,"but the dusk deepening in the schoolroom covered over his thoughts. The bell rang."
|
||||
w4-npu-onnx,1089-134686-0016,3.54,4723,338,249,1,10,"Then you can ask him questions on the Catechism Daedalus."
|
||||
w4-npu-onnx,1089-134686-0017,8.87,4723,491,438,0,24,"Stephen, leaning back and drawing idly on his scribbler, listened to the talk about him which Heron checked from time to time by saying,"
|
||||
w4-npu-onnx,1089-134686-0018,15.72,4723,717,624,0,41,"It was strange, too, that he found an arid pleasure in following up to the end the rigid lines of the doctrines of the church and penetrating into obscure silences only to hear and feel the more deeply his own condemnation."
|
||||
w4-npu-onnx,1089-134686-0019,13.89,4723,711,626,1,39,"The sentence of St. James, which says that he who offends against one commandment becomes guilty of all, had seemed to him first a swollen phrase, until he had begun to grope in the darkness of his own state."
|
||||
w4-npu-onnx,1089-134686-0020,16.79,4723,869,796,1,50,"If a man had stolen a pound in his youth, and had used that pound to amass a huge fortune, how much was he obliged to give back? The pound he had stolen only, were the pound together with the compound interest accruing upon it, or all his huge fortune."
|
||||
w4-npu-onnx,1089-134686-0021,6.55,4723,368,281,1,17,"If a layman in giving baptism poor the water before saying the words is the child baptized,"
|
||||
w4-npu-onnx,1089-134686-0022,11.18,4723,593,531,2,32,"How comes it that while the first beattitude promises the kingdom of heaven to the poor of heart, the second beattitude promises also to the meek that they shall possess the land?"
|
||||
w4-npu-onnx,1089-134686-0023,13.28,4723,636,547,0,36,"Why was the sacrament of the Eucharist instituted under the two species of bread and wine if Jesus Christ be present, body and blood, soul and divinity in the bread alone and in the wine alone?"
|
||||
w4-npu-onnx,1089-134686-0024,11.65,4723,567,469,0,30,"If the wine change into vinegar and the host crumble into corruption after they have been consecrated, is Jesus Christ still present under their species as God and as man?"
|
||||
w4-npu-onnx,1089-134686-0025,6.61,4723,371,312,0,18,"A gentle kick from the tall boy in the bench behind urged Stephen to ask a difficult question."
|
||||
w4-npu-onnx,1089-134686-0026,4.01,4723,338,266,0,13,"The rector did not ask for a catechism to hear the lesson from."
|
||||
w4-npu-onnx,1089-134686-0027,2.71,4723,269,203,0,9,"He clasped his hands on the desk and said,"
|
||||
w4-npu-onnx,1089-134686-0028,7.83,4723,371,298,2,18,"The retreat will begin on Wednesday afternoon in honor of St. Francis Xavier whose feast day is Saturday."
|
||||
w4-npu-onnx,1089-134686-0029,4.67,4723,296,233,0,11,"On Friday, confession will be heard all the afternoon after beads."
|
||||
p1-parakeet-t8,1089-134686-0000,10.44,4576,494,4234,0,28," He hoped there would be stew for dinner turnips and carrots and bruised potatoes and fat mutton pieces to be ladled out in thick, peppered, flour fattened sauce."
|
||||
p1-parakeet-t8,1089-134686-0001,3.27,4576,185,1719,0,8," Stuff it into you, his belly counselled him."
|
||||
p1-parakeet-t8,1089-134686-0002,6.62,4576,332,2797,0,18," After early nightfall the yellow lamps would light up, here and there, the squalid quarter of the brothels."
|
||||
p1-parakeet-t8,1089-134686-0003,2.68,4576,164,1344,0,7," Hello, Bertie. Any good in your mind?"
|
||||
p1-parakeet-t8,1089-134686-0004,5.22,4576,229,1844,0,11," Number ten Fresh Nelly is waiting on you. Good night, husband."
|
||||
p1-parakeet-t8,1089-134686-0005,9.63,4576,379,3172,0,22," The music came nearer and he recalled the words the words of Shelley's fragment upon the moon wandering companionless, pale for weariness."
|
||||
p1-parakeet-t8,1089-134686-0006,10.55,4576,401,3499,0,24," The dull light fell more faintly upon the page, whereon another equation began to unfold itself slowly and to spread abroad its widening tail."
|
||||
p1-parakeet-t8,1089-134686-0007,4.28,4576,265,2454,0,8," A cold, lucid indifference reigned in his soul."
|
||||
p1-parakeet-t8,1089-134686-0008,6.73,4576,336,2875,0,15," The chaos in which his ardour extinguished itself was a cold, indifferent knowledge of himself,"
|
||||
p1-parakeet-t8,1089-134686-0009,10.57,4576,431,3578,0,27," At most, by an alms given to a beggar whose blessing he fled from, he might hope wearily to win for himself some measure of actual grace."
|
||||
p1-parakeet-t8,1089-134686-0010,4.41,4576,309,2891,0,14," Well now, Ennis, I declare you have a head, and so has my stick"
|
||||
p1-parakeet-t8,1089-134686-0011,12.45,4576,599,5406,0,39," On Saturday mornings when the sodality met in the chapel to recite the little office, his place was a cushioned kneeling desk at the right of the altar from which he led his wing of boys through the responses."
|
||||
p1-parakeet-t8,1089-134686-0012,11.64,4576,512,4172,0,28," Her eyes seemed to regard him with mild pity her holiness, a strange light glowing faintly upon her frail flesh did not humiliate the sinner who approached her."
|
||||
p1-parakeet-t8,1089-134686-0013,7.92,4576,318,2671,0,25," If ever he was impelled to cast sin from him and to repent, the impulse that moved him was the wish to be her knight."
|
||||
p1-parakeet-t8,1089-134686-0014,2.23,4576,112,860,0,8," He tried to think how it could be"
|
||||
p1-parakeet-t8,1089-134686-0015,5.82,4576,268,2250,0,14," but the dusk, deepening in the schoolroom, covered over his thoughts. The bell rang"
|
||||
p1-parakeet-t8,1089-134686-0016,3.54,4576,223,2015,1,10," Then you can ask him questions on the Catechism, Daedalus."
|
||||
p1-parakeet-t8,1089-134686-0017,8.87,4576,317,2562,0,24," Stephen leaning back and drawing idly on his scribbler, listened to the talk about him, which Heron checked from time to time by saying"
|
||||
p1-parakeet-t8,1089-134686-0018,15.72,4576,738,6234,0,41," It was strange, too, that he found an arid pleasure in following up to the end the rigid lines of the doctrines of the Church, and penetrating into obscure silences only to hear and feel the more deeply his own condemnation."
|
||||
p1-parakeet-t8,1089-134686-0019,13.89,4576,705,5515,0,39," The sentence of Saint James, which says that he who offends against one commandment becomes guilty of all, had seemed to him first a swollen phrase, until he had begun to grope in the darkness of his own state."
|
||||
p1-parakeet-t8,1089-134686-0020,16.79,4576,764,6156,0,50," If a man had stolen a pound in his youth, and had used that pound to amass a huge fortune, how much was he obliged to give back the pound he had stolen only, or the pound together with the compound interest accruing upon it, or all his huge fortune?"
|
||||
p1-parakeet-t8,1089-134686-0021,6.55,4576,308,2437,0,17," If a layman, in giving baptism, pour the water before saying the words, is the child baptized?"
|
||||
p1-parakeet-t8,1089-134686-0022,11.18,4576,566,4797,0,32," How comes it that while the first Beatitude promises the kingdom of heaven to the poor of heart, the second Beatitude promises also to the meek that they shall possess the land?"
|
||||
p1-parakeet-t8,1089-134686-0023,13.28,4576,567,4922,0,36," Why was the sacrament of the Eucharist instituted under the two species of bread and wine, if Jesus Christ be present body and blood, soul and divinity, in the bread alone, and in the wine alone?"
|
||||
p1-parakeet-t8,1089-134686-0024,11.65,4576,458,3719,0,30," If the wine change into vinegar, and the host crumble into corruption, after they have been consecrated, is Jesus Christ still present under their species as God and as man?"
|
||||
p1-parakeet-t8,1089-134686-0025,6.61,4576,308,2640,0,18," A gentle kick from the tall boy in the bench behind urged Stephen to ask a difficult question."
|
||||
p1-parakeet-t8,1089-134686-0026,4.01,4576,238,2406,0,13," The rector did not ask for a catechism to hear the lesson from"
|
||||
p1-parakeet-t8,1089-134686-0027,2.71,4576,162,1391,0,9," He clasped his hands on the desk and said"
|
||||
p1-parakeet-t8,1089-134686-0028,7.83,4576,407,3437,1,18," The retreat will begin on Wednesday afternoon in honour of Saint Xavier, whose feast day is Saturday."
|
||||
p1-parakeet-t8,1089-134686-0029,4.67,4576,209,1798,1,11," On Friday confession will be heard all the afternoon after Bedes."
|
||||
p1-parakeet-t4,1089-134686-0000,10.44,4552,509,2203,0,28," He hoped there would be stew for dinner turnips and carrots and bruised potatoes and fat mutton pieces to be ladled out in thick, peppered, flour fattened sauce."
|
||||
p1-parakeet-t4,1089-134686-0001,3.27,4552,175,968,0,8," Stuff it into you, his belly counselled him."
|
||||
p1-parakeet-t4,1089-134686-0002,6.62,4552,347,1640,0,18," After early nightfall the yellow lamps would light up, here and there, the squalid quarter of the brothels."
|
||||
p1-parakeet-t4,1089-134686-0003,2.68,4552,159,829,0,7," Hello, Bertie. Any good in your mind?"
|
||||
p1-parakeet-t4,1089-134686-0004,5.22,4552,247,1187,0,11," Number ten Fresh Nelly is waiting on you. Good night, husband."
|
||||
p1-parakeet-t4,1089-134686-0005,9.63,4552,446,2140,0,22," The music came nearer and he recalled the words the words of Shelley's fragment upon the moon wandering companionless, pale for weariness."
|
||||
p1-parakeet-t4,1089-134686-0006,10.55,4552,465,2172,0,24," The dull light fell more faintly upon the page, whereon another equation began to unfold itself slowly and to spread abroad its widening tail."
|
||||
p1-parakeet-t4,1089-134686-0007,4.28,4552,232,1157,0,8," A cold, lucid indifference reigned in his soul."
|
||||
p1-parakeet-t4,1089-134686-0008,6.73,4552,325,1515,0,15," The chaos in which his ardour extinguished itself was a cold, indifferent knowledge of himself,"
|
||||
p1-parakeet-t4,1089-134686-0009,10.57,4552,466,2062,0,27," At most, by an alms given to a beggar whose blessing he fled from, he might hope wearily to win for himself some measure of actual grace."
|
||||
p1-parakeet-t4,1089-134686-0010,4.41,4552,210,1140,0,14," Well now, Ennis, I declare you have a head, and so has my stick"
|
||||
p1-parakeet-t4,1089-134686-0011,12.45,4552,603,2734,0,39," On Saturday mornings when the sodality met in the chapel to recite the little office, his place was a cushioned kneeling desk at the right of the altar from which he led his wing of boys through the responses."
|
||||
p1-parakeet-t4,1089-134686-0012,11.64,4552,532,2422,0,28," Her eyes seemed to regard him with mild pity her holiness, a strange light glowing faintly upon her frail flesh did not humiliate the sinner who approached her."
|
||||
p1-parakeet-t4,1089-134686-0013,7.92,4552,373,1704,0,25," If ever he was impelled to cast sin from him and to repent, the impulse that moved him was the wish to be her knight."
|
||||
p1-parakeet-t4,1089-134686-0014,2.23,4552,133,781,0,8," He tried to think how it could be"
|
||||
p1-parakeet-t4,1089-134686-0015,5.82,4552,278,1328,0,14," but the dusk, deepening in the schoolroom, covered over his thoughts. The bell rang"
|
||||
p1-parakeet-t4,1089-134686-0016,3.54,4552,206,1031,1,10," Then you can ask him questions on the Catechism, Daedalus."
|
||||
p1-parakeet-t4,1089-134686-0017,8.87,4552,448,1984,0,24," Stephen leaning back and drawing idly on his scribbler, listened to the talk about him, which Heron checked from time to time by saying"
|
||||
p1-parakeet-t4,1089-134686-0018,15.72,4552,764,3359,0,41," It was strange, too, that he found an arid pleasure in following up to the end the rigid lines of the doctrines of the Church, and penetrating into obscure silences only to hear and feel the more deeply his own condemnation."
|
||||
p1-parakeet-t4,1089-134686-0019,13.89,4552,638,2578,0,39," The sentence of Saint James, which says that he who offends against one commandment becomes guilty of all, had seemed to him first a swollen phrase, until he had begun to grope in the darkness of his own state."
|
||||
p1-parakeet-t4,1089-134686-0020,16.79,4552,865,3688,0,50," If a man had stolen a pound in his youth, and had used that pound to amass a huge fortune, how much was he obliged to give back the pound he had stolen only, or the pound together with the compound interest accruing upon it, or all his huge fortune?"
|
||||
p1-parakeet-t4,1089-134686-0021,6.55,4552,337,1485,0,17," If a layman, in giving baptism, pour the water before saying the words, is the child baptized?"
|
||||
p1-parakeet-t4,1089-134686-0022,11.18,4552,514,2296,0,32," How comes it that while the first Beatitude promises the kingdom of heaven to the poor of heart, the second Beatitude promises also to the meek that they shall possess the land?"
|
||||
p1-parakeet-t4,1089-134686-0023,13.28,4552,609,2688,0,36," Why was the sacrament of the Eucharist instituted under the two species of bread and wine, if Jesus Christ be present body and blood, soul and divinity, in the bread alone, and in the wine alone?"
|
||||
p1-parakeet-t4,1089-134686-0024,11.65,4552,532,2406,0,30," If the wine change into vinegar, and the host crumble into corruption, after they have been consecrated, is Jesus Christ still present under their species as God and as man?"
|
||||
p1-parakeet-t4,1089-134686-0025,6.61,4552,360,1734,0,18," A gentle kick from the tall boy in the bench behind urged Stephen to ask a difficult question."
|
||||
p1-parakeet-t4,1089-134686-0026,4.01,4552,214,1078,0,13," The rector did not ask for a catechism to hear the lesson from"
|
||||
p1-parakeet-t4,1089-134686-0027,2.71,4552,153,812,0,9," He clasped his hands on the desk and said"
|
||||
p1-parakeet-t4,1089-134686-0028,7.83,4552,395,1751,1,18," The retreat will begin on Wednesday afternoon in honour of Saint Xavier, whose feast day is Saturday."
|
||||
p1-parakeet-t4,1089-134686-0029,4.67,4552,270,1375,1,11," On Friday confession will be heard all the afternoon after Bedes."
|
||||
|
@@ -0,0 +1,2 @@
|
||||
contender,file,audio_secs,load_ms,wall_ms,cpu_ms,wer_errors,ref_words,hypothesis
|
||||
p1-parakeet-t8,npu-test,6.92,6863,339,2734,2,16," The quick brown fox jumps over the lazy dog. Wisp assist is testing the neural processing unit."
|
||||
|
@@ -0,0 +1,148 @@
|
||||
# Parakeet vs Whisper — default-model bake-off (2026-07-16)
|
||||
|
||||
Pre-registered comparison (criteria fixed before any numbers existed — see the plan on branch
|
||||
`test_parakeet`) between WhispAssist's shipping Whisper `base.en` paths and NVIDIA Parakeet
|
||||
TDT 0.6B v2, to decide whether the default transcription model should change.
|
||||
|
||||
## Provenance
|
||||
|
||||
- **Machine:** Intel Core Ultra 5 135U (Meteor Lake: 12C/14T CPU, Intel Arc iGPU, Intel AI Boost
|
||||
NPU, driver 32.0.100.4724), Windows 11 Pro 26200. App version under test: 0.7.3.
|
||||
- **Harness:** `src-tauri/examples/asr_bench.rs` — drives the *production* transcribers
|
||||
(`WhisperTranscriber`, `OnnxTranscriber`) and a sherpa-onnx `TransducerRecognizer`; one
|
||||
contender per process (clean CPU accounting). WER = word-level Levenshtein after
|
||||
lowercase/punctuation-strip normalization (self-tested).
|
||||
- **Corpus:** first 30 LibriSpeech test-clean utterances (241.7 s, 644 reference words), 16 kHz
|
||||
mono, staged by `scripts/bench/fetch-corpus.ps1`. Live latency: sequential 10 s windows over a
|
||||
3-minute concatenation (16 windows).
|
||||
- **Models:** ggml `base.en-q5_1`, `medium.en-q5_0`; WA ONNX `base.en` (merged decoder, encoder
|
||||
on OpenVINO/NPU + decoder on OpenVINO/GPU — EP confirmed in-run);
|
||||
`sherpa-onnx-nemo-parakeet-tdt-0.6b-v2-int8` (encoder 652 MB + decoder 7 MB + joiner 2 MB).
|
||||
- **Raw data:** `bench-results/raw.csv`, `bench-results/raw-w1-novulkan.csv` (committed).
|
||||
|
||||
## Results — corpus (accuracy + cost)
|
||||
|
||||
| Contender | Engine / device | WER | RTF (wall) | CPU-sec per audio-sec | Load |
|
||||
|---|---|---|---|---|---|
|
||||
| W1 base.en (as shipped, 14 thr) | whisper.cpp, CPU | 2.48 % | ⚠ 20.1 | ⚠ 232.6 | 112 ms |
|
||||
| W1 base.en (thread-cap fix) | whisper.cpp, CPU | 2.48 % | 0.218 | 0.827 | 163 ms |
|
||||
| W2 base.en | whisper.cpp Vulkan, iGPU | 2.64 % | 0.071 | **0.033** | 248 ms |
|
||||
| W3 medium.en | whisper.cpp Vulkan, iGPU | 3.26 % | 0.304 | 0.088 | 724 ms |
|
||||
| W4 base.en (default) | ort ONNX, NPU + iGPU | 3.11 % | 0.058 | 0.049 | ~4.7 s |
|
||||
| **P1 parakeet int8, t8** | sherpa-onnx, CPU | **0.47 %** | **0.047** | 0.396 | ~4.6 s |
|
||||
| **P1 parakeet int8, t4** | sherpa-onnx, CPU | **0.47 %** | 0.049 | 0.224 | ~4.6 s |
|
||||
|
||||
- **Parakeet: 3 errors in 644 words**, vs 20 for the current default — an **85 % relative WER
|
||||
improvement** — while also posting the best RTF in the field, on the CPU alone.
|
||||
- Parakeet at 4 threads costs ≈0.22 CPU-cores sustained (~1.6 % of this machine's 14 threads);
|
||||
the NPU+iGPU Whisper path costs ≈0.05.
|
||||
- ✅ **W1 anomaly RESOLVED (2026-07-16 follow-up):** root cause was `n_threads =
|
||||
available_parallelism()` (14) putting ggml spin-barrier workers on the two slow LP E-cores —
|
||||
every graph-node barrier waits on the slowest worker while the rest burn CPU. 12 threads is
|
||||
healthy (RTF 0.200), 14 collapses (RTF ~22). The original suspect (`opt-level = "z"` /
|
||||
unoptimized ggml) was **disproven**: a verified `/O2` build was equally slow. Fix: default
|
||||
capped at 4 threads, whisper.cpp's own upstream default (`WA_WHISPER_THREADS` env overrides);
|
||||
re-run row above — RTF 20.1 → 0.218 (92×), CPU 232.6 → 0.827 (281×), WER identical.
|
||||
(The build *was* also silently unoptimized — the cmake crate clobbers MSVC `/O2` when no
|
||||
generator is set; fixed via `CMAKE_GENERATOR=Ninja` in `.cargo/config.toml` as build hygiene,
|
||||
though it wasn't the bottleneck.) Raw data: `bench-results/raw-w1-fixed.csv`.
|
||||
- W3 (medium) scoring *worse* than base on this corpus (21 vs 17 errors) is small-sample noise
|
||||
on clean read speech; treat W3's WER as "≈base" here, not as medium being worse in general.
|
||||
|
||||
## Results — live windows (10 s, n=16)
|
||||
|
||||
| Contender | p50 | p95 | max |
|
||||
|---|---|---|---|
|
||||
| W2 Vulkan base.en | 1055 ms | 3722 ms | 4148 ms |
|
||||
| W4 NPU+iGPU (default) | 519 ms | 630 ms | 928 ms |
|
||||
| **P1 parakeet t8 (CPU)** | **450 ms** | **497 ms** | **514 ms** |
|
||||
|
||||
All hold real-time; Parakeet is fastest **and** near-flat (64 ms p50→max spread), which would
|
||||
make the live transcript feel noticeably steadier.
|
||||
|
||||
## Evidence sample (file 1089-134686-0000, 10.4 s)
|
||||
|
||||
> **Reference:** HE HOPED THERE WOULD BE STEW FOR DINNER TURNIPS AND CARROTS AND BRUISED
|
||||
> POTATOES AND FAT MUTTON PIECES TO BE LADLED OUT IN THICK PEPPERED FLOUR FATTENED SAUCE
|
||||
|
||||
- **W4 (default):** "He hoped there would be stew for dinner, turnips and carrots and bruised
|
||||
potatoes and fat mutton pieces to be ladled out in thick peppered **flour-fatted** sauce." (2 err)
|
||||
- **P1 (parakeet):** " He hoped there would be stew for dinner turnips and carrots and bruised
|
||||
potatoes and fat mutton pieces to be ladled out in thick peppered flour fattened sauce" (0 err)
|
||||
|
||||
Note the trade visible even here: Whisper punctuates richly; Parakeet's int8 output carries
|
||||
casing but **sparse punctuation** — a real consideration for notes.md readability (see
|
||||
integration costs).
|
||||
|
||||
## Qualitative pass — real recording (2026-07-16 follow-up)
|
||||
|
||||
`bench-corpus/test_wavs/bank_deposits.wav` (62 s real recording, 48 kHz stereo — financial
|
||||
disclosure read aloud; downmixed/resampled by the production reader). No reference transcript,
|
||||
so transcripts were compared by eye; raw hypotheses in `bench-results/raw-qual-bank-deposits.csv`
|
||||
(its WER column is against a placeholder — ignore it).
|
||||
|
||||
- **P1 (parakeet t4):** cleanest of the three — zero audible-word errors, and the **best
|
||||
punctuation**, including commas around a parenthetical clause ("…the bank deposit details
|
||||
section, which appears later in this statement, for information…"). The "sparse punctuation"
|
||||
concern from the LibriSpeech sample did **not** reproduce on this longer real clip.
|
||||
- **W2 (Vulkan base.en):** near-perfect; one function-word slip ("effective for cash balances
|
||||
*and* your FDIC insured…" — W4 and P1 both hear "*in* your").
|
||||
- **W4 (NPU ONNX, shipping default):** worst of the three — "details" → "**D-Tales**" twice,
|
||||
"are SIPC protected" → "**or** SIPC protected", and a segmentation break at the end
|
||||
("statement period" → "**state. period.**").
|
||||
|
||||
One clip, one speaker, clean audio — directionally consistent with the corpus WERs
|
||||
(P1 ≥ W2 > W4), and it removes punctuation as an argument against Parakeet. Multi-speaker
|
||||
crosstalk remains untested.
|
||||
|
||||
## Pre-registered criteria, evaluated
|
||||
|
||||
| Criterion | Result |
|
||||
|---|---|
|
||||
| (a) WER ≥30 % relatively better than W4 | **PASS** — 85 % better (0.47 % vs 3.11 %) |
|
||||
| (b) CPU rung: beat W1 on WER **and** CPU-seconds | **PASS** — vs the *fixed* W1 (follow-up): 5.3× better WER (0.47 % vs 2.48 %), 3.7× less CPU (0.224 vs 0.827 cpu-sec/audio-sec) |
|
||||
| (b) NPU rung: accelerator execution or CPU ≤ W4 | **FAIL (strictly)** — 0.224 vs 0.049 CPU-sec/audio-sec; accelerated Parakeet not achieved (below) |
|
||||
| (c) Live windows hold real-time | **PASS** — best in field, p95 497 ms |
|
||||
|
||||
**Phase-4 finding (accelerated Parakeet, timeboxed):** the sherpa route is packaging-blocked —
|
||||
`sherpa-rs`'s `directml` feature is mutually exclusive with `download-binaries`
|
||||
(`compile_error!` in `sherpa-rs-sys` 0.6.8), and escaping via `SHERPA_LIB_PATH` + a
|
||||
version-matched prebuilt DirectML archive would require replacing the base dependency
|
||||
configuration for the whole branch, with transducer-on-DirectML performance unproven (and a
|
||||
prior DirectML-on-Intel-GPU crash on record). The genuine route is a TDT decode loop on our own
|
||||
ort/OpenVINO stack (istupakov-style ONNX exports) — estimated **days, not hours**, and only
|
||||
worth it if the NPU rung must flip. The `bench-directml` cargo feature + `p2-parakeet-dml`
|
||||
contender remain in the harness as the documented attempt.
|
||||
|
||||
## Recommendation (per hardware rung)
|
||||
|
||||
1. **CPU-only machines: change the default to Parakeet TDT 0.6B v2 int8.** Even against the
|
||||
*fixed* W1 (thread cap, follow-up above) it is ~5× more accurate and 3.7× cheaper in
|
||||
CPU-seconds at comparable wall RTF. This is the unambiguous win — just no longer by three
|
||||
orders of magnitude, since the W1 pathology itself is fixed.
|
||||
2. **NPU+iGPU machines (this machine): the pre-registered rule says keep Whisper-ONNX** —
|
||||
Parakeet-on-CPU costs 4.6× the CPU of the current near-idle path. The override argument the
|
||||
numbers support: 0.22 cores is still objectively tiny, and it buys 85 % fewer errors plus the
|
||||
steadiest live latency. That trade is the user's call, not the benchmark's; if low-CPU stays
|
||||
the hard constraint, the NPU rung flips only after the ort/OpenVINO TDT work lands.
|
||||
3. **GPU (Vulkan) machines without NPU:** W2 is the cheapest-CPU option (0.033), but Parakeet's
|
||||
accuracy gap applies here too — same judgment call as the NPU rung, cheaper to revisit after
|
||||
the integration items below.
|
||||
|
||||
**Integration costs before any default flip** (not solved by this bench): timestamped segments
|
||||
(sherpa-rs's `transducer` API returns text only; the C API exposes timestamps — small upstream
|
||||
PR or direct `-sys` call), punctuation restoration (sparse on short LibriSpeech clips, though
|
||||
the real-recording qualitative pass showed *good* punctuation on longer audio — may be a
|
||||
non-issue), English-only v2 (v3 is multilingual — the whisper multilingual path must remain for
|
||||
non-English), a ~660 MB model download, and the model catalog/dispatch work (same shape as the
|
||||
0.7.3 merged-decoder swap).
|
||||
|
||||
## Caveats
|
||||
|
||||
- LibriSpeech is clean read speech; WERs are comparative, not absolute product claims. The
|
||||
qualitative pass over a real recording was run as a follow-up (section above) — still
|
||||
single-speaker; multi-speaker meeting audio with crosstalk remains untested.
|
||||
- int8 quantization slightly penalizes Parakeet vs published fp32 figures — it *still* won by
|
||||
85 %; the fp32 bundle exists if a tighter number is ever needed.
|
||||
- Single machine, single run per cell (30 files each). Differences here are far larger than
|
||||
run-to-run noise, but treat third-decimal RTF differences as noise.
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "whispassist",
|
||||
"private": true,
|
||||
"version": "0.7.3",
|
||||
"version": "0.7.4",
|
||||
"type": "module",
|
||||
"description": "Privacy-first, fully local Windows meeting assistant.",
|
||||
"license": "MIT OR Apache-2.0",
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
# Best-effort system-counter capture alongside a bench run: total CPU utility
|
||||
# + GPU compute-engine utilization (and NPU engines where the OS exposes them;
|
||||
# absent counters are skipped by typeperf). Primary CPU metric remains the
|
||||
# harness's in-process CPU-seconds — this is corroborating evidence.
|
||||
param(
|
||||
[string]$Out = "bench-results\counters.csv",
|
||||
[int]$Seconds = 120
|
||||
)
|
||||
$ErrorActionPreference = "Stop"
|
||||
New-Item -ItemType Directory -Force (Split-Path -Parent $Out) | Out-Null
|
||||
$counters = @(
|
||||
"\Processor Information(_Total)\% Processor Utility",
|
||||
"\GPU Engine(*engtype_Compute)\Utilization Percentage",
|
||||
"\NPU Engine(*)\Utilization Percentage"
|
||||
)
|
||||
# typeperf exits nonzero if ANY counter is invalid; probe each and keep the valid ones.
|
||||
$valid = @()
|
||||
foreach ($c in $counters) {
|
||||
typeperf $c -sc 1 | Out-Null
|
||||
if ($LASTEXITCODE -eq 0) { $valid += $c }
|
||||
}
|
||||
if ($valid.Count -eq 0) { throw "no usable counters on this machine" }
|
||||
typeperf $valid -si 1 -sc $Seconds -f CSV -o $Out -y | Out-Null
|
||||
Write-Output "captured $($valid.Count) counter set(s) for ${Seconds}s -> $Out"
|
||||
@@ -0,0 +1,47 @@
|
||||
# Stages the WER corpus for asr_bench: the first N LibriSpeech test-clean
|
||||
# utterances as 16 kHz mono WAV + one reference .txt each, under bench-corpus\
|
||||
# at the repo root (git-ignored — audio never enters the repo).
|
||||
param([int]$Utterances = 30)
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
if (-not (Get-Command ffmpeg -ErrorAction SilentlyContinue)) {
|
||||
throw "ffmpeg is required on PATH (same requirement as the app's Import feature)"
|
||||
}
|
||||
|
||||
$repo = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
|
||||
$corpus = Join-Path $repo "bench-corpus"
|
||||
$cache = "$env:LOCALAPPDATA\WhispAssist\models\bench-cache"
|
||||
New-Item -ItemType Directory -Force $corpus, $cache | Out-Null
|
||||
|
||||
$tarball = Join-Path $cache "test-clean.tar.gz"
|
||||
if (-not (Test-Path $tarball)) {
|
||||
Write-Output "downloading LibriSpeech test-clean (~346 MB)"
|
||||
curl.exe -sL -o "$tarball.part" "https://www.openslr.org/resources/12/test-clean.tar.gz"
|
||||
if ($LASTEXITCODE -ne 0) { throw "download failed ($LASTEXITCODE)" }
|
||||
Move-Item -Force "$tarball.part" $tarball
|
||||
}
|
||||
$extracted = Join-Path $cache "LibriSpeech\test-clean"
|
||||
if (-not (Test-Path $extracted)) {
|
||||
Write-Output "extracting"
|
||||
tar -xzf $tarball -C $cache
|
||||
if ($LASTEXITCODE -ne 0) { throw "extract failed ($LASTEXITCODE)" }
|
||||
}
|
||||
|
||||
$flacs = Get-ChildItem -Recurse -Filter *.flac $extracted | Sort-Object FullName |
|
||||
Select-Object -First $Utterances
|
||||
foreach ($f in $flacs) {
|
||||
$name = $f.BaseName
|
||||
$wav = Join-Path $corpus "$name.wav"
|
||||
if (-not (Test-Path $wav)) {
|
||||
ffmpeg -v error -y -i $f.FullName -ar 16000 -ac 1 $wav
|
||||
if ($LASTEXITCODE -ne 0) { throw "ffmpeg failed on $name" }
|
||||
}
|
||||
$trans = Get-ChildItem -Path $f.DirectoryName -Filter *.trans.txt | Select-Object -First 1
|
||||
$line = Get-Content $trans.FullName | Where-Object { $_.StartsWith("$name ") } | Select-Object -First 1
|
||||
if (-not $line) { throw "no reference line for $name" }
|
||||
# Named parameters on purpose: positional binding alongside -NoNewline
|
||||
# silently wrote nothing under Windows PowerShell 5.1 (found the hard way);
|
||||
# the WER normalizer doesn't care about a trailing newline.
|
||||
Set-Content -Path (Join-Path $corpus "$name.txt") -Value $line.Substring($name.Length + 1) -Encoding utf8
|
||||
}
|
||||
Write-Output "staged $($flacs.Count) utterances in $corpus"
|
||||
@@ -0,0 +1,25 @@
|
||||
# Stages the Parakeet TDT 0.6B v2 int8 bundle (sherpa-onnx export) for the
|
||||
# asr_bench harness (test_parakeet branch). Bench-only artifact: lives next to
|
||||
# the app's models but under bench-parakeet\, never read by the app itself.
|
||||
$ErrorActionPreference = "Stop"
|
||||
$dest = "$env:LOCALAPPDATA\WhispAssist\models\bench-parakeet"
|
||||
$url = "https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-nemo-parakeet-tdt-0.6b-v2-int8.tar.bz2"
|
||||
$cache = "$env:LOCALAPPDATA\WhispAssist\models\bench-cache"
|
||||
New-Item -ItemType Directory -Force $cache | Out-Null
|
||||
$archive = Join-Path $cache "parakeet-tdt-0.6b-v2-int8.tar.bz2"
|
||||
|
||||
if (Test-Path (Join-Path $dest "tokens.txt")) {
|
||||
Write-Output "already staged: $dest"
|
||||
exit 0
|
||||
}
|
||||
if (-not (Test-Path $archive)) {
|
||||
Write-Output "downloading $url"
|
||||
curl.exe -sL -o "$archive.part" $url
|
||||
if ($LASTEXITCODE -ne 0) { throw "download failed ($LASTEXITCODE)" }
|
||||
Move-Item -Force "$archive.part" $archive
|
||||
}
|
||||
New-Item -ItemType Directory -Force $dest | Out-Null
|
||||
tar -xjf $archive -C $dest --strip-components=1
|
||||
if ($LASTEXITCODE -ne 0) { throw "extract failed ($LASTEXITCODE)" }
|
||||
Get-ChildItem $dest | Select-Object Name, Length
|
||||
Write-Output "staged: $dest"
|
||||
@@ -0,0 +1,22 @@
|
||||
# Runs the full pre-registered contender matrix sequentially (one process per
|
||||
# contender — clean CPU accounting, no runtime co-tenancy), then the live-window
|
||||
# latency runs on the realistic live rungs.
|
||||
$ErrorActionPreference = "Continue"
|
||||
$repo = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
|
||||
Set-Location $repo
|
||||
$exe = "C:\wt\release\examples\asr_bench.exe"
|
||||
$live = "bench-corpus\test_wavs\live-concat.wav"
|
||||
|
||||
$contenders = @(
|
||||
"w1-cpu-base", "w2-vulkan-base", "w3-vulkan-medium",
|
||||
"w4-npu-onnx", "p1-parakeet-t8", "p1-parakeet-t4"
|
||||
)
|
||||
foreach ($c in $contenders) {
|
||||
Write-Output "===== corpus: $c ====="
|
||||
& $exe $c --corpus bench-corpus --out bench-results\raw.csv 2>&1
|
||||
}
|
||||
foreach ($c in @("w2-vulkan-base", "w4-npu-onnx", "p1-parakeet-t8")) {
|
||||
Write-Output "===== live: $c ====="
|
||||
& $exe $c --live $live 2>&1
|
||||
}
|
||||
Write-Output "===== matrix done ====="
|
||||
Generated
+1
-1
@@ -6088,7 +6088,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "whispassist"
|
||||
version = "0.7.3"
|
||||
version = "0.7.4"
|
||||
dependencies = [
|
||||
"argon2",
|
||||
"async-trait",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "whispassist"
|
||||
version = "0.7.3"
|
||||
version = "0.7.4"
|
||||
description = "Privacy-first, fully local Windows meeting assistant"
|
||||
authors = ["WhispAssist contributors"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
@@ -126,6 +126,10 @@ diarization = ["dep:sherpa-rs"] # sherpa-onnx
|
||||
pst = [] # shells out to readpst (libpst) — no crate dep, see ADR-0008 update
|
||||
# Phase 9
|
||||
sync = ["dep:keyring"] # remote upload (WebDAV + OAuth providers)
|
||||
# Bench-only (test_parakeet branch): DirectML-enabled sherpa-onnx binaries so
|
||||
# asr_bench's P2 contender can try Parakeet on the iGPU. NEVER a default
|
||||
# feature — it swaps the sherpa runtime the whole binary links against.
|
||||
bench-directml = ["sherpa-rs?/directml"]
|
||||
# Phase 10
|
||||
mcp = [
|
||||
"dep:rmcp", "dep:keyring", "dep:hyper", "dep:hyper-util",
|
||||
|
||||
@@ -0,0 +1,418 @@
|
||||
//! ASR bench harness — the Parakeet-vs-Whisper bake-off (test_parakeet branch).
|
||||
//!
|
||||
//! Drives the *production* transcribers (`WhisperTranscriber`, `OnnxTranscriber`)
|
||||
//! plus a sherpa-onnx `TransducerRecognizer` (Parakeet TDT) over a shared corpus,
|
||||
//! and reports WER / RTF / process-CPU-seconds per contender. One contender per
|
||||
//! process invocation, deliberately: (1) process CPU time then measures exactly
|
||||
//! one engine, and (2) the ort crate (OpenVINO runtime) and sherpa's bundled
|
||||
//! onnxruntime never coexist in one address space.
|
||||
//!
|
||||
//! Usage:
|
||||
//! asr_bench <contender> [--corpus DIR] [--out CSV]
|
||||
//! asr_bench <contender> --live WAV # sequential 10 s window latency
|
||||
//! asr_bench --self-test # WER scorer assertions
|
||||
//!
|
||||
//! Contenders: w1-cpu-base | w2-vulkan-base | w3-vulkan-medium | w4-npu-onnx |
|
||||
//! p1-parakeet-t<N> (N = sherpa num_threads)
|
||||
//!
|
||||
//! Corpus layout: {name}.wav (16 kHz mono) + {name}.txt reference per utterance
|
||||
//! (staged by scripts/bench/fetch-corpus.ps1).
|
||||
|
||||
use std::io::Write as _;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::time::Instant;
|
||||
|
||||
use whispassist_lib::audio::read_wav_mono_16k;
|
||||
use whispassist_lib::models::BackendId;
|
||||
use whispassist_lib::paths;
|
||||
use whispassist_lib::transcription::{
|
||||
onnx_models, AudioWindow, OnnxTranscriber, Transcriber, WhisperTranscriber,
|
||||
};
|
||||
|
||||
const WINDOW_SECS: usize = 10;
|
||||
const SAMPLE_RATE: usize = 16_000;
|
||||
|
||||
// ---- process CPU time (kernel + user) via GetProcessTimes — no crate
|
||||
// features needed, kernel32 is always linked on Windows. ----
|
||||
#[cfg(windows)]
|
||||
mod cputime {
|
||||
#[repr(C)]
|
||||
#[derive(Default, Clone, Copy)]
|
||||
struct Filetime {
|
||||
lo: u32,
|
||||
hi: u32,
|
||||
}
|
||||
extern "system" {
|
||||
fn GetCurrentProcess() -> isize;
|
||||
fn GetProcessTimes(
|
||||
h: isize,
|
||||
creation: *mut Filetime,
|
||||
exit: *mut Filetime,
|
||||
kernel: *mut Filetime,
|
||||
user: *mut Filetime,
|
||||
) -> i32;
|
||||
}
|
||||
/// Cumulative process CPU time in milliseconds.
|
||||
pub fn process_cpu_ms() -> u64 {
|
||||
let (mut c, mut e, mut k, mut u) = (
|
||||
Filetime::default(),
|
||||
Filetime::default(),
|
||||
Filetime::default(),
|
||||
Filetime::default(),
|
||||
);
|
||||
// SAFETY: pseudo-handle + four valid out-pointers, per the API contract.
|
||||
let ok = unsafe { GetProcessTimes(GetCurrentProcess(), &mut c, &mut e, &mut k, &mut u) };
|
||||
if ok == 0 {
|
||||
return 0;
|
||||
}
|
||||
let ms = |f: Filetime| (((f.hi as u64) << 32) | f.lo as u64) / 10_000; // 100 ns units
|
||||
ms(k) + ms(u)
|
||||
}
|
||||
}
|
||||
#[cfg(not(windows))]
|
||||
mod cputime {
|
||||
pub fn process_cpu_ms() -> u64 {
|
||||
0
|
||||
}
|
||||
}
|
||||
|
||||
// ---- WER ----
|
||||
|
||||
/// Lowercase, strip everything but alphanumerics/apostrophes, split to words —
|
||||
/// LibriSpeech references are uppercase without punctuation; hypotheses carry
|
||||
/// casing + punctuation, so both sides normalize through here.
|
||||
fn normalize(s: &str) -> Vec<String> {
|
||||
s.to_lowercase()
|
||||
.chars()
|
||||
.map(|c| {
|
||||
if c.is_alphanumeric() || c == '\'' {
|
||||
c
|
||||
} else {
|
||||
' '
|
||||
}
|
||||
})
|
||||
.collect::<String>()
|
||||
.split_whitespace()
|
||||
.map(str::to_string)
|
||||
.collect()
|
||||
}
|
||||
|
||||
/// Word-level Levenshtein distance (two-row DP).
|
||||
fn edit_distance(a: &[String], b: &[String]) -> usize {
|
||||
let mut prev: Vec<usize> = (0..=b.len()).collect();
|
||||
let mut cur = vec![0usize; b.len() + 1];
|
||||
for (i, wa) in a.iter().enumerate() {
|
||||
cur[0] = i + 1;
|
||||
for (j, wb) in b.iter().enumerate() {
|
||||
let sub = prev[j] + usize::from(wa != wb);
|
||||
cur[j + 1] = sub.min(prev[j + 1] + 1).min(cur[j] + 1);
|
||||
}
|
||||
std::mem::swap(&mut prev, &mut cur);
|
||||
}
|
||||
prev[b.len()]
|
||||
}
|
||||
|
||||
fn self_test() {
|
||||
assert_eq!(edit_distance(&normalize("a b c"), &normalize("a b c")), 0);
|
||||
assert_eq!(edit_distance(&normalize("a b c"), &normalize("a x c")), 1); // sub
|
||||
assert_eq!(edit_distance(&normalize("a b c"), &normalize("a c")), 1); // del
|
||||
assert_eq!(edit_distance(&normalize("a c"), &normalize("a b c")), 1); // ins
|
||||
assert_eq!(
|
||||
normalize("The QUICK, brown-fox's."),
|
||||
vec!["the", "quick", "brown", "fox's"]
|
||||
);
|
||||
assert!(edit_distance(&normalize("hello world"), &normalize("")) == 2);
|
||||
println!("self-test OK");
|
||||
}
|
||||
|
||||
// ---- engines ----
|
||||
|
||||
// ponytail: one Engine per process for its whole lifetime — variant size skew is irrelevant.
|
||||
#[allow(clippy::large_enum_variant)]
|
||||
enum Engine {
|
||||
Whisper(WhisperTranscriber),
|
||||
Onnx(OnnxTranscriber),
|
||||
Parakeet(std::sync::Mutex<sherpa_rs::transducer::TransducerRecognizer>),
|
||||
}
|
||||
|
||||
impl Engine {
|
||||
fn transcribe_wav(&self, wav: &Path) -> Result<String, String> {
|
||||
match self {
|
||||
Engine::Whisper(t) => Ok(join_segments(
|
||||
t.transcribe_file(wav).map_err(|e| e.to_string())?,
|
||||
)),
|
||||
Engine::Onnx(t) => Ok(join_segments(
|
||||
t.transcribe_file(wav).map_err(|e| e.to_string())?,
|
||||
)),
|
||||
Engine::Parakeet(r) => {
|
||||
let samples = read_wav_mono_16k(wav).map_err(|e| e.to_string())?;
|
||||
Ok(r.lock()
|
||||
.map_err(|_| "poisoned".to_string())?
|
||||
.transcribe(SAMPLE_RATE as u32, &samples))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// One live window; returns the wall time only (text is discarded — this
|
||||
/// mode measures latency, corpus mode measures accuracy).
|
||||
fn time_window(&self, samples: Vec<f32>, offset_ms: u64) -> Result<u128, String> {
|
||||
let t0 = Instant::now();
|
||||
match self {
|
||||
Engine::Whisper(t) => {
|
||||
let (tx, rx) = std::sync::mpsc::channel();
|
||||
t.transcribe_stream(AudioWindow { samples, offset_ms }, tx)
|
||||
.map_err(|e| e.to_string())?;
|
||||
drop(rx);
|
||||
}
|
||||
Engine::Onnx(t) => {
|
||||
let (tx, rx) = std::sync::mpsc::channel();
|
||||
t.transcribe_stream(AudioWindow { samples, offset_ms }, tx)
|
||||
.map_err(|e| e.to_string())?;
|
||||
drop(rx);
|
||||
}
|
||||
Engine::Parakeet(r) => {
|
||||
let _ = r
|
||||
.lock()
|
||||
.map_err(|_| "poisoned".to_string())?
|
||||
.transcribe(SAMPLE_RATE as u32, &samples);
|
||||
}
|
||||
}
|
||||
Ok(t0.elapsed().as_millis())
|
||||
}
|
||||
}
|
||||
|
||||
fn join_segments(segs: Vec<whispassist_lib::models::TranscriptSegment>) -> String {
|
||||
segs.iter()
|
||||
.map(|s| s.text.trim())
|
||||
.collect::<Vec<_>>()
|
||||
.join(" ")
|
||||
}
|
||||
|
||||
/// First file in `dir` whose name starts with `prefix` and ends with `.onnx`.
|
||||
fn find_onnx(dir: &Path, prefix: &str) -> Result<PathBuf, String> {
|
||||
std::fs::read_dir(dir)
|
||||
.map_err(|e| format!("{}: {e}", dir.display()))?
|
||||
.filter_map(|e| e.ok())
|
||||
.map(|e| e.path())
|
||||
.find(|p| {
|
||||
p.file_name()
|
||||
.and_then(|n| n.to_str())
|
||||
.is_some_and(|n| n.starts_with(prefix) && n.ends_with(".onnx"))
|
||||
})
|
||||
.ok_or_else(|| format!("no {prefix}*.onnx under {}", dir.display()))
|
||||
}
|
||||
|
||||
fn load_engine(contender: &str) -> Result<Engine, String> {
|
||||
let whisper = |model: &str, backend: BackendId| -> Result<Engine, String> {
|
||||
let path = paths::whisper_model_file(model);
|
||||
WhisperTranscriber::load(&path, backend, Some("en"))
|
||||
.map(Engine::Whisper)
|
||||
.map_err(|e| e.to_string())
|
||||
};
|
||||
match contender {
|
||||
"w1-cpu-base" => whisper("base.en-q5_1", BackendId::Cpu),
|
||||
"w2-vulkan-base" => whisper("base.en-q5_1", BackendId::Intel),
|
||||
"w3-vulkan-medium" => whisper("medium.en-q5_0", BackendId::Intel),
|
||||
"w4-npu-onnx" => {
|
||||
let dir = onnx_models::model_dir(onnx_models::DEFAULT_ONNX_MODEL);
|
||||
OnnxTranscriber::load(&dir, BackendId::Npu, None)
|
||||
.map(Engine::Onnx)
|
||||
.map_err(|e| e.to_string())
|
||||
}
|
||||
p if p.starts_with("p1-parakeet-t") || p.starts_with("p2-parakeet-dml-t") => {
|
||||
let dml = p.starts_with("p2-");
|
||||
let threads: i32 = p
|
||||
.rsplit_once('t')
|
||||
.and_then(|(_, n)| n.parse().ok())
|
||||
.ok_or_else(|| format!("bad thread count in '{p}'"))?;
|
||||
let dir = paths::models_dir().join("bench-parakeet");
|
||||
let config = sherpa_rs::transducer::TransducerConfig {
|
||||
encoder: find_onnx(&dir, "encoder")?.to_string_lossy().into_owned(),
|
||||
decoder: find_onnx(&dir, "decoder")?.to_string_lossy().into_owned(),
|
||||
joiner: find_onnx(&dir, "joiner")?.to_string_lossy().into_owned(),
|
||||
tokens: dir.join("tokens.txt").to_string_lossy().into_owned(),
|
||||
model_type: "nemo_transducer".to_string(),
|
||||
decoding_method: "greedy_search".to_string(),
|
||||
sample_rate: SAMPLE_RATE as i32,
|
||||
feature_dim: 80,
|
||||
num_threads: threads,
|
||||
// "directml" needs the bench-directml cargo feature (DirectML
|
||||
// sherpa-onnx binaries); with plain binaries sherpa falls back
|
||||
// noisily and the run is invalid — P2 rows only count from a
|
||||
// bench-directml build.
|
||||
provider: Some(if dml { "directml" } else { "cpu" }.to_string()),
|
||||
..Default::default()
|
||||
};
|
||||
sherpa_rs::transducer::TransducerRecognizer::new(config)
|
||||
.map(|r| Engine::Parakeet(std::sync::Mutex::new(r)))
|
||||
.map_err(|e| e.to_string())
|
||||
}
|
||||
other => Err(format!(
|
||||
"unknown contender '{other}' (w1-cpu-base | w2-vulkan-base | w3-vulkan-medium | w4-npu-onnx | p1-parakeet-t<N> | p2-parakeet-dml-t<N>)"
|
||||
)),
|
||||
}
|
||||
}
|
||||
|
||||
// ---- modes ----
|
||||
|
||||
fn csv_escape(s: &str) -> String {
|
||||
format!("\"{}\"", s.replace('"', "\"\""))
|
||||
}
|
||||
|
||||
fn run_corpus(contender: &str, engine: &Engine, load_ms: u128, corpus: &Path, out: &Path) {
|
||||
let mut wavs: Vec<PathBuf> = std::fs::read_dir(corpus)
|
||||
.unwrap_or_else(|e| panic!("corpus dir {}: {e}", corpus.display()))
|
||||
.filter_map(|e| e.ok())
|
||||
.map(|e| e.path())
|
||||
.filter(|p| p.extension().is_some_and(|x| x == "wav"))
|
||||
.collect();
|
||||
wavs.sort();
|
||||
assert!(!wavs.is_empty(), "no wavs in {}", corpus.display());
|
||||
|
||||
if let Some(parent) = out.parent() {
|
||||
std::fs::create_dir_all(parent).expect("create out dir");
|
||||
}
|
||||
let new_file = !out.exists();
|
||||
let mut csv = std::fs::OpenOptions::new()
|
||||
.create(true)
|
||||
.append(true)
|
||||
.open(out)
|
||||
.expect("open csv");
|
||||
if new_file {
|
||||
writeln!(
|
||||
csv,
|
||||
"contender,file,audio_secs,load_ms,wall_ms,cpu_ms,wer_errors,ref_words,hypothesis"
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
let (mut errors, mut words, mut wall_total, mut cpu_total, mut audio_total) =
|
||||
(0usize, 0usize, 0u128, 0u64, 0f64);
|
||||
for wav in &wavs {
|
||||
let stem = wav.file_stem().unwrap().to_string_lossy().into_owned();
|
||||
let reference = std::fs::read_to_string(wav.with_extension("txt")).unwrap_or_else(|e| {
|
||||
panic!(
|
||||
"missing reference {}: {e}",
|
||||
wav.with_extension("txt").display()
|
||||
)
|
||||
});
|
||||
let audio_secs = read_wav_mono_16k(wav)
|
||||
.map(|s| s.len() as f64 / SAMPLE_RATE as f64)
|
||||
.unwrap_or(0.0);
|
||||
|
||||
let cpu0 = cputime::process_cpu_ms();
|
||||
let t0 = Instant::now();
|
||||
let hypothesis = match engine.transcribe_wav(wav) {
|
||||
Ok(t) => t,
|
||||
Err(e) => {
|
||||
eprintln!("FAILED {stem}: {e}");
|
||||
continue;
|
||||
}
|
||||
};
|
||||
let wall = t0.elapsed().as_millis();
|
||||
let cpu = cputime::process_cpu_ms() - cpu0;
|
||||
|
||||
let r = normalize(&reference);
|
||||
let h = normalize(&hypothesis);
|
||||
let err = edit_distance(&r, &h);
|
||||
errors += err;
|
||||
words += r.len();
|
||||
wall_total += wall;
|
||||
cpu_total += cpu;
|
||||
audio_total += audio_secs;
|
||||
|
||||
writeln!(
|
||||
csv,
|
||||
"{contender},{stem},{audio_secs:.2},{load_ms},{wall},{cpu},{err},{},{}",
|
||||
r.len(),
|
||||
csv_escape(&hypothesis)
|
||||
)
|
||||
.unwrap();
|
||||
println!(
|
||||
"{stem}: {audio_secs:.1}s wall={wall}ms cpu={cpu}ms wer={err}/{}",
|
||||
r.len()
|
||||
);
|
||||
}
|
||||
|
||||
println!("---- {contender} summary ----");
|
||||
println!(
|
||||
"files: {} audio: {audio_total:.1}s load: {load_ms}ms",
|
||||
wavs.len()
|
||||
);
|
||||
println!(
|
||||
"WER: {:.2}% ({errors}/{words})",
|
||||
100.0 * errors as f64 / words.max(1) as f64
|
||||
);
|
||||
println!(
|
||||
"RTF (wall): {:.3}",
|
||||
wall_total as f64 / 1000.0 / audio_total.max(0.001)
|
||||
);
|
||||
println!(
|
||||
"CPU-sec per audio-sec: {:.3}",
|
||||
cpu_total as f64 / 1000.0 / audio_total.max(0.001)
|
||||
);
|
||||
}
|
||||
|
||||
fn run_live(contender: &str, engine: &Engine, wav: &Path) {
|
||||
let samples = read_wav_mono_16k(wav).expect("read live wav");
|
||||
let chunk = WINDOW_SECS * SAMPLE_RATE;
|
||||
let mut latencies: Vec<u128> = Vec::new();
|
||||
for (i, part) in samples.chunks(chunk).enumerate() {
|
||||
if part.len() < SAMPLE_RATE {
|
||||
continue; // sub-second tail: skip, same spirit as MIN_DIARIZE_SAMPLES
|
||||
}
|
||||
let ms = engine
|
||||
.time_window(part.to_vec(), (i * WINDOW_SECS * 1000) as u64)
|
||||
.expect("window decode");
|
||||
println!("window {i}: {ms}ms");
|
||||
latencies.push(ms);
|
||||
}
|
||||
latencies.sort_unstable();
|
||||
let pct = |p: f64| latencies[(((latencies.len() - 1) as f64) * p) as usize];
|
||||
println!(
|
||||
"---- {contender} live ({WINDOW_SECS}s windows, n={}) ----",
|
||||
latencies.len()
|
||||
);
|
||||
println!(
|
||||
"p50={}ms p95={}ms max={}ms (budget: {}ms)",
|
||||
pct(0.50),
|
||||
pct(0.95),
|
||||
latencies.last().unwrap(),
|
||||
WINDOW_SECS * 1000
|
||||
);
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let args: Vec<String> = std::env::args().skip(1).collect();
|
||||
if args.iter().any(|a| a == "--self-test") {
|
||||
self_test();
|
||||
return;
|
||||
}
|
||||
let contender = args
|
||||
.first()
|
||||
.expect("usage: asr_bench <contender> [--corpus DIR|--live WAV]");
|
||||
let flag = |name: &str| {
|
||||
args.iter()
|
||||
.position(|a| a == name)
|
||||
.and_then(|i| args.get(i + 1))
|
||||
.map(PathBuf::from)
|
||||
};
|
||||
let corpus = flag("--corpus").unwrap_or_else(|| PathBuf::from("bench-corpus"));
|
||||
let out = flag("--out").unwrap_or_else(|| PathBuf::from("bench-results/raw.csv"));
|
||||
|
||||
let t0 = Instant::now();
|
||||
let engine = match load_engine(contender) {
|
||||
Ok(e) => e,
|
||||
Err(e) => {
|
||||
eprintln!("load failed: {e}");
|
||||
std::process::exit(1);
|
||||
}
|
||||
};
|
||||
let load_ms = t0.elapsed().as_millis();
|
||||
println!("{contender}: loaded in {load_ms}ms");
|
||||
|
||||
match flag("--live") {
|
||||
Some(wav) => run_live(contender, &engine, &wav),
|
||||
None => run_corpus(contender, &engine, load_ms, &corpus, &out),
|
||||
}
|
||||
}
|
||||
@@ -287,8 +287,22 @@ impl Transcriber for WhisperTranscriber {
|
||||
|
||||
#[cfg(feature = "cpu-transcription")]
|
||||
fn available_threads() -> std::ffi::c_int {
|
||||
// WA_WHISPER_THREADS: support/bench override — see cap rationale below.
|
||||
if let Some(n) = std::env::var("WA_WHISPER_THREADS")
|
||||
.ok()
|
||||
.and_then(|s| s.parse().ok())
|
||||
{
|
||||
return n;
|
||||
}
|
||||
// Capped at 4 (whisper.cpp's own CLI default): ggml workers spin-wait at
|
||||
// a per-graph-node barrier, so one worker scheduled on a slow core stalls
|
||||
// every node while the rest burn CPU. With all 14 logical CPUs of a
|
||||
// hybrid Meteor Lake (incl. 2 LP E-cores) this measured RTF ~22 — ~80x
|
||||
// slower than the same build at 4 threads (RTF 0.28), regardless of
|
||||
// compiler flags. 4 threads is also the CPU-frugal choice (NFR-RES-1):
|
||||
// 1.07 vs 2.16 cpu-sec/audio-sec at 12 threads for near-equal wall time.
|
||||
std::thread::available_parallelism()
|
||||
.map(|n| n.get() as std::ffi::c_int)
|
||||
.map(|n| (n.get() as std::ffi::c_int).min(4))
|
||||
.unwrap_or(4)
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "https://schema.tauri.app/config/2",
|
||||
"productName": "WhispAssist",
|
||||
"version": "0.7.3",
|
||||
"version": "0.7.4",
|
||||
"identifier": "bet.dou.whispassist",
|
||||
"build": {
|
||||
"frontendDist": "../dist",
|
||||
|
||||
Reference in new issue
Block a user