Refine wb-rules examples and align player/TTS API

This commit is contained in:
2026-04-02 11:16:25 +03:00
parent 50961eb3fc
commit 2c8f9f32b9
5 changed files with 290 additions and 19 deletions

View File

@@ -0,0 +1,117 @@
// Примеры wb-rules для ОДНОЙ выбранной станции.
//
// Как использовать:
// 1) подставь id станции из data/stations.json в переменную STATION;
// 2) скопируй файл в /etc/wb-rules/;
// 3) перезапусти сервис wb-rules.
var API_BASE = "http://127.0.0.1:9124";
var STATION = "PUT_EXACT_STATION_ID_HERE";
function enc(v) {
return encodeURIComponent(String(v === undefined || v === null ? "" : v));
}
function apiExec(query, cb) {
runShellCommand("curl -s '" + API_BASE + "/api/exec?" + query + "'", {
captureOutput: true,
exitCallback: function(exitCode, output) {
if (exitCode !== 0) return cb({ ok: false, error: "curl_failed" });
try { cb(JSON.parse(output || "{}")); } catch (e) { cb({ ok: false, error: "bad_json", raw: output }); }
}
});
}
function player(cmd) {
apiExec("action=player&station=" + enc(STATION) + "&cmd=" + enc(cmd), function() {});
}
function tts(text, volume) {
apiExec(
"action=tts&station=" + enc(STATION) + "&text=" + enc(text) + "&volume=" + enc(volume),
function() {}
);
}
function command(text) {
apiExec("action=command&station=" + enc(STATION) + "&text=" + enc(text), function() {});
}
function audioTts(text, audioId, volume, voice, effect) {
var v = String(voice || "");
var e = String(effect || "");
apiExec(
"action=tts&station=" + enc(STATION) +
"&text=" + enc(text) +
"&tts_audio=" + enc(audioId) +
"&tts_voice=" + enc(v) +
"&tts_effect=" + enc(e) +
"&volume=" + enc(volume),
function() {}
);
}
defineVirtualDevice("alice_one_station_examples", {
title: "Алиса: одна станция",
cells: {
play_btn: { type: "pushbutton", value: false, title: "Play" },
stop_btn: { type: "pushbutton", value: false, title: "Stop" },
next_btn: { type: "pushbutton", value: false, title: "Next" },
prev_btn: { type: "pushbutton", value: false, title: "Prev" },
tts_btn: { type: "pushbutton", value: false, title: "TTS" },
command_btn: { type: "pushbutton", value: false, title: "Command" },
audio_tts_btn:{ type: "pushbutton", value: false, title: "Audio + TTS" }
}
});
// Правило 1: команда player=play
defineRule("alice_example_play", {
whenChanged: "alice_one_station_examples/play_btn",
then: function(v) { if (v) player("play"); }
});
// Правило 2: команда player=stop
defineRule("alice_example_stop", {
whenChanged: "alice_one_station_examples/stop_btn",
then: function(v) { if (v) player("stop"); }
});
// Правило 3: команда player=next
defineRule("alice_example_next", {
whenChanged: "alice_one_station_examples/next_btn",
then: function(v) { if (v) player("next"); }
});
// Правило 4: команда player=prev
defineRule("alice_example_prev", {
whenChanged: "alice_one_station_examples/prev_btn",
then: function(v) { if (v) player("prev"); }
});
// Правило 5: обычный TTS-текст с громкостью 35
defineRule("alice_example_tts", {
whenChanged: "alice_one_station_examples/tts_btn",
then: function(v) {
if (!v) return;
tts("Тестовое голосовое сообщение", 35);
}
});
// Правило 6: обычная голосовая команда станции
defineRule("alice_example_command", {
whenChanged: "alice_one_station_examples/command_btn",
then: function(v) {
if (!v) return;
command("включи радио");
}
});
// Правило 7: звук + TTS в одном запросе (параметр tts_audio)
defineRule("alice_example_audio_tts", {
whenChanged: "alice_one_station_examples/audio_tts_btn",
then: function(v) {
if (!v) return;
// Тот же звук и голос, что в правиле "Дверной звонок" из `Новая папка/rules.json`.
audioTts("Кто-то ждёт у входной двери", "alice-sounds-things-bell-1.opus", 70, "anton_samokhvalov", "");
}
});