Sua pergunta é longa e desconexa e não sei o que você espera de uma resposta. Indo pelo seu título, acho que seu foco está neste fragmento de código Python:
lineone = linecache.getline(filename, i)
os.system("echo " + lineone + "|" + "festival --tts")
Seu problema é que lineone
é toda a linha, incluindo a nova linha final. Você precisa, como dizem em terra Perl, chomp it .
lineone = linecache.getline(filename, i).rstrip('\n')
os.system("echo " + lineone + "|" + "festival --tts")
Seu primeiro script de shell parece muito complicado e lento para o que ele faz. Por que você está computando o número de linhas e recuperando as linhas por número em ordem? Você poderia simplesmente leia a entrada uma linha de cada vez , como você faz em 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
Você deve ser capaz de simplificar isso ainda mais usando arquivos de áudio brutos, que não contêm um cabeçalho e, portanto, podem ser concatenados:
while IFS= read -r line; do
echo "$line" | text2wave -otype raw >>otherstuff.raw
cat silence.raw >>otherstuff.raw
done
sox … otherstuff.raw otherstuff.wav
Você precisará informar sox
de quais parâmetros (como profundidade de amostragem) o arquivo de áudio bruto está codificado.