Python에서 이 특정 셸 명령을 어떻게 실행할 수 있나요?

Python에서 이 특정 셸 명령을 어떻게 실행할 수 있나요?

좋습니다. 작동하지 않는 쉘 스크립트가 있는데, 쉘에서 "예기치 않은 '|' 오류가 발생하는 것을 제외하고는 Python에서 하나씩 다시 작성하고 있습니다(아래 참조).

#/bin/sh
LINES=`cat $@ | wc -l`

for i in `seq 1 $lines`; do

head -n $i $@ | tail -n 1 | text2wave -o temp.wav
sox "otherstuff.wav" "temp.wav" "silence.wav" "output.wav"
mv output.wav otherstuff.wav
rm -rf temp.wav

done

이는 실제로 실현 가능성이 매우 낮습니다. 그러나 파일의 줄 수를 알고 있다면 특정 파일에서 실행하여 전체 파일을 TTS로 처리하고 각 줄 사이에 10초의 무음을 삽입할 수 있습니다.

LINES=`cat $@ | wc -l`

흐름 제어 목적과 어디에서나 사용할 수 있는 스크립트에 행 개수를 통합하는 방법으로 Python을 사용하여 작업을 수행하겠습니다. 지금까지 작동하지 않는 이 조각이 있습니다.

import linecache, os

for i in range(linelength):
    lineone = linecache.getline(filename, i)
    os.system("echo " + lineone + "|" + "festival --tts")

이로 인해 인터프리터에 다음 오류가 발생합니다 IPython.

d 68.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
d 67.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
c 52.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
c 42.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
c 71.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
c 51.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
c 19.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
c 18.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
b 16.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
b 15.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
b 1.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
d 16.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
d 14.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
a 96.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
a 95.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
a 35.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
a 25.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
d 74.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
d 83.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
a 9.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
d 9.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
b 97.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
b 99.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
b 76.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
b 77.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
d 89.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
d 99.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
b 94.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
d 54.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
d 66.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
c 81.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
c 61.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512

그리고 복사

for i in `seq 1 $lines`; do

head -n $i $@ | tail -n 1 | text2wave -o temp.wav

그러나 모든 것을 테스트하는 데는 더 편리합니다. 내용을 읽기만 하기 때문입니다( 동일한 패키지의 일부 festival이므로 text2wave하나는 내용을 읽고 다른 하나는 파일에 씁니다).

이제 검색되고 저장된 행 수는 다음과 같습니다 linelength(파이썬에서 이 작업을 수행하는 데 아무런 문제가 없습니다).

간단했다면

for i in range(linelength):
    lineone = linecache.getline(filename, i)
    os.system("echo somestuffnotaline | festival --tts")

그러면 페스티벌에서는 "someEhstuffnotaLINE"이라고 말하겠지만, "c 62" - "d 74" 등이라고 말한 것만큼 기쁘지는 않을 것입니다.각 줄의 내용은 다음과 같습니다.내가 작업 중인 파일에

답변1

귀하의 질문은 길고 장황하며 귀하가 원하는 답변이 무엇인지 모르겠습니다. 제목으로 볼 때 귀하의 초점은 다음 Python 코드인 것 같습니다.

lineone = linecache.getline(filename, i)
os.system("echo " + lineone + "|" + "festival --tts")

문제는 lineone마지막 줄 바꿈을 포함한 전체 줄입니다. Perl 분야의 사람들이 말했듯이 다음이 필요합니다.씹어 먹어라.

lineone = linecache.getline(filename, i).rstrip('\n')
os.system("echo " + lineone + "|" + "festival --tts")

첫 번째 쉘 스크립트는 매우 복잡하고 느려 보입니다. 행 수를 세고 숫자 순서대로 행을 검색하는 이유는 무엇입니까? 당신은 간단하게 할 수 있습니다한 번에 한 줄씩 입력 읽기, Python에서와 마찬가지로.

while IFS= read -r line; do
  echo "$line" | text2wave -o temp.wav
  sox "otherstuff.wav" "temp.wav" "silence.wav" "output.wav"
  mv output.wav otherstuff.wav
  rm temp.wav
done

헤더가 포함되어 있지 않으므로 연결할 수 있는 원시 오디오 파일을 사용하면 이를 더욱 단순화할 수 있습니다.

while IFS= read -r line; do
  echo "$line" | text2wave -otype raw >>otherstuff.raw
  cat silence.raw >>otherstuff.raw
done
sox … otherstuff.raw otherstuff.wav

sox원본 오디오 파일 인코딩의 매개변수(예: 샘플 깊이)를 알아야 합니다 .

답변2

입력 스트림에 행을 작성하려면 및 popen()대신 호출을 사용하는 것이 좋습니다 .system()

import linecache, os
p = os.popen("festival --tts", "w")
for i in range(linelength):
    lineone = linecache.getline(filename, i)
    p.write(lineone+'\n')
p.close()

festival여러 줄의 텍스트를 입력으로 사용할 수 있는 이점을 활용하세요 .

관련 정보