先进技术和工具的可用性,特别是人工智能正在以前所未有的速度增长,我将看到创建人工智能驱动的实时语音到文本程序是多么容易。
随着 Whisper 于 2022 年 9 月发布,现在可以在由 CPU 或 GPU 驱动的设备上本地运行音频到文本模型。
在本简短指南中,我将向您展示如何从麦克风获取音频并将其实时转换为文本。
我使用的是 M1 MacBook Pro,因此在使用标准 Python 库正确利用 GPU 时遇到了麻烦,因此我决定使用 C++ 工具,它是“Apple Silicon 一等公民”高性能推理 Whisper。感谢
以及所有其他 293 名贡献者,因为这是我能找到的在 M1 Mac 上的 GPU 上成功运行耳语模型的唯一方法。该工具还内置了许多其他很酷的功能,值得一试!首先,我按照此处的说明克隆了 git 存储库,并为该工具创建了一个简单的 Python 包装器,该工具主要存储存储库的主文件。
def transcribe_to_txt ( input_filename: str , output_filename: str ): print ( '正在运行耳语转录...' ) # 编写所有组件的命令 command = [ './main' , '-f' , input_filename, '-otxt' , '-of' , output_filename, '-np' ] # 执行命令 result = subprocess.run(command, capture_output= True , text= True )
然后我会将音频分成 5 秒的块,我可以用sounddevice.InputStream
它来做到这一点。我给它一个回调,让它每 5 秒运行一次,这样我们就可以通过耳语处理 5 秒的音频块。
与sd.InputStream(callback=callback, dtype= 'int16' , 通道= 1 , 采样率= 16000 , 块大小= 16000 * 5 ):
然后,我们定义回调,将 5 秒音频块放入一个临时文件中,我们将使用 Whisper.cpp 处理该文件,从音频中提取文本,然后将其打印到控制台。
def 回调(indata,frames,time,status): #如果需要,则提高状态 if status: print(status) #创建一个临时文件来保存音频,并自动删除 with tempfile.NamedTemporaryFile(delete = True,suffix = '. wav' , prefix= 'audio_' , dir = '.' ) as tmpfile: # 将 5 秒音频保存到 .wav 文件 中。open (tmpfile.name, 'wb' ) as wav_file: wav_file.setnchannels( 1 ) # 单声道音频 wav_file.setsampwidth( 2 ) # 16 位音频 wav_file.setframerate( 16000 ) # 采样率 wav_file.writeframes(indata) # 准备输出文件名 output_filename = tmpfile.name.replace( '.wav' , '' ) # 使用我们的 tweet.cpp 包装器将音频转录为文本 transcribe_to_txt(tmpfile.name, output_filename) #使用open 打印转录文本(output_filename + ' .txt' , 'r' ) as file: print (file.read()) # 清理临时文件 os.remove(output_filename + '.txt' )
我们故意保存文件,因为我们可能希望进一步处理这些数据,但现在,我们只是.txt
使用os
模块清理文件。
现在我们有足够的代码可以运行:
try : # 使用sd.InputStream(callback=callback, dtype= 'int16' , Channels= 1 , Samplerate= 16000 , blocksize= 16000 * 5 ): print ( "Recording...Press Ctrl+C 停止。" ) while True : 通过 except KeyboardInterrupt: print ( '录音停止。' )
运行时我们得到:
正在录制...按 Ctrl+C 停止。 正在运行耳语转录... 成功运行。 (键盘点击) [BLANK_AUDIO] 正在运行耳语转录... 成功运行。 好的,这只是一些正在 运行耳语转录的音频... 成功运行。 我只是要展示它是实时发生的,我只是要记录其中的一些事情。 正在运行耳语转录... 成功运行。 所以只有五秒钟的卡盘。
转录发生得很快,但不要只相信我的话,我运行了该timeit
模块来看看转录发生的速度有多快,如下所示:
def test_function (): transcribe_to_txt( 'audio_xkf1lhwh.wav' , 'output.txt' ) execution_time = timeit.timeit( 'test_function()' , globals = globals (), number= 100 ) print ( f"平均执行时间: { execution_time / 100 : .5 f}秒" )
输出:
成功运行。 正在运行耳语转录... 因此运行成功。我在这里想做什么?我正在尝试... 成功运行。 正在运行耳语转录... 因此运行成功。我在这里想做什么?我正在尝试... 成功运行。 平均执行时间:0.48541秒
如您所见,转录过程非常快,处理包含语音的 5 秒音频只需不到 0.5 秒。