$template_name, ] ), fn() => \file_get_contents( \rosavox\helpers\string_\coin( '{{directory}}/templates/{{name}}.html.tpl', [ 'directory' => /*__DIR__*/'.', 'name' => $template_name, ] ) ) ), $arguments ); } /** */ function navigate(string $target) : void { \header('Location: ' . $target); } /** */ function generate_audio(string $input, string $output_path) : void { $key = \hash('sha256', $input); $path_wav = \rosavox\helpers\string_\coin( '/tmp/{{key}}.wav', [ 'key' => $key, ] ); $path_ogg = $output_path; $command = \rosavox\helpers\string_\coin( 'echo "{{input}}" | piper/piper --model piper/voice.onnx --output_file {{path_wav}} && ffmpeg -y -i {{path_wav}} {{path_ogg}} ; rm -f {{path_wav}}', [ 'input' => $input, 'path_wav' => $path_wav, 'path_ogg' => $path_ogg, ] ); \exec($command); } /** */ function translate(string $key, ?array $options = null) : string { $strings = \rosavox\helpers\cache\get( 'strings', fn () => \json_decode(\file_get_contents('strings.json'), true) ); $options = \array_merge( [ 'language' => 'de', ], ($options ?? []) ); return ($strings[$options['language']][$key] ?? \sprintf('{%s}', $key)); } ?>