본문으로 건너뛰기
cccskills
무료GitHub에 공개

vibe-audio-quality

Check and document Vibe's audio quality and conformance. Runs public conformance and torture corpora (IETF CELLAR FLAC files, ISO/IEC 14496-26 Layer III, FFmpeg FATE samples, McGill WAVE and AIFF samples, EBU BW64 tests, Chromium and Firefox media tests, TagLib test data) through the real decoders. Valid files must match their FLAC MD5 or reference decode within the ISO accuracy limits, decode to the length the handle states and seek exactly. Every file must finish with finite samples. Also regenerates docs/audio-quality.md's charts and its corpus results matrix. Use after changing a decoder, a parser, the file-open path or the resampler, before a release, when asked whether decoding is correct or conformant, or to update the audio quality page.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

실행 점수 미검증

설치 방법 보기

포함된 파일(2)

  • SKILL.md7.7 KB
  • scripts/corpus.py14.9 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Audio quality and conformance

This skill owns docs/audio-quality.md: its charts, its numbers and its corpus results. The generated fixtures in make test-audio check what Vibe was built to do. The public corpora here check it against answers other people wrote down, on files nobody here made.

Running a corpus

S=.claude/skills/vibe-audio-quality/scripts
python3 $S/corpus.py list                  # each corpus, and whether it is downloaded
python3 $S/corpus.py run flac              # fetch it if missing, check it, record the results
python3 $S/corpus.py run all               # every corpus, one after another
python3 $S/corpus.py run fate --no-record  # check without touching the page's results
python3 $S/corpus.py fetch mp3-iso         # only download

A corpus downloads into build/audio-quality/corpora/<name>/. Only the files Vibe plays are kept, by the list in vibe-libs/audio/AudioTypes/PlayableExtensions.m, beside the reference decodes. Nothing downloaded is ever committed. make clean deletes the downloads. The next run fetches them again.

NameWhat it holdsWhat it checks
flacIETF CELLAR FLAC test files: subset, uncommon and faultyThe STREAMINFO MD5, bit for bit. Faulty files must only finish.
mp3-isoISO/IEC 14496-26 ed. 2: every MPEG-1, 2 and 2.5 Layer III stream, with ISO's reference WAVsEach stream against its reference, to ISO/IEC 11172-4's limits
fateFFmpeg's FATE samples, audio folders onlyThe MP3 conformance streams and Xiph's Vorbis vectors against their reference decodes. The rest must finish.
wavMcGill's WAVE and AIFF samples, EBU's libbw64 test dataRobustness
browserChromium's media/test/data and Firefox's dom/media/testRobustness
taglibTagLib 2.3.2's tests/dataRobustness

Each source is pinned in corpus.py: a commit, a tag or ISO's dated archive. McGill's pages and FATE are not versioned, but FATE never replaces a sample.

What the test checks

Tests/AudioRender/AudioQualityCorpusTests.m walks the folder corpus.py names in VIBE_AUDIO_QUALITY_CORPUS. Without one it skips, so make test-audio never reads a corpus. The skip is on the allowed list for that reason.

A file is valid when it has a reference decode beside it, or it is a FLAC whose MD5 the corpus vouches for. MD5_VOUCHED in corpus.py names those paths: only CELLAR's subset/ and uncommon/. Other sets keep shortened copies of real files, whose STREAMINFO still states the whole file's MD5. A valid file fails when it:

  • is refused;
  • differs from its MD5;
  • misses its reference;
  • decodes to a length other than the one the handle states;
  • lands a seek on other samples than the continuous decode.

Every file, valid or not, fails on a hang (300 s) or a sample that is not finite. A crash ends the run, and corpus.py names the file it died on. A file of unknown validity may be refused: many are video, or formats Vibe does not play. One that opens and then misbehaves is a warning: a read that fails, a length the decode does not reach, or a seek that lands elsewhere.

A known result is a file the corpus itself gets wrong. KNOWN in corpus.py lists each one with its reason, and it counts as known, not failed. Add one only after showing the corpus is wrong. For a reference decode, that means a second decoder that agrees with Vibe, not the reference.

  • Reference decodes sit beside the file as <file>.ref.f32, .ref.s16 or .ref.wav. A reference of 24 bits or more is held to ISO/IEC 11172-4's full accuracy: RMS under 2⁻¹⁵/√12 and no sample off by more than 2⁻¹⁴. A 16-bit one is held to limited accuracy: RMS under 2⁻¹¹/√12.
  • TRAP: an MPEG reference keeps Layer III's 529-frame synthesis delay at its start. The handle drops it. So the comparison starts 529 frames into the reference and leaves out the last 529 frames.
  • TRAP: ISO's decoder may leave out up to two leading frames it cannot decode. Each one moves the reference 1152 frames earlier. The test tries zero, one and two left out, and keeps the closest. The record's leftOut says which matched.
  • An integer reference cannot hold an over. Vibe's decode is clipped to the reference's range before the comparison.
  • The FLAC MD5 is skipped above 24 bits. The decode is float32, which holds 24.
  • Apple's decoders are not held to exact seeks.

Comparing with a release

The handle fuzz can write its mutants to a folder. Set TEST_RUNNER_VIBE_FUZZ_EXPORT while AudioFileHandleFuzzTests runs (Tests/AGENTS.md). AudioQualityCorpusTests.m reads only public headers, so it also builds in a release's worktree. Point it at the folder with TEST_RUNNER_VIBE_AUDIO_QUALITY_CORPUS and TEST_RUNNER_VIBE_AUDIO_QUALITY_RESULTS, in that worktree and in this one. Compare the two records file by file. A file that decodes less here than in the release is a regression, unless the release was wrong. The MPEG open was checked against 1.15 this way.

