Kalamarama - webowa, mainly-audio gra multiplayer

Hi. Jestem jedną z tych osób z ASP, które były w HS dwa tygodnie temu. Mam dosyć spory pomysł na projekt, i potrzebowałabym trochę pomocy przy nim, zarówno szprętowo (potrzebuję postawić serwer webowy i internetowy audio stream) jak i wiedzowo (nie wiem jaki tech stack tu wykorzystać, są też inne problemy do rozwiązania)

Mój projekt: Kalamarama (nazwa robocza)

  • Gra webowa a là MMO, której właściwie jedynym outputem jest stream audio. Gracze mogą czatować ze sobą za pomocą systemu “easy chat” - wybieranie fraz albo słów z nested dropdown menu. Wiadomości są czytane przez TTS.
    • jest limit słów i fraz w jednej wiadomości
    • można ustawić sobie nick, max 12 znaków. Ale nie ma weryfikacji ani kont
  • Można “zaglądać” do gry z dowolnego oprogramowania które może odtwarzać streamy audio (np. VLC) ale żeby brać w niej udział trzeba wejść na stronę internetową
  • jest kilka “pokoi”. Każdy pokój ma własne:
    • stronę internetową
    • stream audio
    • dostępne frazy i słowa
    • BGM / SFX / ambience, które gra kiedy nie ma wiadomości do odczytania
  • pomysły na pokoje:
    • pokój główny (“Town Square”?)
      • ogólne słowa i frazy do komunikacji
    • pokój efektów dźwiękowych (“Meow Mansion”?)
      • zamiast TTS, każde słowo/fraza odpowiada efektowi dźwiękowemu
    • pokój toki pona (" Ponaland"? “Mapona” ?)
      • Dozwolone tylko słowa z tego języka (jest ich ok. 137)

Potencjalne problemy

  • wymyślenie tech stacka
  • hostowanie tego przez dłuższy czas (na razie myślę żeby na kilka dni odpalić to jak już będzie gotowe, ale fajnie by było dłużej)
  • brak authu graczy (wolałabym żeby to było bez kont itp…)
  • botowanie / mass submitting

Projekt chcę rozwijać i udostępnić pod wolną licensją, jeszcze nie wiem jaką.

Będę tu pisać jak jeszcze coś przyjdzie mi do głowy, ale na razie właśnie mam dwa główne pytania: jaki tech stack tu możnaby użyć? i czy mogłabym takie coś postawić w hackerspace?

Ja bym to próbował zrobić w oparciu o owncast.
Najczęściej jest używany do streamowania video ale internetowe radia też są na tym robione.
Najważniejsze, że:

  • ma wbudowany chat serwer, który nie wymaga autoryzacji ale może ją mieć (w oparciu o konto fedi albo indieauth)
  • ma api do robienia rzeczy na tym chacie
  • można na jednym serwerze mieć wiele “pokoi”
  • jest foss :heart:
  • jest fediverse :heart:

TTS który można wykorzytać, dobrej jakości, lokalny, oparty na modelu ML, z polskimi głosami to np piper (próbki głosów) .

Wszystko w/w nie wymaga jakiegoś mega hardware’u i na początek wszystko można upchać na raspberry pi albo na jakimś demobilowym terminalu (aka kektop).

Ten język jest nieźle zakręcony ale ma świetną warstwę wizualną, którą też można by wykorzystać przy takiej kreacji.

Muszę kiedyś siąść i nauczyć się tego systemu pisania, haha.

Co do owncasta - zależy mi żeby to był stream audio. I myślę że to jest zbyt robust software na to co chcę zrobić… Myślałam bardziej o icecast, albo czymś podobnym

Wyobrażam to sobie tak, że przez POST jest wysyłany string z nickiem i określonej wielkości array zawierający wartości identyfikujące poszczególne frazy (0 = brak), w jakiś sposób to jest wysyłane do lokalnego skryptu na serwerze który handluje queue wiadomości. I ten skrypt po prostu odtwarza odpowiednie audio w streamie. Pewnie coś z miksowaniem i routowaniem audio trzeba by było zrobić żeby było kilka streamów…

tak sobie myślę i ja bym się za to zabrał tak:

  • serwer icecast do strumieniowania na zewnątrz,
  • własna aplikacja wystawiająca API po HTTP takie jak mówisz, czyli przyjmująca nicka i wybór kolejnych tekstów.
    • Na początek aplikacja może nawet generować tymczasowe pliki dźwiękowe, które możnaby wrzucać w stream za pomocą czegoś w stylu How to broadcast to Icecast2 by using ffmpeg (FLAC,Opus,Vorbis,AAC,MP3/Windows, Mac) · GitHub
    • Można pomyśleć o wygenerowaniu fraz wybieranych z menu wcześniej, żeby później nie musieć tego robić w kółko (minus - będzie to pewnie gorzej brzmiało, bo dobry TTS będzie w stanie płynnie przechodzić od słowa do słowa, ale oszczędności na pewno będą)
    • Osobiście zrobiłbym kolejkowanie wiadomości zamiast miksowania. Tak, żeby jedno odtwarzało się po drugim, a nie nachodziło na siebie.

W pierwszej wersji nie przejmowałbym się “kilkoma strumieniami”. Icecast zdaje się wspierać niezależne strumienie (“mountpoints”), więc można to pewnie dorobić później.

Full disclosure: nie pracowałem z icecast, więc to są rozważania czysto teoretyczne.

W sumie obydwa w/w serwery (owncast i icecast) mogą streamować zarówno audio jak i video. Wszystko zależy co wrzucimy w stream. Może być samo audio.
W owncast taki custom stream (czyli nie z gotowego katalogu plików tylko tworzony dynamicznie) też można zbudowac przy użyciu ffmpeg: ffmpeg - Owncast .
Główna różnica wydaje się w tym icecast to jest bardzo proste narzędzie - wystawia stronę z listą aktualnie aktywnych strumieni i to wszystko. Taki klocek z którego coś można dopiero zbudować. Np widzę że wszędzie gdzie jakieś przyklady są to jest to sklejane czymś takim jak https://www.liquidsoap.info - który automatyzuje rózne rzeczy typu miksowanie strumieni, kolejkowanie itp.

Utworzyłam repo: drakonic/kalamarama: Social Audio Web Game/Toy - Codeberg.org
Na razie jest tam tylko jakiś prototyp template’u frontowego

Będę teraz oswajać się z frameworkiem Flask i Icecastem :)

2 Likes

Od Forum otwarte do Projekty

Mam roboczo listy słów i fraz, chciałabym jakoś automatycznie wygenerować z tego pliki audio zawierające text-to-speech.

Same festival działa na moim laptopie, ale text2wave nie - za każdym razem wywala segfaulta z jakiegoś powodu. Szukałam i coś przeczytałam że z tym skryptem są problemy na Arch Linuxie, może dlatego, nie wiem.

Też nie wiem jak obejść że text przekazywany do text2wave MUSI być w formie pliku… Chcę wygenerować dla każdej linii tekstu osobny plik.

Wolałabym zostać przy festivalu, bo tego używa też liquidsoap i parę rzeczy będzie dynamicznie generowane. :T

Jeśli ten festival nie umie inaczej niż z pliku a nie chcesz generowac jakiś plików tymczasowych z tekstem to można użyć festival jako biblioteki i ona tam ma już generowanie z tekstu przekazanego parametrem. Np do pythona jest taki wrapper do tej biblioteki: GitHub - techiaith/pyfestival: Amlapiwr Python C ar gyfer hwyluso rhaglennu gyda Festival | A Python C wrapper for simple coding with Festival