Running echo "say hello" | at now+1 on macOS should enqueue a task to be executed one minute in the future: saying hello. Issuing say hello works fine, as does echo "touch a-file" | at now+1, but the combination does not.
I believe that the runtime environment on which launchd executes atrun (the at daemon) is restricted and cannot complete the speech synthesis instructed by say. However, I cannot easily determine if this is the case.
What is the problem?