Přeskočit obsah

2025

Speech to Text aneb jak na Linuxu diktovat do libovolné aplikace

Cíl

Na Ubuntu 24.04 chci rozběhnout open-source aplikaci WhisperWriter.

A small dictation app using OpenAI's Whisper speech recognition model.

K čemu je to dobré

Výsledek vypadá takhle:

demo animace

Zmáčknu klávesovou zkratku (třeba Ctrl + Shift + mezerník) a mikrofon začne nahrávat co říkám. Když klávesovou zkratku pustím, aplikace vypíše do libovolného(!) místa, ve kterém bliká kurzor, přepis řečeného. Diktovat je možné česky, anglicky a v mnoha dalších jazycích.

Postup instalace

V oficiálním postupu to není uvedeno, ale na mém Ubuntu a pro Python 3.11 byly pro úspěšné spuštění aplikace potřeba tyhle balíčky:

# sudo apt install --reinstall libbrotli1=1.1.0-2build2
sudo apt install libcairo2-dev libgirepository1.0-dev

Víc tu.

A pak už postupuji podle dokumentace (jen používám uv):

mkdir -p ~/opt/whisper-writer/ && cd $_
git clone https://github.com/savbell/whisper-writer src && cd $_
uv venv
uv pip install -r requirements.txt pycairo PyGObject

Při prvním spuštění pomocí uv run ./run.py se zobrazí tohle okno pro nastavení aplikace:

nastavení

Aplikaci je možné spouštět takhle:

cd ~/opt/whisper-writer/src/ && uv run ./run.py

Volba modelu

