-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathtranscribe.py
61 lines (42 loc) · 1.38 KB
/
transcribe.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import openai
import pydub
import sys
import io
import concurrent.futures
# get file key from args
file_key = sys.argv[1]
# divide audio file 10 minutes chunks
audio = pydub.AudioSegment.from_file(file_key)
chunks = pydub.utils.make_chunks(audio, 600000)
# convert chunks to mp3
def chunk_to_mp3(chunk):
f = io.BytesIO()
chunk.export(f, format="mp3")
return f
def mp3_files_gen(chunks, max_workers=8):
with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
for mp3_file in executor.map(chunk_to_mp3, chunks):
yield mp3_file
mp3_files = list(mp3_files_gen(chunks))
print(f"Transcribing {len(mp3_files)} chunks...")
full_text = ""
# transcribe each chunk
def transcribe_chunk(i, mp3):
random_name = f"whisper-{i}.mp3"
print(f"Transcribing chunk {i} as {random_name}...")
mp3.name = random_name
data = openai.Audio.transcribe("whisper-1", mp3)
print(f"Chunk {i} transcribed.")
return data["text"]
num_chunks = len(mp3_files)
with concurrent.futures.ThreadPoolExecutor(max_workers=8) as executor:
transcribed_texts = list(
executor.map(transcribe_chunk, range(num_chunks), mp3_files)
)
full_text = "".join(transcribed_texts)
print(full_text)
# save full text to file
file_name = file_key.split("/")[-1].split(".")[0]
with open(f"{file_name}.txt", "w") as f:
f.write(full_text)
f.close()