我试图将一些音频文件与一些书面文本段落相匹配.
我开始时只有一个人阅读打字段落的音频文件.然后,我在每个静默期间使用sox分割音频文件,并且类似地分割类型文本,使得每个唯一的句子在唯一的行上.
然而,在每个时期都没有完美地发生分裂,但每当说话者暂停时.我需要创建一个列表,其中哪些音频文件对应于哪些类型的句子,例如:
0001.wav This is a sentence.
0002.wav This is another sentence.
请注意,有时2个或更多音频文件对应于单个句子,例如:
> 0001.wav(“这是一个”)0002.wav(“句子”)=“这是一个句子.”
为了帮助匹配文本,我使用软件来计算音频中的音节并计算键入文本中的音节.
这个数据我有两个文件.第一个,“sentences.txt”,是文本中所有句子的列表,每行一个,带有它们的音节数,例如:
5 This is a sentence. 7 This is another sentence. 8 This is yet another sentence. 9 This is still yet another sentence.
我可以使用awk -f“”{print $1} sentences.txt删除句子数据,以获得此syllables_in_text.txt:
5
7
8
9
第二个文件syllables_in_audio.txt有一个音频文件列表,顺序相同,具有近似的音节计数.有时略低于文本中的实际数字,因为音节计数软件并不完美:
0001.wav 3
0002.wav 2
0003.wav 4
0004.wav 5
0005.wav 7
0006.wav 3
0007.wav 2
0008.wav 3
如何打印音频文件的列表(“output.txt”),使音频文件文件名与“sentences.txt”中的文本句子出现在同一行,例如:
0001.wav 0002.wav
0003.wav 0004.wav
0005.wav
0006.wav 0007.wav 0009.wav
下面是两个文件的表格,用于演示两个文件如何并排排列.文件“0001.wav”和“0002.wav”都需要使句子“这是一个句子”.这些文件名在“output.txt”的第1行列出,而相应的句子在“sentences.txt”的行中以文本形式写入:
Contents of "output.txt": | Contents of "sentences.txt":
0001.wav 0002.wav | 5 This is a sentence.
0003.wav 0004.wav | 7 This is another sentence.
0005.wav | 8 This is yet another sentence.
0006.wav 0007.wav 0009.wav | 9 This is still yet another sentence.
最佳答案 您可以按如下方式创建awk脚本.伪代码:
BEGIN {
init counter=1
read your first file (syllables_in_text.txt) with getline till the end (while...)
store its value in firstfile[counter]
counter++
# when you had finished reading your first file
init another_counter=1
read your second file (syllables_in_audio.txt) with getline till the end (while...)
if $2 (second col from your file) <= firstfile[another_counter]
store $1 like o[another_counter]=" " $1
else
another_counter++
store $1 like o[another_counter]=" " $1
finally loop over the o array after sorint it
print its contents after removing the leading space
}
但还有其他解决方案……