espeak를 사용하는 bash 스크립트는 첫 번째 단어만 말합니다

espeak를 사용하는 bash 스크립트는 첫 번째 단어만 말합니다

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리터럴 텍스트를 보게 됩니다 .$lineline

관련 정보