如何使用 Whisper 和 AutoHotkey 制作您自己的 Windows 转录应用程序

利用 AutoHotkey 构建个人 Whisper 转录应用程序

OpenAI 的 Whisper 是一款强大的语音转文本转换工具。然而,直接使用 Whisper 命令行界面较为繁琐,需要用户手动输入命令才能实现音频转录。借助 AutoHotkey,我们可以简化这一过程,为 Whisper 创建一个友好的图形用户界面(GUI)。

本文将介绍如何利用 AutoHotkey 的 GUI 功能,结合 OpenAI Whisper 的强大转录能力,打造个性化的转录应用。这将使用户无需输入复杂的命令,只需点击按钮即可完成音频转录任务。

为 Whisper 和 AutoHotkey 奠定基础

AutoHotkey 不仅仅是一个脚本工具,它还可以用来为各种命令行应用程序创建图形界面。我们的目标是使用 AutoHotkey 为 Whisper 构建 GUI,从而可以通过点击按钮和使用菜单自定义功能,而无需记住和输入复杂的命令行指令。

要开始这个项目,你需要先安装 AutoHotkey 和 Whisper。

AutoHotkey 可以从官方网站下载。下载后,运行安装程序并按照提示操作即可完成安装。

请注意,为了兼容本文的示例,我们将使用 AutoHotkey 的旧版本 “v1”,而非新版 v2。因为这两个版本在语法上存在差异,使用 v2 版本可能导致代码无法正常运行。

Whisper 的安装步骤相对复杂,可以参考网上关于如何在 Windows 上使用 OpenAI Whisper 将语音转换为文本的相关教程。

在安装完 AutoHotkey 和 Whisper 后,我们计划执行以下步骤:

  • 创建一个包含 Whisper 变量和参数的 GUI。
  • 创建函数,从界面获取用户输入,选择文件和文件夹,并将所有信息组合成 Whisper 可执行的命令。
  • 运行 Whisper 命令,生成转录结果。

当然,你也可以使用 Windows 内置的语音输入功能,但正如使用体验所表明的,Whisper 在准确性方面更胜一筹,尽管速度稍慢。

作为非程序员,我想说明的是,本项目是我个人使用需求的一个“混搭”解决方案。

如何创建新的 AutoHotkey 脚本

第一步是创建一个新的空白脚本文件,并将其保存在一个单独的文件夹中,以便日后进行修改或扩展。步骤如下:

  1. 启动你常用的文件管理器,或者按下 Windows 键 + E 打开资源管理器,在你喜欢的位置创建一个文件夹,用于存放你的转录应用程序文件。
  2. 在文件夹空白处点击鼠标右键,选择“新建” > “AutoHotkey 脚本”创建一个空的脚本文件。
  3. 按住 Shift 键并点击鼠标右键打开完整的上下文菜单,然后选择使用你喜欢的代码或文本编辑器打开它。Windows 自带的记事本即可满足要求。
  4. 尽管是一个“空脚本”,AHK 文件已经预先填充了一些代码。 这些是一些有用的 AutoHotkey 变量和标志,定义了它在桌面上的运行方式。请忽略这些内容,让它们保持原样,在你预先填充的代码下面开始编写自己的脚本。

了解 Whisper 的参数

由于我们正在为命令行应用程序构建 GUI,因此有必要了解我们将在项目中使用的主要变量和参数。你可以通过阅读 Whisper 的文档,访问官方 Github 页面,或在终端中运行 Whisper 来获取这些信息。

为方便起见,我们将列出本项目中使用的参数。建议你将它们作为注释添加到脚本中 (每行以“;”字符开头,后跟一个空格)。

 ; Whisper 参数:;  

使用 AutoHotkey 创建 GUI

我们建议像我们一样使用注释将脚本分成几个部分,以保持脚本的整洁。我们将首先定义一些变量,然后是 GUI 界面,最后是 GUI 的功能。

定义隐藏变量

首先,我们定义一些变量,这些变量可能会在将来需要修改,但又不希望过于频繁地在 GUI 中暴露出来。你可以通过 “Variable_Name = 变量的值” 的形式来定义变量,每行定义一个变量及其值。

