Lux-ASR: Speech to Text System

The University of Luxembourg provides and Automatic Speech Recognition System (ASR) for Luxembourgish and several other languages (english, french, german, portuguese and spanish). Four output formats are available : plain text (txt), SubRip Subtitles (srt), JSON (with or without time codes for words) and Praat TextGrid. As an experimental feature for the Luxembourgish text translation to other languages has been added, which will output the recognized text in English, French, German, Portuguese, and Spanish.

The speech to transcribe can be recorded from a microphone or uploaded as Audio or Video file. If the recording contains more than one speaker, setting diarization to “On” will separate the text of every speaker in the recording along with time codes for their turns.

API Access

Lux-ASR can also be accessed by API and can be reached via:

curl -X POST "https://luxasr.uni.lu/v2/asr?diarization=Enabled&outfmt=text" \
  -H "accept: application/json" \
  -F "audio_file=@PATH/TO/AUDIO FILE;type=audio/wav"

The API returns the transcription in the specified output format.

Query Parameters

  • diarization: Can be set to Enabled (default) or Disabled to include or exclude speaker diarization.
  • outfmt: Specifies the output format. Supported values are:
    • text – plain text transcript (default)
    • json – detailed JSON output
    • srt – SubRip subtitle format
    • textgrid – Praat TextGrid format

Accepted audio formats are .wav, .mp3, and .m4a.

Python Script

Below is a basic Python script that replicates the functionality of the curl command with added flexibility. You can specify the audio file and optionally choose whether to enable diarization and which output format to use.

import requests
import argparse
import os
import sys

def main():
    parser = argparse.ArgumentParser(
        description="Send an audio file to the LuxASR API for transcription."
    )
    parser.add_argument(
        "audio_file",
        type=str,
        help="Path to the audio file (.wav, .mp3, .m4a)"
    )
    parser.add_argument(
        "--diarization",
        choices=["Enabled", "Disabled"],
        default="Enabled",
        help="Enable or disable speaker diarization (default: Enabled)"
    )
    parser.add_argument(
        "--outfmt",
        choices=["text", "json", "srt", "textgrid"],
        default="text",
        help="Output format: text, json, srt, or textgrid (default: text)"
    )

    args = parser.parse_args()

    if not os.path.isfile(args.audio_file):
        print(f"Error: File '{args.audio_file}' not found.")
        sys.exit(1)

    url = f"https://luxasr.uni.lu/v2/asr?diarization={args.diarization}&outfmt={args.outfmt}"
    headers = {
        "accept": "application/json"
    }

    # Determine MIME type
    ext = args.audio_file.lower()
    if ext.endswith(".wav"):
        mime_type = "audio/wav"
    elif ext.endswith(".mp3"):
        mime_type = "audio/mpeg"
    elif ext.endswith(".m4a"):
        mime_type = "audio/mp4"
    else:
        mime_type = "application/octet-stream"

    with open(args.audio_file, "rb") as audio:
        files = {
            "audio_file": (os.path.basename(args.audio_file), audio, mime_type)
        }
        response = requests.post(url, headers=headers, files=files)

    print(response.text)

if __name__ == "__main__":
    main()

Usage

python luxasr_transcribe.py path/to/your_audio.wav --diarization Enabled --outfmt json

Replace path/to/your_audio.wav with your actual audio file. The --diarization and --outfmt options are optional and default to Enabled and text respectively.

Lux-ASR is under constant development by Peter Gilles, Nina Hosseini-Kivanani, and Léopold Hillah at the University of Luxembourg and is supported by the Chambre des Députes du Grand-Duché de Luxembourg.

Disclaimer

Note that the transcription and the translation are run on a dedicated server at the University of Luxembourg. All data thus stays within Luxembourg and the University’s network. Nobody has access to the uploaded audio or the text output. The audio data is streamed to this server and no files are stored on this server or in the network. No data is used to further train the model and no data is transferred to third parties.

Domain Names

The main domain-name for the KI-Léierbud is ki-leierbud.lu with the following sub-domains :

  • admin (homepage WordPress)
  • app1 (NodeJS Application)
  • app2 (NodeJS Application)

The following screenshot shows the configuration of a subdomain in the Plesk Dashboard :

The following sub-domains will be added if required :

  • app3, app4, app5, … (NodeJS applications)
  • python1, python2, python3, … (Python applications)
  • gradio1, gradio2, gradio3, … (Gradio applications)
  • …..

IP – Adresses

KI-Léierbud Server :

  • v4 : 85.93.210.152
  • v6 : 2001:1610:0:9::152

DNS-Server : Visual Online

Visual Online DNS resolver servers:

  • Resolver 1 IPv4: 80.90.44.25
  • Resolver 1 IPv6: 2001:1610:0:3::25
  • Resolver 2 IPv4: 85.93.210.60
  • Resolver 2 IPv6: 2001:1610:0:13::60

URL Shortener : TinyURL

quiz ? : https://tinyurl.com/3hy6aax4

Plesk SSH-Terminal

AlmaLinux 9.6

