Files
alice-backend/server/quick-actions.mjs
T

60 lines
3.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const units = 'ноль один два три четыре пять шесть семь восемь девять десять одиннадцать двенадцать тринадцать четырнадцать пятнадцать шестнадцать семнадцать восемнадцать девятнадцать'.split(' ');
const tens = 'двадцать тридцать сорок пятьдесят шестьдесят семьдесят восемьдесят девяносто'.split(' ');
function volumeLevel(text) {
if (/^\d{1,3}$/.test(text)) return Number(text);
if (text === 'сто') return 100;
const words = text.split(' ');
if (words.length === 1 && units.includes(words[0])) return units.indexOf(words[0]);
const decade = tens.indexOf(words[0]);
if (decade === -1) return -1;
if (words.length === 1) return (decade + 2) * 10;
const unit = units.indexOf(words[1]);
return words.length === 2 && unit >= 1 && unit <= 9 ? (decade + 2) * 10 + unit : -1;
}
export function quickAction(transcript) {
const text = transcript.toLowerCase().replace(/[.,!?;:…\s]+/gu, ' ').trim()
.replace(/^алиса\s+/, '').replace(/^пожалуйста\s+|\s+пожалуйста$/g, '');
const pc = /^(включи|запусти|выключи|отключи|останови) (?:звук|трансляцию(?: звука)?) (?:с |из )?(?:пк|компьютера|компа)(?: на колонку| на колонке)?$/u.exec(text);
if (pc) {
const enabled = pc[1] === 'включи' || pc[1] === 'запусти';
return {
name: 'pc_audio',
args: { action: enabled ? 'start' : 'stop' },
done: enabled ? 'Звук с компьютера включён.' : 'Звук с компьютера выключен.',
failure: 'Не удалось переключить звук с компьютера. Проверь агент на Windows.',
success: result => result?.ok === true && result.enabled === enabled,
};
}
if (/^(?:пауза|на паузу|(?:поставь|поставить)(?: музыку| воспроизведение)? на паузу|(?:приостанови|выключи|останови) (?:музыку|воспроизведение))$/.test(text)) {
return {
name: 'spotify_control',
args: { action: 'pause' },
done: 'Музыка на паузе.',
failure: 'Не удалось поставить музыку на паузу.',
success: result => result?.accepted === true && ['paused', 'stopped'].includes(result.status),
};
}
if (text === 'громче' || text === 'тише') return {
name: 'station_volume', args: { delta: text === 'громче' ? 10 : -10 }, done: 'Готово.',
failure: 'Не удалось изменить громкость.', success: result => result?.ok === true,
};
const playback = { 'продолжи': 'resume', 'продолжай': 'resume', 'играй': 'resume', 'дальше':'next', 'следующий трек':'next', 'назад':'previous', 'предыдущий трек':'previous' }[text];
if (playback) return {
name: 'spotify_control', args: { action: playback }, done: 'Готово.',
failure: 'Не удалось выполнить команду Spotify.', success: result => result?.accepted === true,
};
const match = text.match(/^(?:(?:поставь|установи|сделай) )?громкость(?: на| до)? (.+?)(?: ?%| процент(?:а|ов)?)?$/);
if (!match) return null;
const level = volumeLevel(match[1]);
if (level < 0 || level > 100) return null;
return {
name: 'station_volume',
args: { level },
done: `Громкость ${level}%.`,
failure: 'Не удалось изменить громкость колонки.',
success: result => result?.ok === true && result.level === level,
};
}