Я пишу сценарий 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"
Как заставить говорить на эспике каждое слово? ] Обратите внимание, что каждое слово произносится, когда я читаю из файла, используя опцию -f
.
Вместо:
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
.