c26b6aac82
El SDK CI - dev / build-and-test (pull_request) Failing after 4m18s
The speaker and the voice-fetch landed in the previous commit. This is the remainder of the 939-line Swift program, ported, and the line it draws is between DEVICE and ARITHMETIC rather than between languages. Two things stay realizers, because they are the two things El cannot express as arithmetic: handing a buffer to the DAC and waiting for it to drain (el_audio_darwin.m), and asking the OS for samples off a mic or frames off a camera (el_capture_darwin.m). Both are their own translation units declared in el_runtime.h, never patches to el_runtime.c. Everything else is El. WAV decode, LPC autocorrelation, Levinson-Durbin at order 16, formant extraction off the all-pole envelope, source-filter resynthesis, and the three descriptors are organ_dsp.el. Consent, disclosure and the scene descriptor are organ.el. Barge-in, yield-or-hold, backchannel and resume are organ_converse.el. The organ never learns a word. Codes and phoneme geometry arrive from the language side; the organ turns them into samples and gets the samples out the speaker, and runs the same trip in reverse for the senses. No lexicon, no grapheme-to-phoneme, by design. Barge-in needed pause/resume and a real DAC position rather than a tick counter, because "finish the buffer" is not barge-in and a queue holding three buffers is a third of a second wrong about where it is. An injected barge also had to fire once rather than stay true, which is otherwise a livelock the moment a backchannel resumes. Measured against the Swift on out/mic_room.wav: seconds, rms, peak, zcr, centroid and F0 agree to every printed digit; formants F1-F5 and bandwidths B1-B5 are identical. imitate cannot match bit-for-bit because the Swift excites unvoiced frames with Double.random — two Swift runs correlate 0.957 with each other and El correlates 0.958 with Swift, so the port is as close to the original as the original is to itself. Verified end to end: consent fails closed on both locks, real mic capture (16000 frames), real camera frame (1920x1080 -> 15 numbers), voiceprint, imitate, hear-imitate, a voice learned by ear and fetched back out of the engram, and all five converse paths with real audio. The binary contains zero afplay/Swift strings and spawns no child process while speaking.
68 lines
2.7 KiB
Bash
Executable File
68 lines
2.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# build.sh — build the El organ.
|
|
#
|
|
# El has no import system on this path, so the modules are concatenated in
|
|
# dependency order (the same thing elp/tests/run.sh does) and handed to elc as
|
|
# one unit. The two device realizers are then linked in.
|
|
#
|
|
# MUST be run from the repo root, or the .psv phoneme geometry will not resolve
|
|
# and the render silently degrades.
|
|
set -uo pipefail
|
|
|
|
OUT="${1:-./peripheral/organ}"
|
|
REPO="$(cd "$(dirname "$0")/.." && pwd)"
|
|
cd "$REPO"
|
|
|
|
WORK="$(mktemp -d)"
|
|
trap 'rm -rf "$WORK"' EXIT
|
|
|
|
# Dependency order. The elp modules supply the render (synth_codes) and the
|
|
# phoneme-geometry read; the organ supplies everything else.
|
|
cat elp/src/voice-profile.el \
|
|
elp/src/accent.el \
|
|
elp/src/voice-ingest.el \
|
|
elp/src/speech-ingest.el \
|
|
elp/src/speech.el \
|
|
peripheral/src/organ.el \
|
|
peripheral/src/organ_dsp.el \
|
|
peripheral/src/organ_converse.el \
|
|
peripheral/src/organ_cli.el \
|
|
| grep -v '^import ' > "$WORK/organ.el"
|
|
|
|
cd "$REPO/lang"
|
|
./dist/platform/elc "$WORK/organ.el" > "$WORK/organ.c" || { echo "elc failed" >&2; exit 1; }
|
|
|
|
SSL_PREFIX="$(brew --prefix openssl@3 2>/dev/null || echo /usr/local)"
|
|
|
|
# The peripheral realizers are per-platform: Darwin gets the real devices,
|
|
# anything else gets el_peripheral_null.c and honestly reports having none.
|
|
case "$(uname)" in
|
|
Darwin)
|
|
# The Objective-C realizers are compiled SEPARATELY, with -fobjc-arc. The
|
|
# capture realizer is written against ARC (it holds AVFoundation objects);
|
|
# compiling it MRR silently changes its memory semantics, which on a device
|
|
# path shows up as a use-after-free under load rather than as an error here.
|
|
cc -std=c11 -fobjc-arc -O1 -I runtime -c runtime/el_audio_darwin.m -o "$WORK/el_audio.o" || exit 1
|
|
cc -std=c11 -fobjc-arc -O1 -I runtime -c runtime/el_capture_darwin.m -o "$WORK/el_capture.o" || exit 1
|
|
PERIPH_SRC="$WORK/el_audio.o $WORK/el_capture.o"
|
|
PERIPH_LIBS="-framework AudioToolbox -framework AVFoundation -framework CoreMedia
|
|
-framework CoreVideo -framework CoreGraphics -framework ImageIO
|
|
-framework Foundation"
|
|
;;
|
|
*)
|
|
PERIPH_SRC="runtime/el_peripheral_null.c"
|
|
PERIPH_LIBS=""
|
|
;;
|
|
esac
|
|
|
|
cc -O1 -I runtime -I"$SSL_PREFIX/include" -L"$SSL_PREFIX/lib" \
|
|
-o "$OUT" "$WORK/organ.c" \
|
|
runtime/el_runtime.c runtime/el_seed.c \
|
|
runtime/engram_cognition.c runtime/engram_geometry.c runtime/engram_reason.c \
|
|
runtime/engram_store.c runtime/engram_verify.c runtime/engram_vindex.c \
|
|
runtime/eg_cosine_batch.c runtime/eg_cosine_batch_strategy_cpu.c \
|
|
$PERIPH_SRC $PERIPH_LIBS \
|
|
-lcurl -lssl -lcrypto -lpthread -lm || { echo "link failed" >&2; exit 1; }
|
|
|
|
echo "built: $OUT"
|