在这个项目中,我们定义了一个 OutputFormat 变量,并将其设置为“txt”值,以及一个声明 Whisper 可执行文件名 WhisperExecutable 变量。这样,如果未来我们想使用相同的解决方案创建 SRT 字幕文件,而不是 TXT 文档,或者将 Whisper 升级到替代应用程序,我们可以在这一个地方调整这些变量的值,而不是在整个脚本中查找和修改。

 OutputFormat = txtWhisperExecutable = whisper 

设置用户选项

当在命令行中使用 Whisper 时,有三个参数允许你定义:

  • 任务类型 (转录或翻译)。
  • 音频文件的语言。
  • 使用的语言模型 (模型大小会影响性能和转录质量)。

通过 GUI 提供相同功能的最简单方法是使用下拉列表。将下拉列表添加到 AutoHotkey GUI 的语法如下:

 Gui, Add, DropDownList, xPosition yPosition wWidth hHeight vVariable_that_will_hold_selected_value, optionA|optionB|default_optionC||optionD| 

根据上述语法,我们在脚本中添加了三个下拉列表,分别用于选择 Whisper 的语言(英语 / en 和希腊语 / el), 模型大小 (tiny、base、small、medium、large) 和任务类型 (转录或翻译)。

 Gui, Add, DropDownList, x5 y5 w165 h50 vSelectedLanguage, en||el
Gui, Add, DropDownList, x175 y5 w165 h100 vSelectedModel, tiny|base|small||medium|large|
Gui, Add, DropDownList, x345 y5 w165 h100 vTaskType, transcribe||translate|

要设置默认选项,请在其后使用双竖线 (“||”)。在我们的示例中,我们将语言设置为 en,将 SelectedModel 设置为 small,并将 TaskType 设置为 transcribe。

如何引导 Whisper

由于 Whisper 基于人工智能,因此无法完全控制其转录方式。然而,和其他人工智能解决方案一样,Whisper 可以接受用户提示。通过提供提示,你可以“指导”它如何转录音频。

如果你发现 Whisper 转录的内容不准确,可以尝试“解释”语音文件的内容,包括提示中的单词、首字母缩略词和短语,以及你希望它们在转录中出现的方式。为此,我们将添加一个 AutoHotkey 文本编辑字段。

语法与添加下拉列表的语法类似:

 Gui, Add, Edit, x5 w505 h400 vPromptText, %PromptText% 

末尾的 “%PromptText%” 表示,AHK 将在文本字段中显示 PromptText 变量的内容(如果已赋值)。这在我们当前脚本中不会显示任何内容,但如果你将来需要保存和加载提示时,它将作为一个占位符。

如果要为 PromptText 变量分配预定义的值,请将以下内容添加到脚本的变量部分,并记得将“你的名字”替换为你的真实姓名:

 PromptText = 你名字的笔记的转录 

设置操作按钮

当所有设置完成后,我们可以添加一些按钮,用于选择文件、文件夹和运行 Whisper。 可以使用以下命令将按钮添加到 AHK 创建的界面:

 Gui, Add, Button, xPosition yPosition wWidth hHeight gFunction_To_Perform, Button Text 

请注意,和 GUI 元素中以字母“v”开头的变量不同,函数名以“g”开头,表示“Go(到脚本的此位置)”。

AHK 界面的单个按钮也可以被视为“默认按钮”。 如果你不点击 GUI 上的任何位置并按 Enter 键,则会激活该按钮。 这是通过在坐标和功能部分添加“默认”来实现的,就像你在“确定”按钮中看到的那样:

 Gui, Add, Button, x5 w505 h50 gSelectFile, 加载文件Gui, Add, Button, x5 w505 h50 gSelectFolder, 选择输出文件夹
​​​​​​​Gui, Add, Button, Default x5 w505 h50 gButtonSubmit, 确定

通过上面的代码,我们定义了三个按钮:

  • 一个标记为“加载文件”的按钮,点击后会运行 SelectFile 函数。
  • 一个标记为 “选择输出文件夹” 的按钮, 点击后会运行 SelectFolder 函数。
  • 一个标记为 “确定” 的按钮,默认被选中,点击后会 “调用” ButtonSubmit 函数。

如何显示你的 GUI

我们的 GUI 已经准备好,但它不会出现在屏幕上,因为我们还没有“告诉” AutoHotkey 显示它,或者每个按钮应该做什么。

为此,在定义 GUI 的代码下方添加以下两行:

 Gui, ShowReturn 

第一行 “告诉” AHK 显示 GUI 窗口,而第二行表示该部分的结束。

应用程序的功能和行为

