Teknik

Under motorhjelmen

Til de teknisk nysgerrige og pressen: hvordan SayToEdit Audio er bygget, hvordan din egen AI forbindes, og hvordan vi måler.

Din egen AI via MCP

SayToEdit kører en MCP-server på din Mac. Forbind Claude Desktop, Claude Code eller en anden MCP-app, så redigerer den med de samme værktøjer som knapperne i programmet. Med i alle pakker, også Basis.

Din AI-konto

Din AI tænker på din egen konto. SayToEdit bruger ingen credits på det.

Trygt at prøve

Hver ændring er et trin i historikken, mærket som lavet via MCP, og kan fortrydes.

Bliver lokalt

Serveren lytter kun på din Mac og kræver en nøgle. Din AI får tekst og målinger, ikke lyden.

Forbind Claude Code med én linje
claude mcp add --scope user --transport http \
  saytoedit-audio http://127.0.0.1:47811/mcp \
  --header "Authorization: Bearer <din nøgle>"

Programmet viser kommandoen med din egen nøgle under Indstillinger > AI-forbindelse. Claude Desktop: kopiér opsætningen samme sted; den starter selv SayToEdit.

Værktøjerne 78

Manuskript

transcribe get_transcript correct_word rename_speaker compare_to_script

Rensning

clean_audio compare_cleanings rate_quality analyze_room analyze_tape

Klip

suggest_edits delete_words delete_range find_retakes keep_takes

Niveau og loudness

level_to_target measure_loudness duck_under_speech set_track_level

Plugins

list_plugins add_plugin set_plugin_parameter load_plugin_preset

Skabeloner og formater

prepare_podcast run_format save_voice_profile place_jingle

Send ud og møder

export_audio export_transcript export_summary set_summary

Projekt og historik

get_project get_history undo redo add_marker

Se alle 78 værktøjer

Læst fra programmets kildekode, når siden bygges. Beskrivelserne er på engelsk, som din AI ser dem.

