Repository navigation
Releases
Releases · Reddynb666/scenevoice
SceneVoice 1.1.0
- No key needed to start (optional): SceneVoice Cloud. A welcome page (
welcome.html) opens after install with focus on its heading: Hear a sample reads three sample descriptions through your screen reader (or the built-in voice), then one choice: Start free or I have my own key. Start free asks the SceneVoice Cloud relay for an anonymous device token (no account, no e-mail), gives a free daily allowance of described minutes and has Cloud describe both sites; the allowance, plan, reset time, Stop using Cloud and a licence-key field for Plus or organisation plans live at the top of the settings page. A video someone with Cloud already had described is loaded from the shared cache instead of being made again (Share finished descriptions, on with Cloud, off otherwise; only finished description text is shared, never pictures, questions or your own key); used-up allowance says when it comes back. Users with their own key send nothing to SceneVoice; the key path is never degraded. New host permissionhttps://api.scenevoice.app/*, justified inPRIVACY.md(new SceneVoice Cloud section) anddocs/store-listing.md. The relay itself is a reference implementation underserver/(Cloudflare Worker: devices, allowance, Gemini- and DashScope-compatible proxies that never store a request, script cache, licences, Stripe webhook, 47 tests, deployment and cost notes inserver/README.md); it is not deployed yet, so Start free reports the failure plainly and points to the own-key path until it is. - Descriptions keep out of the dialogue's way. A pause the model only estimated is now used with half a second of margin (a pause measured from captions is used in full), and the model is told never to invent a pause when it cannot tell. A description may only cut off one less important than itself; otherwise it is held for up to 5 seconds of video for a real pause, re-fitted at that moment, and dropped if none comes. A visual description that lands on speech waits up to 5 seconds for a pause its brief version fits at your reading speed. In Keep playing mode, after more than three descriptions have been skipped for want of a pause, SceneVoice says so once per video and names the shortcut that switches to Pause the video. In Pause the video mode with a screen reader the video is held 1.5 seconds longer before it resumes, so the last words are not lost. Jumping in the video stops the sentence being read. A description from pictures said more than 6 seconds after its moment begins Earlier: / 刚才:, and very late ones are dropped. Each section's request carries the last four descriptions of the one before, so a section no longer re-describes the scene it opens in. The built-in voice waits for a hidden tab only when the video is silent too.
- What it costs, and a limit you set. A Usage today part of the settings page counts, per model (Gemini, Qwen, Cloud), the requests, tokens, minutes of video and an estimate in money, from a price table checked on 2026-11-04 (counted on this computer only, never sent anywhere); the popup says what the current video cost. A new Daily limit (none, 30 minutes, 1, 2 or 4 hours of described video) refuses new jobs for the rest of the day once reached and says so; asks and corrections still work, and nothing starts by itself again that day. Rate limits are told apart from used-up quotas: a minute's limit is retried after the wait the API asks for (at most 90 seconds), a day's quota switches once to another model family and is otherwise reported as such, and the Cloud allowance says when it resets. At most two picture requests per model are in flight at once; the rest queue in order.
- Any language. Descriptions can be written in any language the browser is set to, not only the ones with their own tables; twelve more languages have tables of their own (Italian, Dutch, Polish, Turkish, Vietnamese, Thai, Indonesian, Bengali, Urdu, Persian, Ukrainian, Swahili), with the hedging examples in the prompt built from the description language's own words. The live regions, the text shown on the video and the answer in the ask dialog carry the description language (and
dir="auto"), so the screen reader switches voice; the popup says when the interface language and the description language differ; right-to-left language names are shown right to left. The video type is read from YouTube's numeric category id when the page has it, not only the name. - Interface in 14 languages. Besides English and Simplified Chinese, the interface is available in Traditional Chinese, Spanish, Portuguese (Brazil), French, German, Japanese, Korean, Russian, Arabic, Hindi, Indonesian and Vietnamese. These twelve were drafted by an AI and are marked so at the top of each file until a native speaker who uses a screen reader has read them through; a missing string falls back to English. A browser set to Portuguese (Portugal) or to Chinese for Hong Kong or Macau gets the Portuguese (Brazil) or Simplified Chinese interface rather than English, and each page declares the language its strings are actually in (pt-BR, zh-CN). The store name is now SceneVoice: AI Audio Description for Video (the old one did not fit the 45-character limit), and the summary names both sites in every language.
- Settings page: when the second key is saved, a site that had the first key's model only for want of the other goes back to its usual one (Gemini on YouTube, Qwen on Bilibili), and the key status says so. Voices can now be saved for any description language, not only the ones with tables.
- Ask dialog: the Send button in dark mode now has enough contrast (5.2:1; it was 3.9:1).
- A project website under
site/(English and Simplified Chinese, written for screen-reader users first): hear a sample through the screen reader or the browser's voice, how it works, install links, who it is for, privacy, and the plans. No scripts or fonts from elsewhere, no analytics;site/check.mjsfails the build on any axe violation, missing link target or contrast below 7:1, and.github/workflows/pages.ymlpublishes it to GitHub Pages once that is switched on. Stores that are not open yet are plain text, not links to#; the Hear it buttons stay hidden until the script that drives them has loaded, with a<noscript>note otherwise; the share preview card is a PNG (site/assets/og.png, rendered from the SVG byscripts/make_og.py); the Chinese page, and the welcome page in a Chinese interface, link the Chinese privacy policy; the install text no longer claims a store review or a Gitee release that do not exist yet. - Release engineering.
npm run release -- <version>cuts the CHANGELOG, sets the version, runs the tests and build, commits and tags (nothing is pushed). Av*tag builds, tests, runs the end-to-end suite, checks that tag, package and CHANGELOG agree, and publishes a GitHub Release with the extension zip, external source maps andSHA256SUMS; with a store's secrets all set (five for the Chrome Web Store,CWS_PUBLISHER_IDincluded, three for Edge) it also uploads a draft to that store (never publishes), each store independently of the other, and the store credentials reach only the upload steps. CI pins every action to a commit, caches npm and pip, fails when the content script passes 120 KB (in CI, on a tag, and innpm run release), and refuses a package with dotfiles or source maps inside. NewSECURITY.md,PRIVACY.zh-CN.md,docs/release.md, issue and pull-request templates, Dependabot and CODEOWNERS;docs/store-listing.mdanswers the Chrome Web Store data-usage form andnpm run screenshotscaptures the store screenshots from the real pages. - After an adversarial review of all of the above (75 findings, 37 confirmed by three independent checks each), the fixes: screen readers that switch voice by language hear status, errors and notices in the interface language and only the descriptions in the description language; in pause mode with the built-in voice a description is spoken in a hidden tab too, instead of the video silently pausing and resuming; the speed shortcuts re-fit descriptions to the dialogue like the settings page does; a description that waited for a pause gets that pause's room; a picture description the model could not time is said in a pause the subtitles show whatever its priority; billed replies that could not be read still count in Usage today; a video already being described when the daily limit is reached keeps reporting its progress. Welcome page: My own key is preselected and Cloud is not called recommended until the relay is live; the built-in voice can be stopped, is stopped before the screen reader path starts, and says so when it cannot speak; Start free failures are one sentence with one remedy, and the per-network device limit is named. Settings: a device token the relay no longer knows is removed on sight and Start free comes back. Sharing sends the corrected descriptions, never one marked wrong. Relay: output and thinking tokens are metered too, free-plan models are anchored to the flash text models on both routes, a shared description is uploaded only by a device that had video described, at most 20 a day, and the first stored is never overwritten; deleting a licence record revokes the plan; one device may start at most 60 calls a minute. Extension pages declare the language actually shown when a translation is missing; Traditional Chinese has every string, and the build refuses a language that lacks a string spoken mid-video; the Chinese product names left Spanish, Hindi, Russian and Vietnamese labels. Release: the store secrets reach only the upload steps, the Chrome Web Store step needs all five secrets or is skipped, a failed Chrome upload no longer skips Edge, and the 120 KB gate really fails the build. Documents: the privacy policy in both languages now describes both paths and carries the same date; README, the website, the store listing's data-usage ...