如何让make处理多个音频文件

问题描述 投票:0回答:1

我的 make 文件中有一部分可以进行语音到文本的转换。它适用于目录中的每个 mp3 文件。

%.txt : %.mp3
    $(WS) $(FLAGS) ./$<

但是该软件也可以愉快地处理 .wav .m4a 文件等。我花了很多时间将东西转换为 mp3。有没有办法以同样的方式处理大量音频文件?像下面这样的东西(不起作用)

%.txt : %.mp3 %.wav %.m4a 
    $(WS) $(FLAGS) ./$<

完整修改Make文件的帖子

.SUFFIXES : .txt .m4a .mp3 .wav
SOURCES := $(wildcard  *.m4a)
TEXT := $(wildcard  *.txt)
OBJ := $(subst m4a,txt,$(SOURCES))
WS = whisper

FLAGS = --device cuda:1 --model small 
.PHONY: test clean imported

define template =
%.txt: %.$(1)
        $(WS) $(FLAGS) $$<
endef
$(foreach extension,mp3 wav m4a,$(eval $(call template,$(extension))))

BIN := $(wildcard *.mp3 *.wav *.m4a)
TXT := $(addsuffix .txt,$(basename $(BIN)))

all: $(TXT)


clean :
    rm *~ *.json  *.srt  *.tsv  *.vtt 

split: $(TEXT)
    awk -v RS="[.]" -v ORS=".\n" 'NR%70==1 {file = sprintf("./tmp/$(patsubst %.txt,%, $< )%04d.txt", NR)} {print > file}' $< 

imported:
    mv odt/*.odt odt/imported/

test: $(SOURCES)
    @echo $(OBJ)
    @echo PREREQUISITES: $^
makefile gnu-make
1个回答
0
投票

当普通的旧 shell 可以完成这项工作时,为什么还要使用 makefile?

 WS=ws
 FLAGS="-foo -bar"
 for file in *.mp3 *.wav *.m4a; do
    $WS $FLAGS $file
 done

您想走

make
路有什么特别的原因吗?如果是因为不想转换已经转换的文件,可以测试一下对应的txt文件是否存在

如果您不想在 makefile 中重复编写相同的配方,因为您有大量文件扩展名,则可以使用参数化模板配方和

eval
函数,如下所示:

WS    := @echo ws
FLAGS := --foo --bar

define template =
%.txt: %.$(1)
        $(WS) $(FLAGS) $$<
endef
$(foreach extension,mp3 wav m4a,$(eval $(call template,$(extension))))

BIN := $(wildcard *.mp3 *.wav *.m4a)
TXT := $(addsuffix .txt,$(basename $(BIN)))

all: $(TXT)
© www.soinside.com 2019 - 2024. All rights reserved.