get_project
Get the project structure: tracks, clips (ids, positions in seconds), levels, markers for earlier automatic edits, and whether a transcript exists. Call this first.
get_transcript
Read the transcript as it sounds on the timeline now (after edits). Times are timeline seconds. Use format 'words' to get word indices for delete_words. Minutes of a meeting or interview: read the default text format (each turn starts with [minutes:seconds] and the speaker), then call set_summary with a short summary (3-6 sentences, same language as the meeting), decisions, tasks (who, what, deadline) and open questions, each with the time it is said; only what is actually said. Long recordings: read it in parts with from_seconds/to_seconds.
transcribe
Transcribe all audio that is not transcribed yet, with word timestamps and speaker detection. Runs locally; can take a few minutes for long recordings.
transcribe_range
Transcribe only a time range again (e.g. where words are missing or wrong) and replace the words in that range. Corrections of later words follow along. Use verbatim=true to write repetitions and broken-off words as said (e.g. 'var ikke var ikke').
find_untranscribed_speech
Find speech the transcript may have missed: stretches of at least 0.4 s of voiced speech (not breath or hiss) inside a sentence but with no words, and words that last far longer than their letters suggest (the model often swallows a repeated word). Marks them on the timeline by default. Try transcribe_range with verbatim=true there.
suggest_edits
Preview automatic edits (fillers, repetitions, long pauses) without changing anything. Returns each proposed cut with time and reason.
apply_auto_edit
Apply automatic edits: remove fillers, repetitions and/or tighten long pauses. Everything becomes one undo step and is marked on the timeline.
prepare_podcast
Prepare the whole project for a podcast in one step: transcribe what is missing and clean the sound at the same time (standard chain), then remove fillers, repetitions and long pauses, and even out the level. Each part is one undo step. Use this first for requests like 'make it ready for podcast'; then use find_retakes/review_retakes, get_transcript and delete_range for editorial cuts.
review_retakes
Review all retakes (sentences the speaker started over) at once: every group with the text and times of each take and a suggested take (the last one, usually the complete one). With apply_suggested=true the suggested takes are kept right away (one undo step). Otherwise judge them and call keep_takes.
find_retakes
Find sentences the speaker started over (retakes). Returns groups of takes with their text and times, so you can judge which take is best. Then call keep_takes.
keep_takes
Keep one take in each retake group from find_retakes and remove the others. One undo step, marked on the timeline.
delete_range
Cut out a time range on all tracks and close the gap.
delete_words
Delete words from the transcript (and the audio) by index, including the pause after them. Get indices from get_transcript with format 'words'.
split
Split all clips at a time.
move_clip
Move a clip in time and optionally to another track (e.g. to place music). Overlapping clips on the same track crossfade automatically.
trim_clip
Change a clip's in and out points (timeline seconds).
set_fades
Set fade in and fade out length on a clip (seconds).
delete_clip
Remove a whole clip (without closing the gap).
set_track_level
Set a track's level in dB.
set_clip_level
Set a clip's overall level in dB.
set_level_points
Draw a level curve on a clip with points, e.g. to fade music up and down at specific times.
duck_under_speech
Lower a track (usually music) automatically whenever someone speaks on the other tracks, with smooth fades. Undoable.
set_track_solo
Solo a track (only solo tracks are heard) or turn solo off.
list_plugins
List the audio plugins (AU/VST3) installed on this computer.
add_plugin
Put a plugin at the end of a track's plugin chain. The user can open its window in the editor to adjust it.
remove_plugin
Remove a plugin from a track.
set_plugin_bypass
Turn a plugin off (bypass) or on.
get_plugin_parameters
List a plugin's parameters: id, name, unit, min, max, current value, and value names for choices. Use set_plugin_parameter to change them (e.g. turn down the strength of a noise reduction plugin).
set_plugin_parameter
Set one or more plugin parameters at once. The plugin's new settings are saved in the project as one undoable step.
list_plugin_presets
List a plugin's presets: factory presets (number 0 and up), user presets (negative numbers) and the current one.
load_plugin_preset
Load a plugin preset. The plugin's new settings are saved in the project as one undoable step.
set_track_muted
Mute or unmute a track.
import_audio
Import an audio file (e.g. music or a jingle) onto a new track starting at 0 s. Use move_clip, set_track_level and set_fades afterwards to place it.
clean_audio
Clean audio locally: noise reduction (light = at most 6 dB, medium = 12 dB, strong = 24 dB; optionally extra noise reduction and keep_character), calm background between words, room reverb removal (dereverb), broadcast voice (EQ, de-esser, compressor), level evening, and for old tapes: hum removal, click and dropout repair, careful treble lift and wow/flutter correction. Use analyze_tape first for tapes. Replaces the tracks' audio with a cleaned version (undoable). All options off restores the original.
list_recipes
List saved recipes (reusable workflows such as 'Klar til podcast').
run_recipe
Run a saved recipe on the whole project.
export_transcript
Export the transcript (what is on the timeline now) as text: Word (.docx), PDF, plain text, SRT or VTT subtitles, or JSON. With title, date, duration and participants at the top, speaker names, timestamps and a note that the text is machine-made. Rename speakers first with rename_speaker so the names are right.
set_summary
Save a summary (minutes) of a meeting or interview in the project, where the user sees it and can export it. Make it from get_transcript (format "text" has [mm:ss] timestamps): a short summary, decisions, tasks (who, what, deadline) and open questions, each with the time it is said. Only include what is actually said. Replaces an earlier summary (undoable).
list_voice_profiles
List the voice profiles: saved cleanings for perfect speech (built-in and the user's own), with their choices, plugins, loudness target and an explanation.
save_voice_profile
Save a voice profile: from a track's current cleaning and plugins (from_track_id), or from an explicit cleaning. Explain the choices in 'description'. To find good settings first, use compare_cleanings and rate_quality on a typical excerpt, or create_voice_profile_from_audio.
apply_voice_profile
Apply a voice profile: clean with its choices and put its plugins (with their settings) on the track. One undo step per part.
create_voice_profile_from_audio
Make a voice profile from a typical excerpt: tries the built-in profiles (and Mac voice isolation if available) with compare_cleanings, rates them, saves the best as a new profile with an explanation, and answers with all scores. The excerpt is not changed. Apply it afterwards with apply_voice_profile.
list_library
List the sound library: intros, outros, jingles, music and effects with id, name, kind, length (s), loudness (LUFS), tags and default fades, level and ducking.
add_to_library
Add an audio file to the sound library (it is copied in, measured and kept). Kind: intro, outro, jingle, music or effect.
place_jingle
Put a sound from the library on the "Jingler" track: at the start (the rest moves so speech starts as it fades), at the end, after a sentence (makes room) or on top at a time. Uses its default fades and level relative to the speech; music is ducked under the speech. Undoable.
list_formats
List the episode formats: intro, outro, jingle (every N minutes), music, voice profile, cut rules, loudness, export (mp3/wav, bitrate, artist, album, title with {nr}) and the next episode number.
save_format
Save an episode format (a recipe for a whole episode), from the open project (from_project) or from the fields. Library sounds and profiles by id or name.
run_format
Make a whole episode from a format in one go: (new project with the raw files,) clean with the voice profile, transcribe, cut by the rules, even level, intro, jingles, outro and music, then export with title and episode number. Takes a few minutes for long recordings. The episode number counts up afterwards.
merge_speakers
Merge two speakers when speaker detection split one person in two: every word from from_speaker gets into_speaker. Speaker ids start at 0 ("Taler 1" is 0).
export_summary
Export the project's summary (minutes) as Word (.docx), PDF or plain text.
save_project
Save the project. Give 'path' to save under a new name (required if the project has never been saved).
undo
Undo the last change (any change, also the user's).
get_history
List the undo history, newest first: step number, what was done, who did it (user, agent = the editor's assistant, mcp = you or another connected AI) and whether it is undone.
measure_loudness
Measure how the timeline sounds (after plugins, exactly as exported) in a time range: integrated loudness (LUFS), loudness range (LRA), highest true peak (dBTP), noise in the pauses (pauseNoiseDbfs: median in quiet parts of at least 150 ms; quietest10pDbfs is the 10th percentile of 100 ms RMS, which hits breaths when pauses are tight), number of 100 ms places with peaks over -1 dBTP, and short-term loudness (3 s) over time (at most 600 points). With per_sentence: LUFS for each sentence. Use it to check levels before and after edits.
set_script
Set the text that is read aloud (reading with a manuscript). Afterwards find_retakes, suggest_edits and apply_auto_edit use it: repetitions that are in the text are kept, words that are not in the text and start over are restarts. Undoable.
compare_to_script
Compare the transcript with the reading text: words said that are not in the text (with times; errors, restarts or fillers), words that are spelled differently than in the text (e.g. names), and words from the text that were not said.
models_status
List the local AI models: whether each is installed, its size and license, the installed and the newest version, and whether a newer version can be downloaded (the user downloads models in Settings).
analyze_room
Measure the room: reverb tail 50-200 ms after words (tailDb, dB relative to the end of the word; higher = more reverb; a dry room is about -30), measured on the sound before cleaning (first 10 minutes). 'reverberant' says whether clean_audio with dereverb is worth trying.
rate_quality
Listening test: compare a time range as it sounds now with the sound before cleaning and plugins. Gives a score from 1 to 5, voice preservation per band (bass 100-300 Hz, mid 300-2000, presence 2-5 kHz, treble 5-10 kHz; loss relative to the mid band), noise in pauses before/after, 'musical noise' (short tonal remnants in pauses, per mille), pumping and the reverb tail after words before/after, with an explanation in Danish.
compare_cleanings
Compare up to 6 cleanings on an excerpt (at most 60 s) without changing the project: built-in cleaning with different options and/or plugin chains with presets or parameters. Gives a table: loudness, noise in pauses, quality score and voice preservation (listening test), and how long it took. Each result is also saved as a WAV file to listen to.
analyze_tape
Analyze old tape recordings: per channel noise floor, signal-to-noise and bandwidth, correlation and time offset between channels with a recommended channel choice; mains hum (exact frequency); tape speed from the hum (when the hum is clear); clicks per minute; bandwidth; noise floor; voice pitch; and whether wow/flutter can be corrected. Use the result to choose set_channel_mode, set_clip_speed and clean_audio options.
analyze_channels
Analyze the two channels of stereo recordings (noise, bandwidth, correlation, time offset) and recommend left, right, both or both aligned. Same channel part as analyze_tape.
set_channel_mode
Choose which channels of a stereo recording are heard (e.g. only the better channel of an old tape, or both mixed after correcting a head misalignment). Applies to all clips from the recording. Undoable.
set_clip_speed
Set the playback speed of a recording (varispeed), e.g. to correct a tape that ran too fast or slow. analyze_tape gives the speed from the mains hum when possible. All clips from the recording follow and keep their order. Undoable.
measure_pitch
Measure the voice pitch (fundamental frequency) in a time range as it sounds now (with any speed change): median and spread in Hz.
level_to_target
Even out the level: measure every sentence (after plugins; without a transcript, speech parts found by loudness) and set level points on the clips so each sentence reaches the target loudness, with 50 ms smooth transitions in the pauses. One undo step.
get_waveform
Get the energy curve of a time range: RMS level in dBFS per point (default 200 points, at most 2000), and quiet places (start, end, quietest point, level), e.g. pauses between words where a cut is clean.
add_marker
Put a note marker on the timeline (shown in amber in the ruler; the note appears when the user points at it). Undoable.
remove_marker
Remove a marker (a note or a mark from an earlier automatic edit). Undoable.
list_markers
List all markers in time order: id, seconds, kind (note, or filler/pause/repetition/cut/cleaning/click/dropout for automatic edits), the note or label, and who made it.
redo
Redo the last undone change.
correct_word
Correct a misheard word in the transcript (e.g. a name). Only the text changes, not the audio. Undoable.
rename_speaker
Rename a speaker in the transcript (e.g. 'Taler 1' becomes the host's name).
export_audio
Export the timeline (or a time range) to a WAV file (24 bit, 48 kHz) or an MP3 file (44.1 kHz CBR, 128 kbit/s stereo / 96 mono by default, with ID3 tags) with podcast loudness (-16 LUFS stereo / -19 LUFS mono, peaks below -1 dBTP). Waits at most 20 seconds; long exports continue in the background and answer with a job id for export_status.
start_export
Start exporting to a WAV or MP3 file in the background and answer at once with a job id. Same options as export_audio. Follow it with export_status.
export_status
Progress of an export started with start_export or export_audio: progress 0-1, done, error and the loudness report.
play
Play the timeline so the user can listen, optionally from a time.
pause
Pause playback.

Arkitektur

Rust hele vejen

Lydmotor, rensning, transskription og redigeringsmodellen er skrevet i Rust i separate moduler. Programmet er bygget med Tauri 2 og en React-brugerflade.

Lokale modeller

Tale til tekst, talergenkendelse, støjfjernelse og den valgfri sprogmodel kører alle på din Mac. Store sprogmodeller kører i deres egen proces.

Ét fælles lag

Knapper, den indbyggede assistent og MCP kalder de samme funktioner. Det, din AI gør, er præcis det, en knap gør.

MCP-server

Streamable HTTP på 127.0.0.1 med en nøgle og en lille stdio-bro til Claude Desktop, der starter programmet, når det skal bruges. Den indbyggede assistent forbinder sig til samme server i hukommelsen.

Plugin-vært

Audio Units kører i et separat Swift-program, som editoren taler med over en socket, adskilt fra selve editoren.

Intet går tabt

Hver ændring er en handling i en historik, der husker, hvem der lavede den: dig, assistenten eller MCP. Rensning skriver nye filer og beholder originalen.

Rensningens rækkefølge

Rækkefølgen betyder noget. Talen findes før støjfjernelsen, og den rolige baggrund lægges på til sidst, så niveauudligningen ikke løfter pauserne forskelligt.

  1. RumklangWPE: STFT 2048/512, forsinkelse 3 rammer, filter 32 rammer, 3 gennemløb, én Cholesky-løsning pr. frekvensbånd, på alle kerner.
  2. StøjDeepFilterNet3. Talen løftes til et fast niveau først og sænkes igen bagefter, så svage stemmer ikke fjernes. Grænser: 6, 12 eller 24 dB.
  3. StemmeHøjpas, de-esser, automatisk EQ målt mod et standard-talespektrum (bas, nærvær, diskant, højst ±4 dB), kompressor.
  4. NiveauHver sætning måles og flyttes mod målet, højst ±12 dB, med overgange på 50 ms i pauserne.
  5. Rolig baggrundTalen findes i trin på 10 ms før støjfjernelsen; pauserne sænkes 6, 10 eller 14 dB og fyldes med komfortstøj i samme spektrum.
  6. LoudnessMåling efter ITU-R BS.1770-4 og true peak-limiter ved udsendelse: -16 LUFS stereo, -19 LUFS mono, toppe under -1 dBTP.

Gamle bånd får desuden, før støjfjernelsen: vaklende tone (eksperimentel), klik og udfald (LPC orden 32), brum og dets overtoner, og bagefter et forsigtigt løft af diskanten.

Målinger

Alle tal er vores egne, målt på en Mac med Apple silicon med testene i kildekoden.

Standardkæden mod førende kommercielle AI-plugins

Tre udsnit à 30 s (start, midt, slut) af en rigtig optagelse. Kommerciel kæde: plugins til støjfjernelse, rumklang og stemme fra én producent, uden niveauudligning (derfor sammenlignes baggrunden i forhold til talen, ikke i dBFS). Karakter: SayToEdits egen automatiske lyttetest (1-5). Pumpen: hvor meget niveauet i pauserne svinger (dB). Tid: pr. 30 s. Resultatet gælder denne optagelse; andre optagelser kan give andre resultater.

UdsnitKædeBaggrund under talenMusikalsk støjKarakterPumpenTid
StartSayToEdit-42,0 dB10,5 ‰5,01,8 dB4,5 s
Kommerciel-39,7 dB52,5 ‰5,02,7 dB3,2 s
MidtSayToEdit-44,5 dB2,2 ‰5,00,9 dB5,4 s
Kommerciel-39,3 dB53,3 ‰5,01,9 dB3,4 s
SlutSayToEdit-44,2 dB17,6 ‰5,02,4 dB5,8 s
Kommerciel-40,1 dB56,8 ‰4,01,3 dB3,3 s

SayToEdit er 2-5 dB stillere i pauserne i forhold til talen, har en brøkdel af den musikalske støj og holder karakter 5,0 i alle tre udsnit. Den kommercielle kæde er hurtigere og pumper mindre i det sidste udsnit.

Andre målinger

Fjern rumklang (WPE, mellem)
Efterklangen sænket 3,5 dB (RT60 0,4 s) og 3,9 dB (RT60 0,8 s) på kunstig rumklang, karakter 5,0, klangen ændret højst 0,1 dB. Ca. 1,2 s pr. 30 s mono.
Format: råoptagelse til MP3
5:22 på 32-36 s; 30:00 på 3:45 med intro, outro og 11 jingler. -16,0 LUFS, top -1,8 til -1,9 dBTP.
Transskription af møder
2,5 timer med tre talere: 3,0-6,1 minutter pr. time lyd, talerne ens i 99,8-100 % af ordene, hukommelse højst 2,5-3,0 GB.
Talte kommandoer
Fra "Tal" slippes til tekst: 0,3-0,6 s med Whisper small på din Mac.
Ordene bevares
En hel optagelse på 5:22 før og efter rensning: 692 og 694 ord, første og sidste ord ens; -16,0 LUFS, -1,2 dBTP.

Modeller og licenser

Modellerne hentes fra deres officielle kilder ved første start og kontrolleres. Alle har åbne licenser: MIT, Apache 2.0 og, for MP3-biblioteket, LGPL.

ModelBruges tilLicens
Whisper large-v3 turbo (whisper.cpp)Tale til tekst med ordtiderMIT
3D-Speaker CAM++ (sherpa-onnx)TalergenkendelseApache-2.0
DeepFilterNet3StøjfjernelseMIT / Apache-2.0
Qwen3 4B (llama.cpp, tilvalg)Lokal sprogmodel: bedste udgave, referat uden internetApache-2.0
Whisper small (tilvalg)Talte kommandoerMIT
LAME 3.100MP3, separat dynamisk bibliotekLGPL 2

Programmet indeholder open source-software og modeller under deres egne licenser. Se licenssiden.