Я пишу скрипт bash для преобразования текстов песен в аудиоклипы с помощью espeak. Проблема в том, что espeak произносит только первое слово, а не строку за строкой, которую я читаю. Я пробовал помещать строки в файл с кавычками, но это не решило проблему.
Вот мой bash-скрипт:
#!/bin/bash
input="$1"
##input="/path/to/txt/file"
while IFS= read -r line
do
echo "$line"
espeak -k cantonese $line
done < "$input"
Вот текстовый файл построчно:
"Work it"
"Make it"
"Do it"
"Make us"
"Harder"
"Better"
"Faster"
"Stronger"
Как заставить espeak произнести каждое слово?
Обратите внимание, что при чтении файла с помощью этой -f
опции произносится каждое слово.
решение1
Вместо:
espeak -k cantonese $line
Использовать:
espeak -k cantonese "$line"
Когда вы пропускаетедвойные кавычкивокруг $line
, оболочка выполняетразделение словпо результатамрасширение параметра, и каждое слово передается как отдельный аргумент командной строки в espeak
. espeak
Команда произносит только первый аргумент. Написание "$line"
вместо $line
подавляет разбиение слов, в результате чего весь текст, сохраненный в line
параметре, передается как один аргумент в espeak
. (Это также подавляетподстановка(Это еще одна ситуация, которую вы не хотите, чтобы она произошла, хотя ваши тестовые входные данные, скорее всего, пока не вызвали ее.)
Это происходит даже в более простых случаях использования espeak
. Например, espeak hello world
говорит просто «привет», в то время как espeak 'hello world'
или espeak "hello world"
говорит «привет, мир».
Что касается того, чтодобрыйцитатиспользовать, причина писать "$line"
, а не чем '$line'
, заключается в том, чтоодинарные кавычкислишком мощные для того, что вам нужно. Они подавят разделение слов и подстановку, но они будуттакжеподавить расширение параметра. Таким образом '$line'
, с помощью espeak
команда увидит буквальный текст $line
вместо текста, содержащегося в line
параметре.