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.
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.
- RumklangWPE: STFT 2048/512, forsinkelse 3 rammer, filter 32 rammer, 3 gennemløb, én Cholesky-løsning pr. frekvensbånd, på alle kerner.
- 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.
- StemmeHøjpas, de-esser, automatisk EQ målt mod et standard-talespektrum (bas, nærvær, diskant, højst ±4 dB), kompressor.
- NiveauHver sætning måles og flyttes mod målet, højst ±12 dB, med overgange på 50 ms i pauserne.
- 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.
- 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.
| Udsnit | Kæde | Baggrund under talen | Musikalsk støj | Karakter | Pumpen | Tid |
|---|---|---|---|---|---|---|
| Start | SayToEdit | -42,0 dB | 10,5 ‰ | 5,0 | 1,8 dB | 4,5 s |
| Kommerciel | -39,7 dB | 52,5 ‰ | 5,0 | 2,7 dB | 3,2 s | |
| Midt | SayToEdit | -44,5 dB | 2,2 ‰ | 5,0 | 0,9 dB | 5,4 s |
| Kommerciel | -39,3 dB | 53,3 ‰ | 5,0 | 1,9 dB | 3,4 s | |
| Slut | SayToEdit | -44,2 dB | 17,6 ‰ | 5,0 | 2,4 dB | 5,8 s |
| Kommerciel | -40,1 dB | 56,8 ‰ | 4,0 | 1,3 dB | 3,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.
| Model | Bruges til | Licens |
|---|---|---|
| Whisper large-v3 turbo (whisper.cpp) | Tale til tekst med ordtider | MIT |
| 3D-Speaker CAM++ (sherpa-onnx) | Talergenkendelse | Apache-2.0 |
| DeepFilterNet3 | Støjfjernelse | MIT / Apache-2.0 |
| Qwen3 4B (llama.cpp, tilvalg) | Lokal sprogmodel: bedste udgave, referat uden internet | Apache-2.0 |
| Whisper small (tilvalg) | Talte kommandoer | MIT |
| LAME 3.100 | MP3, separat dynamisk bibliotek | LGPL 2 |
Programmet indeholder open source-software og modeller under deres egne licenser. Se licenssiden.