Skyderby
Turn GPS tracks from your skydives and BASE jumps into real flight analysis — plus worldwide rankings and competition scoring. Free to start.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Web app for following Finnish pesapallo live events with spoken voice announcements. Pesisselostaja on selaimessa toimiva pesäpallon live-seuranta, joka lukee ottelun tärkeimmät tapahtumat ääneen suomeksi. Se on tarkoitettu tilanteisiin, joissa haluat seurata peliä ilman että katsot koko ajan tulospalvelua. Jaksojen ja palojen seuranta on vielä vajaa ja kertoo välillä vääriä arvoja.檢視完整 README ↗
Web app for following Finnish pesapallo live events with spoken voice announcements.
Pesisselostaja on selaimessa toimiva pesäpallon live-seuranta, joka lukee ottelun tärkeimmät tapahtumat ääneen suomeksi. Se on tarkoitettu tilanteisiin, joissa haluat seurata peliä ilman että katsot koko ajan tulospalvelua. Jaksojen ja palojen seuranta on vielä vajaa ja kertoo välillä vääriä arvoja.
👉 Avaa sovellus: https://midnight-builds.github.io/pesisselostaja/
Käyttö:
Jaa ottelu: Jokaisella ottelulla on oma osoite (#ottelu/<id>), joka näkyy selaimen osoiterivillä ottelua seuratessa. Ottelunäkymän Jaa-napista voit lähettää linkin eteenpäin (tai kopioida sen leikepöydälle) — linkistä ottelu avautuu suoraan. Ottelunäkymästä pääsee myös katsomaan ottelun tarkemmat tilastot pesistulokset.fi-palvelussa (aukeaa uuteen välilehteen).
Vinkki – parempi ääni: Asetuksista voit valita käytettävän puheäänen. Oletuksena käytetään selaimen omaa puhesyntetisaattoria, mutta ottamalla käyttöön Edistynyt ääni (Piper) saat luonnollisemman suomenkielisen neuroverkkoäänen, joka toimii kokonaan selaimessa. Piperin oletusääni on yhteisömalli Asmo (CC BY-NC 4.0, tekijä AsmoKoskinen, epäkaupalliseen käyttöön — ks. CREDITS.md ennen tämän projektin kaupallista forkkausta); vaihtoehtona on myös Harri-ääni (CC0, lähde rhasspy/Piper). Ääni ladataan kerran ja tallennetaan selaimeen, joten se on heti käytössä seuraavilla kerroilla. Jos lataus ei onnistu, sovellus palaa selaimen omaan ääneen. Piper- ja ElevenLabs-äänille voi lisäksi kytkeä päälle Kaiutintilan, joka vahvistaa selostuksen normaalia kovemmalle esimerkiksi ulkokäyttöön kännykän kaiuttimesta. Kolmas vaihtoehto on ElevenLabs (oma avain): laadukkain ääni, joka syntetisoidaan ElevenLabsin pilvipalvelussa omalla API-avaimellasi. Avain tallentuu vain omaan selaimeesi ja synteesi kuluttaa omia ElevenLabs-krediittejäsi; virhetilanteessa (esim. krediitit loppu) sovellus palaa selaimen ääneen. Käytettävän äänen voi vaihtaa syöttämällä oman Voice ID:n samaan asetuskohtaan; tyhjänä käytetään oletusääntä. Äänten lähteet ja lisenssit: CREDITS.md.
Sovellus käyttää pesistulokset.fi-palvelun otteludataa. Tämä projekti on itsenäinen, eikä se ole pesistulokset.fi:n tekemä, hyväksymä tai sponsoroima.
Pesisselostaja turns live Finnish pesäpallo match updates into spoken Finnish announcements. The public web UI runs in the browser and can speak important match events with the Web Speech API. You can pick which voice to use in the settings, including an optional advanced neural voice (Piper) that produces a more natural Finnish voice entirely in the browser.
The repository also contains a broadcast pipeline (apps/broadcast) that can
republish a live YouTube stream with the same Finnish narration mixed on top,
and a control app (apps/control, "ohjaamo") that runs the whole broadcast
day from the operator's phone — picking the match, creating both YouTube
broadcasts, starting the relay and cleaning up afterwards.
Left to right: live match list, favorites tab, voice-active match view.
Alpha / public preview.
What works now:
apps/broadcast).apps/control) that drives that pipeline end to end: one state card per match, from picking the game to cleaning up after it.Known limitations:
Pesisselostaja uses live match data from pesistulokset.fi. This project is independent and is not affiliated with, endorsed by, or sponsored by pesistulokset.fi. The data source and API behavior may change without notice.
Open the public web app:
https://midnight-builds.github.io/pesisselostaja/
The web app can:
No server account is required. The web app stores settings locally in the browser.
An npm-workspaces monorepo: one platform-agnostic domain core, three thin apps.
| Workspace | What it is |
|---|---|
packages/core | Pure domain logic: types, pesistulokset API client, speech text generation, scoring, pronunciation substitution. No localStorage, no fs, no DOM. |
apps/web | The mobile browser app (Vite). Browser adapters: localStorage persistence, Web Speech / Piper-WASM voices. Deployed to GitHub Pages. |
apps/broadcast | The YouTube broadcast pipeline: pulls a live stream with yt-dlp, mixes synthesized narration (ElevenLabs API, native-Piper fallback) with ffmpeg, republishes over RTMP. Node adapters: file persistence, ElevenLabs/Piper TTS. See apps/broadcast/README.md. |
apps/control | The ohjaamo: mobile control app on :3002 that owns the broadcast chain — match selection, creating the YouTube broadcast pair, the start guard, in-match controls and cleanup. This is how a match day is run; nobody edits config files or runs systemctl on the normal path. See apps/control/README.md. |
apps/server | Minimal static file server hosting the built web app on :3000. |
Persistence goes behind small ports defined in core (WatcherStateStore,
PronunciationStore); each app supplies its own adapter.
packages/core).packages/core/src/speech.ts).npm ci
npm run lint # all workspaces
npm test # root vitest, covers all workspace test dirs
npm run typecheck # all workspaces
npm run build # all workspaces
Single workspace: npm run typecheck -w @pesisselostaja/web etc.
Workspace names: @pesisselostaja/core, @pesisselostaja/web,
@pesisselostaja/broadcast, @pesisselostaja/server.
apps/server is a minimal static file server that hosts the built web app on
port 3000 (systemd unit pesisselostaja.service runs
node apps/server/dist/index.js from the repo root). Old /v2/ bookmarks
redirect to /. It serves files only — no watcher and no API endpoints; the
browser app talks to pesistulokset.fi directly.
Note: the old v1 server's POST /api/debug-log endpoint (mobile ?debug=1
logging to debug.log) was dropped with v1 — ?debug=1 posts now fail
silently, same as on the GitHub Pages deployment.
The optional advanced neural voice uses Piper voice models and a speech stack that have their own licenses. They are downloaded in the browser at runtime and are not bundled in this repository:
fi_FI-harri) — CC0 1.0, from rhasspy/Piper (Finnish Single Speaker Speech Dataset).fi_FI-asmo-medium) — CC BY-NC 4.0 by AsmoKoskinen; a non-commercial community model, used with attribution.@diffusionstudio/piper-wasm (embeds espeak-ng, GPL-3.0-or-later), onnxruntime-web (MIT).Full attribution, source links and license notes are in CREDITS.md.
The canonical machine-readable list lives in apps/web/src/piper.ts.
This project's own code is MIT. See LICENSE. Third-party voices and libraries keep their own licenses — see CREDITS.md.