Whisper 语音识别
类别: Whisper 标签: OpenAI Pydub目录
Whisper
功能
- 将音频转录成音频所使用的任何语言。
- 将音频翻译并转录成英文。
文件上传目前限制为 25 MB
,并且支持以下输入文件类型:mp3
, mp4
, mpeg
, mpga
, m4a
, wav
, webm
.
语音内容
Mira Murati 是一位对人工智能技术充满热情的科技领袖,她的理念和影响对人工智能技术的发展和应用产生了深远的影响。
她认为人工智能技术应该是以人为本的,强调人工智能技术应该是一种能够服务于人类的工具,而不是取代人类的工具。
她指出,人工智能技术的最终目的是为人类服务,因此人工智能技术应该以人类的利益和需求为中心,以解决人类面临的实际问题。人工智能技术的应用需要深入了解人类社会的需要和价值,将其应用到真正有意义的领域中。
OpenAI Whisper
安装 OpenAI
!pip install -U openai
测试
语音识别
import openai
audio_file= open("data/audios/test.m4a", "rb")
transcript = openai.Audio.transcribe("whisper-1", audio_file)
print(transcript["text"])
Miramurati是一位对人工智能技术充满热情的科技领袖 他的理念和影响对人工智能技术的发展和应用产生了深远的影响 他认为人工智能技术应该是以人为本的 强调人工智能技术应该是一种能够服务于人类的工具 而不是取代人类的工具 他指出人工智能技术的最终目的是为人类服务 因此人工智能技术应该以人类的利益和需求为中心 以解决人类面临的实际问题 人工智能技术的应用需要深入了解人类社会的需要和价值 将其应用到真正有意义的领域中
👍 可以看到转换的非常准确,但是缺少了标点符号,英文名字也有一点小小的问题。
通过提示(prompt)改进语音识别
import openai
audio_file= open("data/audios/test.m4a", "rb")
transcript = openai.Audio.transcribe("whisper-1", audio_file,
prompt="欢迎收听 Mira Murati 的理念与影响的讲座。")
print(transcript["text"])
Mira Murati 是一位对人工智能技术充满热情的科技领袖。 她的理念和影响对人工智能技术的发展和应用产生了深远的影响。 她认为人工智能技术应该是以人为本的, 强调人工智能技术应该是一种能够服务于人类的工具, 而不是取代人类的工具。 她指出,人工智能技术的最终目的是为人类服务, 因此人工智能技术应该以人类的利益和需求为中心, 以解决人类面临的实际问题。 人工智能技术的应用需要深入了解人类社会的需要和价值, 将其应用到真正有意义的领域中。
这里还有个小问题,每个标点符号后面都有一个空格。这个小问题不好解决啊。
更长的输入
默认情况下,Whisper API 仅支持小于 25 MB 的文件。如果您有比这更长的音频文件,则需要将其分成 25 MB 或更小的块或使用压缩音频格式。为了获得最佳性能,我们建议您避免在句子中间打断音频,因为这可能会导致某些上下文丢失。
一种处理方法是使用 PyDub 开源 Python 包来分割音频:
安装 Pydub
pip install pydub
手动分割测试
from pydub import AudioSegment
audio = AudioSegment.from_file("data/audios/test.m4a")
# Pydub handles time in milliseconds
thirty_seconds = 30 * 1000
first_30_seconds = audio[:thirty_seconds]
first_30_seconds.export("tmp/test1.mp3", format="mp3")
last_seconds = audio[thirty_seconds:]
last_seconds.export("tmp/test2.mp3", format="mp3")
import openai
for file in ["tmp/test1.mp3", "tmp/test2.mp3"]:
audio_file= open(file, "rb")
transcript = openai.Audio.transcribe("whisper-1", audio_file,
prompt="大家好,欢迎收听 Mira Murati 的理念与影响的讲座。")
print(transcript["text"])
Mira Murati 是一位对人工智能技术充满热情的科技领袖。 她的理念和影响对人工智能技术的发展和应用产生了深远的影响。 她认为人工智能技术应该是以人为本的, 强调人工智能技术应该是一种能够服务于人类的工具, 而不是一种工具。
人工智能技术不是取代人类的工具。 他指出,人工智能技术的最终目的是为人类服务, 因此人工智能技术应该以人类的利益和需求为中心, 以解决人类面临的实际问题。 人工智能技术应用需要深入了解人类社会的需要和价值, 将其应用到真正有意义的领域中。
可以看出暴力分割,对于分割的句子是有影响的。接下来我们看看如何在标点符号处进行分割。
自动分割测试
import os
import shutil
from pydub import AudioSegment, silence
def audio_transcribe(file, prompt):
audio_file= open(file, "rb")
transcript = openai.Audio.transcribe("whisper-1", audio_file, prompt=prompt)
return transcript["text"]
def detect_first_silent(audio, start_time, time_step=10, min_silence_len=500, silence_thresh=-40):
slice_audio = audio[start_time:start_time+time_step*1000]
silents = silence.detect_silence(slice_audio, min_silence_len=min_silence_len, silence_thresh=silence_thresh)
if len(silents):
return (start_time+silents[0][0], start_time+silents[0][1])
return (start_time, start_time)
def split_audio_file(filename, interval_seconds, save_dir):
audio_files = []
name = os.path.splitext(os.path.basename(filename))[0]
audio = AudioSegment.from_file(filename)
audio_len = len(audio)
index = 1
start_time = 0
while start_time < audio_len:
end_time = start_time + interval_seconds*1000
if end_time > audio_len:
end_time = audio_len
silent_start_time, slient_end_time = detect_first_silent(audio, end_time)
end_time = silent_start_time
audio_file = os.path.join(save_dir, f"{name}{index}.mp3")
audio[start_time:end_time].export(audio_file, format="mp3")
audio_files.append(audio_file)
start_time = slient_end_time
index += 1
return audio_files
def transcribe_audio_files(audio_files, prompt, prompt_len=100):
text_files = []
for audio_file in audio_files:
print("😍", prompt)
text = audio_transcribe(audio_file, prompt)
print(text)
text_file = os.path.splitext(audio_file)[0]+".txt"
with open(text_file, "a") as f:
f.write(text)
text_files.append(text_file)
prompt = text[-prompt_len:] if len(text) > prompt_len else text
return text_files
def merge_text_files(text_files, output_file):
with open(output_file, "a") as f:
for text_file in text_files:
with open(text_file, "r") as f_text:
f.write(f_text.read())
save_dir = "tmp"
shutil.rmtree(save_dir)
os.mkdir(save_dir)
filename = "data/audios/test.m4a"
audio_files = split_audio_file(filename, 20, save_dir)
prompt = "大家好,欢迎收听 Mira Murati 的理念与影响的讲座。"
text_files = transcribe_audio_files(audio_files, prompt)
text_file = os.path.join(save_dir, "test.txt")
merge_text_files(text_files, text_file)
本地 Whisper
安装 Whisper
pip install -U openai-whisper
本地语音识别
import os
import shutil
import whisper
from pydub import AudioSegment, silence
def audio_transcribe_with_openai(whisper_service, file, prompt):
audio_file= open(file, "rb")
transcript = whisper_service.transcribe("whisper-1", audio_file, prompt=prompt)
return transcript["text"]
def audio_transcribe_with_local(whisper_service, file, prompt):
transcript = whisper_service.transcribe(file, initial_prompt=prompt)
return transcript["text"]
def detect_first_silent(audio, start_time, time_step=10, min_silence_len=500, silence_thresh=-40):
slice_audio = audio[start_time:start_time+time_step*1000]
silents = silence.detect_silence(slice_audio, min_silence_len=min_silence_len, silence_thresh=silence_thresh)
if len(silents):
return (start_time+silents[0][0], start_time+silents[0][1])
return (start_time, start_time)
def split_audio_file(filename, interval_seconds, save_dir):
audio_files = []
name = os.path.splitext(os.path.basename(filename))[0]
audio = AudioSegment.from_file(filename)
audio_len = len(audio)
index = 1
start_time = 0
while start_time < audio_len:
end_time = start_time + interval_seconds*1000
if end_time > audio_len:
end_time = audio_len
silent_start_time, slient_end_time = detect_first_silent(audio, end_time)
end_time = silent_start_time
audio_file = os.path.join(save_dir, f"{name}{index}.mp3")
audio[start_time:end_time].export(audio_file, format="mp3")
audio_files.append(audio_file)
start_time = slient_end_time
index += 1
return audio_files
def transcribe_audio_files(audio_transcribe, whisper_service, audio_files, prompt, prompt_len=100):
text_files = []
for audio_file in audio_files:
print("😍", prompt)
text = audio_transcribe(whisper_service, audio_file, prompt)
print(text)
text_file = os.path.splitext(audio_file)[0]+".txt"
with open(text_file, "a") as f:
f.write(text)
text_files.append(text_file)
prompt = text[-prompt_len:] if len(text) > prompt_len else text
return text_files
def merge_text_files(text_files, output_file):
with open(output_file, "a") as f:
for text_file in text_files:
with open(text_file, "r") as f_text:
f.write(f_text.read())
save_dir = "tmp"
shutil.rmtree(save_dir)
os.mkdir(save_dir)
filename = "data/audios/test.m4a"
audio_files = split_audio_file(filename, 20, save_dir)
model = whisper.load_model("large")
whisper_handlers = [(audio_transcribe_with_local, model),
(audio_transcribe_with_openai, openai.Audio)]
prompt = "大家好,欢迎收听 Mira Murati 的理念与影响的讲座。"
text_files = transcribe_audio_files(*whisper_handlers[0], audio_files, prompt)
text_file = os.path.join(save_dir, "test.txt")
merge_text_files(text_files, text_file)