CalisCoaching
Nhật ký vận động cá nhân, buổi tập calisthenics trực tiếp và bản tóm tắt có nguồn xác thực.
Translation pending
Web app for following Finnish pesäpallo live events with spoken voice announcements
Translation pending
Sports & fitnessTypeScript · CSSGitHub @midnight-buildsOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
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.Read the full 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.