Místo Whisper modelů stažených do počítače, které pro češtinu vrací nepřesvědčivé výsledky (alespoň na mém PC), jsem šel cestou placeného modelu whisper-large-v3-turbo od firmy Groq (https://groq.com/pricing/). Stojí přibližně 1 CZK ($0.04) za hodinu diktování (zdroj). To je 9x méně než kolik stojí Whisper od OpenAI ($0.04 vs $0.36).

Takže v nastavení aplikace jsem vyplnil:

model: whisper-large-v3-turbo
base url: https://api.groq.com/openai/v1
api key: tajný klíč z https://console.groq.com/keys

Víc případně tu.

Vytvoření spouštěče v menu

V Ubuntu mám aplikaci MenuLibre, v které je možné snadno spravovat položky v menu.

Vytvořil jsem pro WhisperWriter spouštěč ~/.local/share/applications/menulibre-whisper-writer.desktop, který obsahuje:

[Desktop Entry]
Version=1.1
Type=Application
Name=whisper-writer
Icon=microphone
Exec=uv run ./run.py
Path=/home/jan/opt/whisper-writer/src/

Bylo potřeba uvést plnou cestu /home/jan/opt/whisper-writer/src/, s ~/opt/whisper-writer/src/ se aplikace odmítala spustit.

Může se hodit

Další aplikace, na které jsem narazil při rešerši.

dsnote

https://github.com/mkiol/dsnote

Speech Note Linux app. Note taking, reading and translating with offline Speech to Text, Text to Speech and Machine translation.

  • Takhle vypadá.
  • Umožňuje diktovat, ale ne do libovolné aplikace.
  • Používá model whisper.cpp a další.

dictation.io

https://dictation.io/speech

  • Velmi jednoduché diktování zdarma.
  • Přímo v internetovém prohlížeči, bez instalace.
  • Funguje jen v Google Chrome. Umí i příkazy jako nový řádek, čárka, atd.
  • Podobná aplikace: https://speechnotes.co/dictate/. Ta ale neumí diktovat interpunkci.

nerd-dictation

https://github.com/ideasman42/nerd-dictation

Simple, hackable offline speech to text - using the VOSK-API.

This is a single file Python script with minimal dependencies.

TalkTastic

https://talktastic.com

Write with your voice in any app on macOS.

  • Na okraj: aplikace pro macOS.
  • Zatím zdarma („TalkTastic is 100% free to use while in Beta.“).
  • Ještě jedna podobná pro macOS: superwhisper (placená).

Závěr

Kombinace aplikace WhisperWriter a modelu whisper-large-v3-turbo od firmy Groq funguje skvěle!

Zprovoznění aplikace Healthchecks na vlastním serveru

Cíl

Na Ubuntu 24.04 chci rozběhnout open-source aplikaci Healthchecks.

K čemu je to dobré

Cituju z dokumentace:

Healthchecks.io is a service for monitoring cron jobs and similar periodic processes:

  • Healthchecks.io listens for HTTP requests ("pings") from your cron jobs and scheduled tasks.
  • It keeps silent as long as pings arrive on time.
  • It raises an alert as soon as a ping does not arrive on time.

Healthchecks.io works as a dead man's switch for processes that need to run continuously or on a regular, known schedule. Some examples of jobs that would benefit from Healthchecks.io monitoring:

  • filesystem backups, database backups
  • task queues
  • database replication monitoring scripts

Healthchecks.io is not the right tool for:

  • monitoring website uptime by probing it with HTTP requests
  • collecting application performance metrics

Zprovoznění aplikace

Vycházím z:

Zdrojový kód, virtuální prostředí a instalace závislostí

git clone https://github.com/healthchecks/healthchecks.git healthchecks && cd healthchecks
git checkout v3.9 # viz https://github.com/healthchecks/healthchecks/releases
uv venv
source .venv/bin/activate
uv pip install -r requirements.txt
uv pip install gunicorn
# uv pip list

cat << EOF > .env
# https://healthchecks.io/docs/self_hosted_configuration/
[email protected]
ALLOWED_HOSTS=health.example.com,localhost
DEBUG=False
[email protected]

EMAIL_HOST='live.smtp.mailtrap.io'
EMAIL_HOST_USER='api'
EMAIL_HOST_PASSWORD='insert the email password here'
EMAIL_PORT=587
# Note that EMAIL_USE_TLS (587) / EMAIL_USE_SSL (465) are mutually exclusive, so only set one of those settings to True.
EMAIL_USE_TLS=True
EMAIL_USE_SSL=False

EMAIL_USE_VERIFICATION=False
REGISTRATION_OPEN=False
SECRET_KEY='$(tr -dc 'a-zA-Z0-9!@#$%^&*()-_=+' < /dev/urandom | head -c 64)'
[email protected]
SHELL_ENABLED=False
SITE_NAME='Mychecks'
SITE_ROOT='https://health.example.com'
EOF

chmod 0600 .env
./manage.py migrate
./manage.py createsuperuser
# ./manage.py test
# ./manage.py runserver

Stalo se mi, že ./manage.py … hlásí settings.EMAIL_HOST is not set, cannot send email, přestože je proměnná EMAIL_HOST v .env nastavená.

Znamená to, že si ./manage.py nevyzvedává nastavení z .env. To je pitomé, ale řešitelné pomocí set -a; source .env; set +a;.

Pro danou terminálovou relaci (~session) pak ./manage.py … funguje podle očekávání.

systemd a nginx

Tyhle kroky provádím jako root.

Vytvoření a spuštění systemd služby.

cd /etc/systemd/system/

cat << EOF > healthchecks.service
[Unit]
Description=Healthchecks App
After=network.target

[Service]
Type=simple
User=web
Group=web
WorkingDirectory=/home/web/p/healthchecks/
# Bez následujícího řádku se proměnné prostředí nastavené v .env nepoužijí!
EnvironmentFile=/home/web/p/healthchecks/.env
ExecStart=/home/web/p/healthchecks/.venv/bin/gunicorn --workers 3 --bind 0.0.0.0:8000 --timeout 120 hc.wsgi:application

Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable healthchecks.service
systemctl start healthchecks.service

# systemctl status healthchecks.service
# journalctl -u healthchecks.service -f
# systemctl restart healthchecks.service

Pro odesílání upozornění z aplikace je potřeba ještě systemd služba healthchecks-sendalerts.service:

[Unit]
Description=Healthchecks Sendalerts
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=web
Group=web
WorkingDirectory=/home/web/p/healthchecks/
EnvironmentFile=/home/web/p/healthchecks/.env
ExecStart=/home/web/p/healthchecks/.venv/bin/python -u /home/web/p/healthchecks/manage.py sendalerts

Restart=always

# během 120 sekund může dojít k maximálně 5 pokusům o restart
RestartSec=20
StartLimitInterval=120
StartLimitBurst=5

[Install]
WantedBy=multi-user.target

Následně tedy:

systemctl daemon-reload
systemctl enable healthchecks-sendalerts.service
systemctl start healthchecks-sendalerts.service

Volitelně je možné vytvořit ještě dvě další systemd služby pro:

./manage.py sendreports # sends out monthly reports, weekly reports, and the daily or hourly reminders
./manage.py smtpd --port 2525 # https://github.com/healthchecks/healthchecks/#receiving-emails

Instalace a konfigurace nginx, vystavení TLS certifikátu.

apt install nginx
systemctl status nginx

ufw allow 'Nginx HTTP'
ufw allow 'Nginx HTTPS'
ufw status

cd /etc/nginx/sites-available/

cat << 'EOF' > health.example.com
# Redirect HTTP to HTTPS
server {
    listen 80;
    server_name health.example.com;
    return 301 https://$server_name$request_uri;
}

# HTTPS server
server {
    listen 443;
    server_name health.example.com;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Timeout settings
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
}
EOF

ln -s /etc/nginx/sites-available/health.example.com /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx

# apt install certbot python3-certbot-nginx
certbot --nginx -d health.example.com
# certbot renew --dry-run
# systemctl status certbot.timer

Následné aktualizace

Každá aktualizace pak probíhá takhle:

# Stáhne informace o "tags" a pak přepne na nejnovější tag.
# git fetch --all --tags
# git checkout $(git describe --tags $(git rev-list --tags --max-count=1))
# git status
set -a; source .env; set +a;
./manage.py compress --force
./manage.py collectstatic
./manage.py migrate
# Následně "systemctl restart healthchecks.service healthchecks-sendalerts.service" jako root.

Postgres

Kdybych chtěl místo výchozí SQLite použít databázi Postgres, hodí se tyto návody pro její zprovoznění:

Vlastně je to docela jednoduché:

apt install -y postgresql-common
/usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
apt-cache depends postgresql
apt install postgresql
sudo -u postgres psql
    CREATE USER healthchecks WITH PASSWORD 'tajne_heslo';
    CREATE DATABASE healthchecks OWNER healthchecks;
    GRANT ALL PRIVILEGES ON DATABASE healthchecks TO healthchecks;
    \q

Databázi chci přístupnou jen z localhostu, ne zvenku. Že to tak je, můžu zkontrolovat takhle:

netstat -tulpn | grep postgres
psql "postgresql://healthchecks:tajne_heslo@localhost:5432/healthchecks" -c "show listen_addresses;"

Vzhledem k tomu, že databáze není přístupná zvenku, není - myslím - potřeba:

ALTER USER postgres with encrypted password 'strong_password';

Pak je ještě nutné do .env přidat:

DB="postgres"

DB_HOST="localhost"
DB_PORT="5432"
DB_NAME="healthchecks"
DB_USER="healthchecks"
DB_PASSWORD="tajne_heslo"

Smyčka přesměrování

Po provedení výše uvedeného mi prohlížeč hlásil ERR_TOO_MANY_REDIRECTS.

S debugováním mi pomohlo:

curl -I http://127.0.0.1:8000
curl -IL http://127.0.0.1:8000

Příčina byla v nastavení SSL/TLS encryption na Cloudflare. Bylo potřeba přepnout encryption mode z Flexible na Full (strict).

Víc tu:

Redirect loops will occur if your origin server automatically redirects all HTTP requests to HTTPS.

A tu:

The reason for “too many redirects” is if you have an http->https redirect on your origin server. The client connects over https, but Cloudflare connects to your origin on http, which returns a redirect to https, which connects over http to be redirected to https and so on forever until the browser gives up.

Není to specifické pro Healthchecks, došlo by k tomu u libovolné služby s výše uvedenou nginx konfigurací a nastavením Cloudflare.

Alternativa k Healthchecks

Uptime Kuma.

Nabízí více typů monitorů:

Monitoring uptime for HTTP(s) / TCP / HTTP(s) Keyword / HTTP(s) Json Query / Ping / DNS Record / Push / Steam Game Server / Docker Containers.

Z výše uvedených monitorů nabízí Healthchecks vlastně jen Push.

Na druhou stranu má Uptime Kuma výrazně horší dokumentaci. Aplikace je napsaná v JavaScriptu, takže pro provoz bez Dockeru je nutné mít na serveru Node.js a npm. Já dávám přednost kombinaci Python a uv, i proto raději použiju Healthchecks.

Uptime Kuma také neumí - stejně jako Healthchecks - hledat řetězec na „SPA webu“:

The website is most likely an SPA, meaning content is loaded by JavaScript after initial page load. Currently you cannot check the content of such a website.

Závěr

Aplikace běží, můžeme se přihlásit s údaji vytvořenými pomocí ./manage.py createsuperuser na https://health.example.com.

Může se hodit:

Rozběhnutí aplikace Superset bez Dockeru

Cíl

Mám Ubuntu 24.04 a chci rozběhnout aplikaci Apache Superset.

Postup

Vycházím z oficiální dokumentace obohacené o pár triků:

  • Metadatabáze je uložená přímo ve složce projektu a ne v ~/.superset/superset.db.
  • Tajnosti typu SUPERSET_SECRET_KEY jsou uloženy v souboru .env.
  • Pro instalaci závislostí použiju nástroj uv.
  • V souboru pyproject.toml definuji, že se má použít Python ve verzi 3.11, protože novější verze zatím nejsou podporované.

Připravil jsem skript, který výše uvedené zařídí. Takhle je možné ho spustit:

curl -sSL https://gist.githubusercontent.com/fertek/53a90e275c08cae5a406a6649df5b7af/raw/ | bash

Kromě závislostí typu build-essential zmíněných v dokumentaci je nutné ještě:

sudo apt install clang

Bez něj končil build Python balíčku python-geohash chybou.

Následně:

# Instalace balíčku apache-superset a závislostí do virtuálního prostředí ve složce .venv
uv sync

# Aktivace virtuálního prostředí
source .venv/bin/activate

A dál už je to shodné s dokumentací:

# define mandatory configurations
export FLASK_APP=superset SUPERSET_CONFIG_PATH=./superset_config.py

# initialize the metadata database
superset db upgrade

# create an admin user in your metadata database
superset fab create-admin

# create default roles and permissions
superset init

# start a development web server
superset run -p 8088 --with-threads --reload --debugger

Hotovo. Na http://localhost:8088/ je možné se přihlásit.

systemd a nginx

Může se hodit.

/etc/systemd/system/superset.service:

[Unit]
Description=Apache Superset
After=network.target

[Service]
Type=simple
User=web
Group=web
WorkingDirectory=/home/web/p/superset/
ExecStart=/home/web/p/superset/.venv/bin/gunicorn -w 10 -k gevent --worker-connections 1000 --timeout 120 -b 0.0.0.0:8089 --limit-request-line 0 --limit-request-field_size 0 "superset.app:create_app()"
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

/etc/nginx/sites-available/superset.example.com:

server {
    listen 80;
    server_name superset.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443;
    server_name superset.example.com;

    location / {
        proxy_pass http://0.0.0.0:8089;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Následně certbot, atd.

Víc tu:

Závěr

Úvodní konfigurace je za námi, opětovné spuštění aplikace už je snadné:

source .venv/bin/activate
export FLASK_APP=superset SUPERSET_CONFIG_PATH=./superset_config.py
superset run -p 8088 --with-threads --reload --debugger

Seznamuji se s nástrojem Odoo

Neznám žádný ERP software a protože bych chtěl nějaký znát, zjišťoval jsem jaké open source nástroje - napsané v Pythonu - existují.

Našel jsem:

Kdybych nepotřeboval komplexní ERP, ale jen systém pro řízení zásob, nabízí se:

Pro detailnější průzkum jsem si vybral Odoo a v tomhle zápisku už se budu věnovat jenom jemu.

Představení systému Odoo v krátké a srozumitelné prezentaci (slovensky, říjen 2024). Jsou tam příklady použití a ukázky kódu. Autor prezentace.

Dostupné varianty

Na https://www.odoo.com/page/editions je uvedeno:

Our business management software is available in 2 versions:

  • Odoo Community (open-source)
  • Odoo Enterprise (licensed)

Na https://www.odoo.com/pricing jsem se dočetl:

Odoo Online or Odoo Enterprise (On-premise or Odoo.sh) is the same software.

Odoo Online

Odoo Online provides private databases which are fully managed and hosted by Odoo. It can be used for long-term production or to test Odoo thoroughly, including customizations that don’t require code.

Odoo Online is incompatible with custom modules or the Odoo App Store.

Víc na https://www.odoo.com/documentation/master/administration/odoo_online.html.

Odoo.sh

Je to Cloud Platform pro ty, kteří mají enterprise licence.

Doporučení varianty

Uživatel codeagency na Redditu píše:

My recommendation is, go on-premise and self-control your source and update frequency. As long as you host with odoo, they control and Force this on you. When you are on your own server, you decide when and what you update.

Hostování pomocí Kubernetes

Velmi dobrá rada

Tohle doporučení the best way to learn Odoo mě zaujalo.

We are doing 20 years business with Odoo software, so I'm not speaking as a beginner.

  1. Learn ERP and Odoo first and what it can do before you start developing. You can't develop properly if you don't know what the software is already capable of. You might end up creating stuff that already exist or is possible with one of the many powerful dev tools inside Odoo (server actions, automated actions, etc...). Don't re-invent the wheel again and be smart and efficient. Avoid customizating at all times if you don't have to = avoid technical debt for the company and problems with future migrations.

  2. Understand business processes first. Get at least minimal knowledge as a functional consultant. I see too many developers create "stupid" useless modules because they don't understand how inventory works, or how sales works, or how accounting works, etc... they are literally duplicating stuff and functions that Odoo already does because they don't understand how it works. Or they cause problems because they don't understand how inventory and routes work.

  3. Take a real problem or request you have with a business operation and try to create a custom module from scratch. There are many examples available on the internet from companies like Odoo Mates, Cybrosys, etc... they even published developer training modules to create modules for eg students/school/... or doctors/patients etc... and build it with Odoo.

Odoo Studio

Odoo Studio je nástroj pro základní přizpůsobení Odoo bez nutnosti programování.

Víc na https://www.odoo.com/app/studio.

Komunita

Dokumentace

Odoo Success Packs

Q: What do the Success Packs include?

A: The Success Packs include a package of premium services by a dedicated consultant. During the implementation phase, you will have an Odoo Project Manager assigned to you to analyze your requirements and configure your Odoo Apps according to your needs.

Více na https://www.odoo.com/pricing-packs.

Kritika

Nespokojený uživatel navrhuje alternativy (duben 2020):

This was the result of our latest evaluation. We have evaluated 76 criteria (these are the points in the first line). We also worked productively with Odoo for about 1.5 years and then switched to @erpnext.

No, we tried it for 1.5 years with Odoo CE. The features are artificially limited in every module and elementary things like Updater or Studio are completely missing. Odoo CE is not comparable to Systems like ERPNext, Axelor, Weclapp. Only Odoo EE is.

Odoo v ČR/SR

Odborníci na Odoo v ČR

Příklad modulu pro Odoo

Prvý Slovenský Odoo Cloud

V době psaní zápisku zrovna na jejich webu svítilo:

Pre neohlásenú údržbu v datacentre sú služby Tresk.SK nedostupné! Za nepríjemnosti sa ospravedlňujeme.

Článek a diskuze na Rootu

Padlo v diskuzi

Já jsem před lety od Odoo utekl. Myslím že poslední verzi jsem provozoval 10. Pak v nové komunitní verzi zmizely některé vlastnosti do placené verze a bylo to. Zakotvil jsem u ErpNext, používám na výrobu, sklady a psaní faktur.