printf 'private speech in process output'
printf 'private speech in process errors' >&2
`)
+
data := []byte("made-up audio")
text := transcriber.Text(t.Context(), store, data)
require.Contains(t, text, "[voice ")
name string
script string
}{
- {name: "failed process does not expose its errors", script: "echo secret-speech >&2; exit 1"},
- {name: "missing transcript gets a marker", script: "exit 0"},
- {name: "empty transcript gets a marker", script: "while [ \"$1\" != --output-file ]; do shift; done; shift; touch \"$1.txt\""},
+ {
+ name: "failed process does not expose its errors",
+ script: "echo secret-speech >&2; exit 1",
+ },
+ {
+ name: "missing transcript gets a marker",
+ script: "exit 0",
+ },
+ {
+ name: "empty transcript gets a marker",
+ script: "while [ \"$1\" != --output-file ]; do shift; done; shift; touch \"$1.txt\"",
+ },
}
+
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
store, transcriber := voiceTestInput(t, tc.script)
require.Equal(t, "(voice not stored)", transcriber.Text(t.Context(), store, []byte("audio")))
}
+func TestVoiceBackupsKeepAudioButNotTemporaryTranscripts(t *testing.T) {
+ root := t.TempDir()
+ store := &VoiceStore{dir: filepath.Join(root, voiceDirName)}
+ name, err := store.Save([]byte("made-up backed-up audio"))
+ require.NoError(t, err)
+
+ temp := filepath.Join(store.dir, ".transcript-in-progress")
+ require.NoError(t, os.Mkdir(temp, 0o700))
+ require.NoError(t, os.WriteFile(filepath.Join(temp, "text.txt"), []byte("private temporary text"), 0o600))
+
+ target := t.TempDir()
+ require.NoError(t, backupCopy(t.Context(), root, target, filepath.Join(t.TempDir(), "backup.tar.gz")))
+ require.FileExists(t, filepath.Join(target, voiceDirName, name))
+ require.NoDirExists(t, filepath.Join(target, voiceDirName, ".transcript-in-progress"))
+
+ archive := filepath.Join(t.TempDir(), "voice.tar.gz")
+ _, err = backupArchive(t.Context(), target, archive)
+ require.NoError(t, err)
+
+ restored := t.TempDir()
+ require.NoError(t, backupExtract(t.Context(), archive, restored))
+
+ audio, err := os.ReadFile(filepath.Join(restored, voiceDirName, name))
+ require.NoError(t, err)
+ require.Equal(t, []byte("made-up backed-up audio"), audio)
+
+ info, err := os.Stat(filepath.Join(restored, voiceDirName, name))
+ require.NoError(t, err)
+ require.Equal(t, os.FileMode(0o600), info.Mode().Perm())
+}
+
+func TestVoiceConfigReadsExplicitLocalPaths(t *testing.T) {
+ dir := t.TempDir()
+ configWriteTest(t, dir, `{"voice":{"transcriber":"local-whisper","model":"model.bin"}}`)
+
+ config, err := loadConfig(dir)
+ require.NoError(t, err)
+ require.Equal(t, VoiceConfig{
+ Transcriber: "local-whisper",
+ Model: "model.bin",
+ }, config.Voice)
+}
+
func TestVoiceLookupHonorsExplicitThenNixThenPath(t *testing.T) {
_, transcriber := voiceTestInput(t, "exit 0")
valid := transcriber.config
available: true,
},
{
- name: "invalid explicit executable does not fall back",
- config: VoiceConfig{Transcriber: "missing", Model: valid.Model},
+ name: "invalid explicit executable does not fall back",
+ config: VoiceConfig{
+ Transcriber: "missing",
+ Model: valid.Model,
+ },
program: valid.Transcriber,
},
{
program: valid.Transcriber,
},
}
+
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
program, model, err := voiceLookup(tc.config, tc.program, tc.model)