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.