github murtaza-nasir/speakr v0.10.19-alpha

6 hours ago

Speakr v0.10.19-alpha

In this release, transcripts can be translated, uploads are answered before their files are converted, users take strict turns in the processing queues, and Inquire indexing is done on its own worker.

New

  • Transcript translation (PR #538, contributed by @devkit415). A recording's transcript can be translated from its translation tab with Generate Translation, into the language set as your Preferred Chatbot, Summarization and Translation Language (renamed from Preferred Chatbot and Summarization Language, PR #546). Speaker labels and timestamps are kept, and the original transcript is not changed. When an administrator allows it, each user can have new recordings translated automatically after transcription (Account Settings, Translation). A separate translation model can be set with TRANSLATION_MODEL_NAME, TRANSLATION_MODEL_BASE_URL and TRANSLATION_MODEL_API_KEY; without them, the text model is used. Speaker and timing edits are copied into the translation, and the translation is cleared after a text edit or a reprocess.

Changed

  • Uploads are converted after the upload is answered (discussion #543). A file that ffprobe can read, with an audio track, is stored as it arrived, and the upload is answered at once. The file is then converted in a convert job (codec conversion, compression of lossless audio, audio extraction from video), stored in place of the original and queued for transcription. A 30-minute WAV, for example, is answered in about a second instead of after its conversion. With the new setting CONVERT_QUEUE_WORKERS (default 2), you set how many files are converted at once; with 0, files are converted in the upload request, as before.
  • Queued (conversion) and Queued (transcription). In the recording list, the recording header and the processing queue, a queued recording is labelled with what it waits for, and with Converting while its file is converted. The recording's status stays QUEUED from the upload until its transcription starts. The response of GET /api/v1/recordings/{id}/status has a new stage field: conversion, transcription or summary.
  • Turns in the processing queues (discussion #542). In each queue, every user with a waiting job now gets one job started before anyone gets a second. Before, a user whose next file arrived after other users' files could lose a turn.
  • Queue position (discussion #542). queue_position in GET /api/v1/recordings/{id}/status was null for most queued recordings. It now gives the recording's place in its queue, following the turns above, and the same order is shown in the processing queue of the web interface.
  • Inquire indexing on its own worker (discussion #541). The search chunks (embeddings) of a completed recording are built by an index job on its own worker (INDEX_QUEUE_WORKERS, default 1). The recording is completed first, and the next transcription or summary can start without waiting for the embedding model. Rebuilds after transcript and speaker edits are index jobs too; when the transcript changes during a rebuild, the chunks are built again. A failed index job is retried, and the recording stays completed.
  • Watch folder (PR #552, contributed by @devkit415). Files in the auto-process watch folder now go through the same ingestion as uploads, including the conversion after the file is accepted, without the upload size limits. A file that cannot be processed is renamed in the watch folder by adding .failed to its name (meeting.mp3 becomes meeting.mp3.failed), and its owner is notified. Later scans skip it; to try it again, remove .failed from its name. A file that is refused (unreadable, empty, a video without audio) is renamed at once. After any other error, the file keeps its name and is tried again on the first scan at least 1, 2, 4 and 8 minutes later, and it is renamed after the fifth failed attempt; the attempts are counted again from the start after a restart. Before, a file that could not be processed was deleted from the folder without a recording.
  • Code organisation (PRs #547 to #550, contributed by @devkit415): transcript chunking and prompt construction are in their own modules, and one job runner is used for new and reprocessed transcriptions. Behaviour is unchanged.
  • Dependencies: openai 3.37.0, boto3 and botocore 1.43.118, and newer documentation build tools. The test tools used in CI are locked with hashes in requirements-dev.lock, and the test suite runs in parallel in CI (PR #553, contributed by @devkit415).

Fixed

  • Seeking in long videos (#539). When a fragmented MP4, the format OBS writes, is played or seeked, one request is sent per fragment. With a long video, the hourly request limit was used up, and requests for every recording were then refused for up to an hour. Media playback for signed-in users is no longer counted against that limit; anonymous requests and public share links are still counted.
  • Recordings made on iPhones and iPads (#495). With ENABLE_SERVER_RECORDING_CHUNKS=true, a recording made in the browser was stored as the browser recorded it. Safari records Opus audio in 2.5 ms frames, which iOS and VLC play back distorted. An audio recording made this way is now converted in the same way as an uploaded file; a recording with video is kept as recorded. Recordings made before the update keep their original file.
  • Internal email domains (#551). Addresses on reserved internal domains such as .local were refused at registration and at sign-in. They can now register when their domain is listed in REGISTRATION_ALLOWED_DOMAINS, and accounts on such domains can sign in.
  • Files misread as audio (#530). An audio stream that ffprobe reports with no sample rate or no channels is no longer treated as audio. Such a file is refused at upload with the "could not be read as audio" error.
  • Recordings deleted during transcription (#531). When a recording is deleted while its audio is at the transcription service, the job ends with one log line, without an error trace.
  • JSON only (#532). Model responses are parsed as JSON only; the fallback to Python literals is removed.
  • Upload size ceiling (#533). The request size ceiling (MAX_CONTENT_LENGTH) is checked on every upload, with or without chunking.
  • Sign-in timing (#534). One password check is run for every password sign-in, and the same message is returned whether the account exists, has no local password or uses SSO.

Upgrading

Pull the new image and start as usual. Five columns (for translations) and a unique index on active processing jobs are added at startup; no manual migration is needed, and existing settings keep working. Before the index is created, any duplicate active job for the same recording and task is marked failed. A few changes are visible to API clients and integrations:

  • Later conversion errors. A file that ffprobe can read but that fails to convert, or whose conversion times out, is no longer refused by the upload request with 400 or 500. The upload is accepted, and the recording then becomes FAILED with the error in place of its transcript; the recording.transcription.failed webhook and the failure email are sent as for a failed transcription. Files that ffprobe cannot read, videos without an audio track, videos over the size limit whose extracted audio has to fit it, and parts of a join are still refused at once with the same errors.
  • Upload response values. In the upload response, file_size and mime_type are those of the file as uploaded. They are updated to the converted file's values once the file is converted.
  • Many uploads at once. Uploads used to be converted in parallel, one per upload request. They are now converted two at a time for the whole server by default, so in a large batch the last files may start transcribing a little later than before, although each upload is answered sooner. Raise CONVERT_QUEUE_WORKERS on servers where many users upload large files at the same time.
  • Job counts. The queue numbers in GET /api/v1/stats include the new convert and index jobs.
  • Stored file names. A file converted after the upload is stored under a name with the converted format's extension, for example meeting.mp3 for an uploaded meeting.wav (or meeting.opus with AUDIO_CODEC=opus). Before, it kept the uploaded file's extension, as it still does with CONVERT_QUEUE_WORKERS=0.
  • Recordings streamed to the server. With ENABLE_SERVER_RECORDING_CHUNKS=true, audio recordings made in the browser are now stored converted (MP3 by default, or AUDIO_CODEC) instead of as WebM, as recordings made without that setting already were.
  • Going back to v0.10.18. Convert and index jobs are not run by earlier versions. Before going back, wait until no recording is waiting for its conversion (labelled Queued (conversion) or Converting): in v0.10.18, such a recording would stay QUEUED, and a queued recording cannot be reprocessed there. Search chunks (Inquire) whose index job had not run are missing in v0.10.18.

To keep the earlier upload behaviour, set CONVERT_QUEUE_WORKERS=0.

Full Changelog: v0.10.18-alpha...v0.10.19-alpha

Don't miss a new speakr release

NewReleases is sending notifications on new releases.