使用 OpenAI 的 Whisper 转录实时音频

先进技术和工具的可用性,特别是人工智能正在以前所未有的速度增长,我将看到创建人工智能驱动的实时语音到文本程序是多么容易。

一名男子在麦克风前处理音频文件的图片

随着 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 秒。

给TA打赏
共{{data.count}}人
人已打赏
AI新闻AI科普

2024 年最值得关注的 AI 工具和平台

2024-5-21 18:34:59

AI新闻AI科普

一种新的编程语言诞生了!

2024-5-21 18:43:27

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
今日签到
有新私信 私信列表
搜索