AlmaLinux 9.6, codenamed “Sage Margay,” was released on May 20, 2025. As a downstream rebuild of RHEL 9.6, it offers full binary compatibility while also introducing unique enhancements:AlmaLinux OS+4Facebook+4wiki.almalinux.org+4

  • Kernel Version: Ships with Linux kernel 5.14.0-570.12.1.el9_6.wiki.almalinux.org+2wiki.almalinux.org+2Wikipedia+2
  • Extended Hardware Support: Includes a tech-preview of KVM virtualization support for the IBM Power architecture, addressing the needs of specific user groups. wiki.almalinux.org
  • Updated Development Tools: Features updated versions of development tools and module streams, such as Apache HTTP Server 2.4.62, Node.js 22, Nginx 1.26, PHP 8.3, MySQL 8.4, and Maven 3.9. AlmaLinux OS+2Linuxiac+2AlmaLinux OS+2
  • System Toolchain Upgrades: Incorporates GCC 11.5, LLVM-Toolset 19.1.7, Go-Toolset 1.23.6, and Rust-Toolset 1.84.1, enhancing performance and compatibility.

Some AlmaLinux commands are different from Ubuntu which I use on my desktop computers. I asked ChatGPT to generate a cheat sheet comparing commands between the two systems.

Here is a screenshot of the entries in the Plesk SSH Terminal to install a node app :

KI-Léierbud Info

Welcome to KI-Léierbud !

Discover everything about Artificial Intelligence in four sections: Knowledge, Quiz, Hands-on, and Pro.
The first version of our portal launches on Monday, September 15, 2025.
Expect regular updates and new features until June 2026 — stay tuned as we grow step by step!


Bienvenue sur KI-Léierbud !

Découvrez tout ce qu’il faut savoir sur l’intelligence artificielle à travers quatre rubriques : Connaissances, Quiz, Pratique et Pro.
La première version de notre portail ouvre le lundi 15 septembre 2025.
Des évolutions seront déployées par étapes jusqu’en juin 2026 — suivez-nous dans cette aventure !


Willkommen bei KI-Léierbud !

Erfahren Sie alles über Künstliche Intelligenz in vier Rubriken: Wissen, Quiz, Praxis und Pro.
Die erste Version unseres Portals startet am Montag, den 15. September 2025.
Bis Juni 2026 wird das Portal schrittweise weiterentwickelt — bleiben Sie gespannt!


Bem-vindo ao KI-Léierbud !

Saiba tudo sobre Inteligência Artificial em quatro secções: Conhecimento, Quiz, Prática e Profissional.
A primeira versão do nosso portal será lançada na segunda-feira, 15 de setembro de 2025.
O portal evoluirá por etapas até junho de 2026 — acompanhe o nosso progresso!


Wëllkomm op KI-Léierbud !

Hei léiers de vill iwwer kënschtlech Intelligenz an de véier Rubricken: Wëssen, Quiz, Hands-on a Pro.
Déi éischt Versioun vum Portal geet Méindes, de 15. September 2025, online.
Bis Juni 2026 wäert de Portal a Schrëtt evoluéieren — bleib dobäi a kuck mat eis wéi e wiisst!


Digital Content Management for KI-Léierbud

The present backend server is only available to the developers and editors of the KI-Léierbud Portal.

Login

Plesk Hosting

This was the default home-page of ki-leierbud.lu in the new Almalinux 9.6 Server hosted by Visual Online.

Here are the related

  • DNS settings – v4: 85.93.210.152 / v6: 2001:1610:0:9::152
  • Frontend : www.ki-leierbud.lu / ki-leierbud.lu  >>> /var/www/vhosts/ki-leierbud.lu
  • WordPress : admin.ki-leierbud.lu >>> /var/www/vhosts/ki-leierbud.lu/admin.ki-leierbud.lu
  • Plesk Panel : https://plesk06.vo.lu:8443/ >>> login : username – password
  • FTP Server : plesk06.vo.lu >>> Filezilla :
  • Plesk Version :
  • WordPress Version : 6.8.1
  • PHP version : 8.3.21

To replace the default home-page by a custom webpage I used the recommended website builder Sitejet :

I selected the Academix theme template to start with a first trial :

First Attempt – Upload Fails Due to File Size

The initial attempt to upload the image above failed because the file size exceeded 2 MB.
The PHP settings in Plesk were already configured to allow up to 64 MB, but WordPress still enforced a 2 MB upload limit.

ChatGPT pointed out that in such cases, a .user.ini file is required in the root directory of the WordPress installation to override the default behavior — especially when PHP is running in FPM (FastCGI Process Manager) mode, which is common in Plesk environments.

Using the “+” button in the File Manager, I created a new .user.ini file and added the following content:

upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300

Customized Home Page

To install a customized minimal web Homepage allowing to test the correct working of the WordPress REST API, I removed all the files in the “home directory > httpdocs” folder, except the index.html file. I replaced the content of this file with the following code :

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>KI-Léierbud</title>
  <style>
    body {
      font-family: sans-serif;
      padding: 40px;
      background-color: #fdfdfd;
      line-height: 1.6;
    }

    h1, h2, p {
      margin-bottom: 1em;
    }

    a {
      color: #0055cc;
      text-decoration: none;
    }

    a:hover {
      text-decoration: underline;
    }
  </style>
</head>
<body>
  <h1>Welcome to My New Site KI-Léierbud!</h1>
  <h2>Test the WordPress REST API</h2>
  <p><a href="https://admin.ki-leierbud.lu/archives/244">Table of Content</a></p>
</body>
</html>

Here is the result :

The WordPress REST API is working as expected. Now it’s time to create a well designed Home-Page.

Hosting User Guides

Events