尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗A web app that listens to a video playing in the room, recognises it, and plays the audio-described version in sync, so someone with headphones can follow along with the description. Recognition runs entirely on the phone; the site is static and can be hosted on GitHub Pages.
docs/data/: catalog.json (titles,
video URLs, time maps), auto/*.bin (full fingerprints of the shorter
videos, such as songs), coarse/*.bin (a thinned-out copy of every other
video's fingerprints, used to shortlist candidates) and v/<n>.bin (one
small file per video, downloaded when it is shortlisted or picked from the
list).docs/). It records the microphone, fingerprints the last 15
seconds every half second (reusing the analysis of the sound it has already
heard), and looks them up in the index: this week's songs first, then the
other songs, then every video. Once two matches in a row agree (three for a
song accepted on less evidence), it opens the described video at the
matching position.GitHub builds the fingerprint library on its own servers and publishes the app.
.github folder; if your browser skips it, create
.github/workflows/library.yml by hand and paste the file in).https://<you>.github.io/<repo>/.After that:
manifest.json in the
repository. Open it on GitHub, click the pencil icon, and for any entry under
"unpaired" fill in "original" with the original video's download link.
Then run the workflow again. Your edits are kept on every later run.S for Spanish).Requires Python 3.9+ and ffmpeg on your PATH.
cd indexer
pip install -r requirements.txt
python discover.py --out ../manifest.json --merge ../manifest.json
python build_index.py ../manifest.json
Check the log from the last step. Each video should show one aligned segment,
or several if the described version adds narration pauses. could not align
means the pair is probably wrong.
python tests/serve.py # then open http://localhost:8000/docs/
localhost is allowed to use the microphone without HTTPS. Play one of the
original videos from another device (a TV, a laptop) and press Start listening.
python tests/make_fixture.py
python indexer/build_index.py tests/fixtures/manifest.json --out tests/fixtures/data --auto-max-minutes 1.2 --coarse-budget-mb 0.02
node tests/roundtrip.mjs # recognition accuracy in simulated rooms
python tests/serve.py # open http://localhost:8000/docs/?data=../tests/fixtures/data/
For the demo page, play tests/fixtures/song_a.wav out loud from another device.
The fingerprint files are not stored in the repository. The workflow publishes them straight to GitHub Pages, which allows 1 GB per site. The phone downloads two lists when the app opens:
auto/*.bin (up to 40 MB): full detail for videos up to 10 minutes (songs, short clips), shortest first.coarse/*.bin (up to 25 MB): a thinned-out copy of every other video.After the first visit these stay on the phone (see Install it like an app), so repeat visits cost almost no bandwidth, even with many users.
When the coarse list suggests a video, the app downloads that video's own
small file, checks it in full, and only then starts playing. Every video can
be recognised automatically; picking one from the list just skips the search.
The limits can be changed with --auto-max-minutes, --auto-budget-mb and
--coarse-budget-mb.
Songs are hardest to catch, because once everyone starts singing the room is mostly voices. Tell the app which songs are coming, and every phone listens for those first and recognises them on much less evidence, usually during the instrumental introduction.
12, 45, 151, 3, 98
(both meetings together). Optionally type a date to set a future week.Every phone picks the list up within a few minutes (when the app is opened or
brought back to the screen); the library is not rebuilt. A list is used for its
week and up to 10 days after its Monday. The songs also appear in the app under
Meetings for quick manual choice. They are stored in songs.json.
The app searches in this order: first this week's songs, then every other song (for example the public talk's song, which is not in the program), and only then the rest of the videos. A song heard near its beginning is accepted on less evidence if it clearly beats the other songs, is not beaten by a video, and keeps winning; while a song is being confirmed, the rest of the library is not searched or downloaded. In tests with loud congregation singing in an echoey hall, songs were found in 9 of 10 cases without a list and 10 of 10 with one (most within 4–8 seconds), with no false alarms on talks or other music.
Share one link: send people the app's address (for example
https://<you>.github.io/<repo>/). When they open it on a phone, the first
screen walks them through installing it:
The app always opens on Described. Until the microphone is allowed, the sphere is an Allow microphone button with a short explanation below; if the microphone was refused before, it explains how to turn it back on. Meetings, Library and Settings can already be used in the meantime.
Described can be installed on a phone's home screen, like a regular app:
Once opened, the app keeps itself and its video library on the phone. It starts instantly and works on poor Wi-Fi; the sound still streams from jw.org, so an internet connection is needed to play. When the library is updated, the phone downloads only the pieces that changed (the library is split into pieces of 25 videos). App updates are picked up in the background and apply the next time the app is opened.
The app has four sections, built for VoiceOver (iPhone) and TalkBack (Android):
Tips:
Safari requires the starting tap before it will play sound, and the app handles that. With the microphone active, iOS may route sound to the earpiece unless headphones are connected, which is another reason to use headphones. Keep the page open; iOS pauses web audio when the screen locks. The app requests a wake lock to prevent that.
docs/js/engine.js → TUNING controls recognition thresholds and sync
behaviour. Fingerprint parameters live in both indexer/fingerprint.py
and docs/js/fingerprint.js. They must match; the app refuses to load an index
built with different values. After changing them, rebuild the index and run
node tests/roundtrip.mjs.
indexer/ discover.py, build_index.py, fingerprint.py, set_songs.py (Python)
songs.json this week's meeting songs (set with the "Set meeting songs" workflow)
.github/ workflows/library.yml (builds the library and publishes the app)
workflows/songs.yml (the "Set meeting songs" form)
docs/ the web app (GitHub Pages root)
js/ fingerprint.js matcher.js engine.js mic-worklet.js app.js
data/ catalog.json, auto/, coarse/, v/ (generated by the workflow)
sw.js offline support; its VERSION is stamped by build_index.py
icons/ app icons
tests/ fixtures generator, Node round-trip test, dev server with Range support
The app streams the described videos from jw.org's own CDN. It never hosts them, and the index contains only fingerprints (not audio). jw.org's Terms of Use still restrict automated downloading and apps built on their content, though, so read them and ask for permission before publishing this beyond personal use.