espeak를 사용하여 가사를 오디오 클립으로 변환하는 bash 스크립트를 작성 중입니다. 문제는 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"
생략할 때큰따옴표around $line
, 쉘은 수행합니다단어 분리결과에매개변수 확장, 각 단어는 별도의 명령줄 인수로 에 전달됩니다 espeak
. 이 espeak
명령은 첫 번째 인수만 말합니다. "$line"
대신 쓰기를 사용하면 $line
단어 분할이 억제되어 매개변수에 저장된 모든 텍스트가 line
단일 인수로 에 전달됩니다 espeak
. (그것도 억제한다.글로빙, 이는 이 상황에서 발생하고 싶지 않은 또 다른 일이지만 테스트 입력이 지금까지 트리거되지 않았을 가능성이 높습니다.)
이는 의 간단한 사용에서도 발생합니다 espeak
. 예를 들어, espeak hello world
"hello"라고만 말하고 "hello world"라고 말합니다 espeak 'hello world'
.espeak "hello world"
무엇에 관해서는친절한따옴표"$line"
사용하기 위해 , 대신 을 쓰는 이유 '$line'
는작은따옴표필요한 것에 비해 너무 강력합니다. 그들은 단어 분할과 글로빙을 억제하지만또한매개변수 확장을 억제합니다. 따라서 를 사용하면 '$line'
명령 은 매개변수 에 포함된 텍스트 대신 espeak
리터럴 텍스트를 보게 됩니다 .$line
line