Reading the results

corpus.py run prints a table for each top-level folder of the corpus, then lists the failures and warnings. build/audio-quality/<name>.json has a record for each file: its decoder, rate, channels, stated and decoded length, and each check's result. build/audio-quality/<name>.log is the test run.

Sort what a run finds into three kinds:

  1. A decoder or parser bug. Make the case from generated fixtures, as Tests/AGENTS.md says, and add a test that fails before the fix. Never copy a corpus file into the repository.
  2. A file of unknown validity that is broken in a way Vibe handles sensibly. Leave it as a warning.
  3. A known limit, such as a format Vibe does not play. Write it down where the page or the code already explains the limit.

The audio quality page

  • python3 scripts/docs/audio_quality.py redraws every chart on docs/audio-quality.md. The numbers live in that script. The resampler's frequency response curves live in docs/audio-quality/response.json.
  • A recorded run writes its summary to docs/audio-quality/corpora.json and redraws corpus-results.svg, the page's corpus matrix.
  • Commit the page, the JSON and the redrawn SVGs together. Name the corpora and the date in the commit message.
  • When a decoder change moves a number on the page, measure again with the test or benchmark the page names. Then edit the number in audio_quality.py, and redraw.
  • The page's text follows the root AGENTS.md rule: short, plain sentences.

Traps

  • ISO's files may be used unmodified, for the standard's purposes. corpus.py fetches them on demand and only renames the streams to .mp3. FATE states no licence. Fetch both, and never commit them.
  • The Firefox listing uses GitHub's API, which allows 60 calls an hour without a token. A fetch needs two.
  • A file Vibe does not play by its extension is skipped, such as McGill's .aifc files. corpus.py fetch says how many it skipped.
  • The FLAC corpus is about 310 MB, most of it hi-res files and one 15.8 MB picture.

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Launch, drive, inspect, and visually verify the Vibe app — macOS, and the iOS simulator loop (launch-ios.sh, the debug-ios.sh command channel, the drive-ios.sh touch driver for taps and drags, silent flags, screenshots, host-side log streaming). Use whenever a change needs end-to-end verification, a screenshot of the running app, playback/UI state inspection, or appearance (light/dark) testing.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

cmicali/vibe492026년 10월 24일 업데이트

vibe-perf

무료

Measure Vibe's performance and compare two versions of the code. VibeBenchComponents drives the production decode, open, seek, resample, pitch, waveform, tempo/key, meter, metadata and cache code in-process with no app, counting retired instructions as well as wall and CPU time; perf.py builds it at any git ref and runs two refs interleaved (make bench-components); profile.sh finds one benchmark's hotspots; --analyze proves an analyzer change exact. Also owns the performance page (docs/performance.md): component charts per release (make bench-components-releases), app benchmarks (make bench-app), both (make bench-releases), redraw (make bench-report). Use before and after any change that could move cost, to find where time goes, to choose between implementations, to back a performance claim with numbers, or when asked to update, rerun or regenerate the performance page for a release, pre-release or new machine.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

cmicali/vibe492026년 10월 24일 업데이트

vibe-pr

무료

How to write a Vibe pull request title and description — simple, clear English that says what the change does, its benefit, and why, with pros and cons, charted results, and screenshots where they apply. Use when opening a pull request, or writing or rewriting a PR title or description.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

cmicali/vibe492026년 10월 24일 업데이트

Build, sign, notarize, and ship Vibe on both platforms — the macOS Developer ID (make release) and App Store (make appstore-build) paths, the iOS App Store path (make appstore-build-ios), the GitHub release publish (make github-release), the Homebrew tap bump (make brew-set-version), the localized product-page metadata upload (make appstore-upload-metadata), the shared App Store Connect API key and its Admin-role requirement, and the signing traps each script preflights. Use when cutting a release, distributing a build, shipping or TestFlighting the iOS app, updating App Store copy or screenshots, or debugging a signing/notarization/upload failure.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

cmicali/vibe492026년 10월 24일 업데이트

Stress, soak, fuzz, and torture the running Vibe app against a folder of real audio files — seeded random controller actions without pointer input, with consistency, leak, hang, and crash oracles, a single-playlist skip/seek torture suite for the delivery races that only open when transport outruns the metadata scan, a deterministic cloud-loading scenario suite over a fake file provider (download ordering, the foreground hold, the open deadline), plus the sanitizer (ASan/UBSan/TSan) and malloc-debug build matrix. Use for soak or endurance runs, memory-leak and resource-growth hunting, race hunting, fuzzing the file-loading path, hammering skips and seeks on a large playlist, testing cloud/placeholder loading order, or minimizing a failing run to a repro.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

cmicali/vibe492026년 10월 24일 업데이트

The localization pipeline — VibeStrings.h registry conventions, the extract-strings.sh preprocessor pass and extractionState rules, catalog and InfoPlist.xcstrings mechanics, authoring translations and the untranslated-keys release gate, translation terminology and per-language conventions, the pseudolocale audit, and the localized App Store product page. Use when adding or rewording any user-facing string, translating catalog keys, editing VibeStrings.h or the .xcstrings catalogs, debugging make strings / make check-strings, testing a language, or updating App Store copy or screenshots.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

cmicali/vibe492026년 10월 24일 업데이트

cmicali의 스킬 모두 보기

이 스킬의 문제 신고