虽然我们已经完成了 GUI 的部分,但如果你现在尝试运行脚本,它会崩溃,因为我们引用了尚不存在的函数。因此,我们的下一步就是创建这些函数。

我们需要创建三个函数:

  • 选择输入文件。
  • 选择转录文件的输出文件夹。
  • 创建一个命令,将所有变量 “组装” 成一个可用的 Whisper 命令,类似于我们在终端中输入的内容,然后执行它。

选择输入文件

当我们将按钮添加到 GUI 时,我们已经将第一个函数命名为 “SelectFile”,它的代码如下:

 SelectFile:FileSelectFile, SelectedFileReturn 

FileSelectFile 是一个 AutoHotkey 函数,它会显示一个标准的文件选择对话框,允许用户选择文件。SelectedFile 是脚本中的一个变量,它将“存储”用户选择的文件的路径。

正如你在我们的截图中看到的,我们在函数末尾的 “return” 之前添加了以下代码:

 MsgBox, %SelectedFile% 

在我们选择文件后,AHK 会显示一个包含所选文件的消息框,这在调试脚本时非常有用。 如果此消息框显示了您所选文件的路径和名称,那么你无需修改文件选择按钮或功能。

选择输出文件夹

选择文件夹的函数与选择文件类似,只是命令名称和变量有所不同,以表示我们正在处理文件夹而不是文件:

 SelectFolder:FileSelectFolder, SelectedFolderMsgBox, %SelectedFolder%Return 

最终函数

最终的函数将是最复杂的。它被映射到“确定”按钮,用于从 GUI 中“收集”所有的变量值,将它们转换为可用的命令,然后执行它。

我们首先声明函数的开始和结束:

 ButtonSubmit:Return 

要“获取”所有 GUI 的值,请在 ButtonSubmit 行下添加以下内容:

 Gui Submit, nohide 

下面的代码创建了一个名为 “WhisperFlags” 的新变量,然后将所有 GUI 变量作为 Whisper 命令的参数添加到其中。

 WhisperFlags = --initial_prompt "%PromptText%" --task %TaskType% --model %SelectedModel% --language %SelectedLanguage% --output_format %OutputFormat% -o "%SelectedFolder%" "%SelectedFile%" 

接下来,我们 “告诉” AHK 使用默认终端 (CMD.exe) 和 GUI 变量 (现在 “组装” 在一个名为 WhisperFlags 的变量中) 运行 Whisper 的可执行文件 (我们使用 WhisperExecutable 变量定义)。

 RunWait, cmd.exe /c %WhisperExecutable% %WhisperFlags% 

为了更轻松地进行调试,我们像之前一样添加了一个消息框,并且还添加了以下代码:

 Clipboard = %WhisperExecutable% %WhisperFlags% 

这段代码会将发送给 CMD 的完整命令复制到剪贴板。 这样,如果出现问题,你不仅可以在 AHK 的消息框中看到该命令,还可以在剪贴板中查看。

打开终端,粘贴剪贴板中的命令,然后检查可能出现的错误,以找出潜在的问题。

例如,在编写脚本时,我最初忘记将提示用引号括起来,这导致命令失败,因为 Whisper 尝试将提示解析为参数。

测试和最终调整

到此为止,我们已经成功地利用 AutoHotkey 的 GUI 功能和一个现成的 AI 转录解决方案创建了一个转录应用程序。

尝试运行你的脚本 (双击其文件),你应该在屏幕上看到 GUI。

  • 使用顶部的下拉列表更改 Whisper 的设置。
  • 在提示字段中输入转录内容的简短描述(以及一些术语)。
  • 点击“加载文件”按钮,选择要转录的音频文件。
  • 点击“选择输出文件夹”按钮,选择生成的文本文件的保存位置。
  • 点击 “确定”,根据 GUI 的设置,对选定的音频文件运行 Whisper,并将其转录结果作为文本文件保存在你选择的文件夹中。

如果一切正常,请返回脚本并删除或注释掉 (在行首添加 “;”) 所有用于调试功能的代码 (消息框和复制到剪贴板的代码)。

使用 AutoHotkey 进一步增强 Whisper

通过正确设置 GUI 的默认值,并可能添加一个通用提示,你可以将 Whisper 变成一个三键转录解决方案: 无需为商业解决方案或第三方服务付费,无需与复杂的界面搏斗,也无需在终端中输入命令。