Два Bash / Applescript, необходимые для чтения и управления текстовыми файлами в папке - PullRequest
0 голосов
/ 11 октября 2011

У меня есть пара десятков текстовых (.txt) файлов, содержащих длинные списки слов (по одному в строке), которые я хочу преобразовать в аудиофайл с помощью OS X Lion «Текст в речь».Для этого мне нужно добавить в синтезатор голосовые теги разметки для контроля времени речи.

Скрипт 1

Вот формат того, что у меня есть в .txt файлах:

Word1
Word2
Word3

Вот что мне нужно для создания аудиофайла:

Word1
[[slnc 600]]

[[slnc 900]]
Word1

[[slnc 3000]]

Word2
[[slnc 600]]

[[slnc 900]]
Word2

[[slnc 3000]]

Word3
[[slnc 600]]

[[slnc 900]]
Word3

[[slnc 3000]]

...etc,

Текстовые файлы находятся на рабочем столе в папке с именем «Слова».Если возможно, было бы замечательно, если бы скрипт мог указывать на эту папку и указывать перебирать каждый файл .txt внутри, выполняя изменения, описанные выше.

Сценарий 2

Это нужно прочитать в словах / фразах, разделенных символом табуляции, из файлов .txt в папке Desktop, которая называется «French».Вот формат файла .txt с разделителями табуляции:

FrenchWord/Phrase1   EnglishWord/Phrase1
FrenchWord/Phrase2   EnglishWord/Phrase2

...etc,

И затем выводится как:

say "FrenchWord/Phrase1" using "Thomas"
delay 3
say "EnglishWord/Phrase1" using "Daniel"

delay 5

say "FrenchWord/Phrase2" using "Thomas"
delay 3
say "EnglishWord/Phrase2" using "Daniel"

delay 5

...etc,

Поскольку входные файлы .txt в этом случае содержат как отдельные слова, так и фразы,Я предполагаю, что сценарий должен будет захватить все «слева от табуляции» как французский, а все «справа от табуляции» как «английский».

Любая помощь будеточень ценится! :) 1027

Cheers,

Dave

1 Ответ

0 голосов
/ 11 октября 2011
$ cat words.txt 
Word1
Word2
Word3
$ ./script1 words.txt # will produce words-with-timings.txt
$ cat words-with-timings.txt 
Word1
[[slnc 600]]

[[slnc 900]]
Word1

[[slnc 3000]]

Word2
[[slnc 600]]

[[slnc 900]]
Word2

[[slnc 3000]]

Word3
[[slnc 600]]

[[slnc 900]]
Word3

[[slnc 3000]]

$ cat phrases.txt 
FrenchWord/Bon jour EnglishWord/Good day
FrenchWord/Bon mot  EnglishWord/Well met
$ ./script2 phrases.txt # will produce phrases-with-timings.txt
$ cat phrases-with-timings.txt 
say "FrenchWord/Bon jour" using Thomas
delay 3
say "EnglishWord/Good day" using Daniel

delay 5

say "FrenchWord/Bon mot" using Thomas
delay 3
say "EnglishWord/Well met" using Daniel

delay 5

script1:

#!/bin/bash

for wordfile_txt in "$@"
do

  wordfile_with_timings_txt=`echo $wordfile_txt | sed s/.txt/-with-timings.txt/`

  # Refuse to overwrite
  if [[ "$wordfile_txt" == "$wordfile_with_timings_txt" ]]
  then
    echo ".txt files only pls"
    exit 1
  fi

  while read word
  do
    echo $word
    echo '[[slnc 600]]'
    echo
    echo '[[slnc 900]]'
    echo $word
    echo
    echo '[[slnc 3000]]'
    echo
  done < $wordfile_txt > $wordfile_with_timings_txt

done

Скрипт2:

#!/bin/bash

for phrasefile_txt in "$@"
do

  phrasefile_with_timings_txt=`echo $phrasefile_txt | sed s/.txt/-with-timings.txt/`

  # Refuse to overwrite
  if [[ "$phrasefile_txt" == "$phrasefile_with_timings_txt" ]]
  then
    echo ".txt files only pls"
    exit 1
  fi

  while read line
  do
    phrase1="`echo "$line" | cut -f 1`"
    phrase2="`echo "$line" | cut -f 2`"

    echo say \"$phrase1\" using "Thomas"
    echo delay 3
    echo say \"$phrase2\" using "Daniel"
    echo
    echo delay 5
    echo
  done < $phrasefile_txt > $phrasefile_with_timings_txt

done

Чтобы запустить их в пакетном режиме, я предлагаю использовать find и xargs:

$ find lotta-words -type f
lotta-words/words1.txt
lotta-words/words2.txt
lotta-words/words3.txt
$ find lotta-words -type f | xargs ./script1 
$ find lotta-words -type f
lotta-words/words1-with-timings.txt
lotta-words/words1.txt
lotta-words/words2-with-timings.txt
lotta-words/words2.txt
lotta-words/words3-with-timings.txt
lotta-words/words3.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...