Whisper.php - -自动语音识别和转录
语音识别可能很复杂,但并不必然如此,因为 Whisper.php 可以帮助你简化过程。Whisper.php 是 Whisper.cpp 的 PHP 包装器,Whisper.cpp 是 OpenAI Whisper 模型的 C/C++ 端口。该包由 Kyrian Obikwelu 创建,最近发布了 v1.0.0,你可以直接在你的项目中实现完全本地和无 API 的转录。它提供:
- 高级和低级 API
- 模型自动下载
- 支持多种语音格式(e.g. MP3, WAV, OGG, M4A)
- 多种输出格式导出 (e.g. TXT, SRT, VTT, or CSV)
- 流媒体和进度跟踪的回调支持
Whisper.php 要求在 PHP 中安装并启用 FFI(外部函数接口)扩展。该扩展允许你在 PHP 中你直接与 C 库交互。
假设你已启用了 FFI,要安装 Whisper.php,请运行:
composer require codewithkyrian/whisper.php
Whisper.php 提供低级和高级 API。低层的 API 提供了对转录过程的细粒度控制,与原始的 C 实现密切镜像。高级 API 为简化的工作流程提供了一个更简单、更抽象的接口。
为了本文的目的,我们将使用高级 API。
use Codewithkyrian\Whisper\Whisper;
use function Codewithkyrian\Whisper\readAudio;
use function Codewithkyrian\Whisper\toTimestamp;
// Transcribe Audio
$whisper = Whisper::fromPretrained('tiny.en', baseDir: __DIR__.'/models');
$audio = readAudio(__DIR__.'/audio/laravel-news-227-sample.mp3');
$segments = $whisper->transcribe($audio, 4);
// Output transcribed segment data
foreach ($segments as $segment) {
echo toTimestamp($segment->startTimestamp) . ': ' . $segment->text . "\n";
}
Whisper.php 依赖于一些平台特定的共享库。因此,第一次使用 Whisper::fromPretrained()
初始化模型时,它们将自动下载并存储在我们的模型(models
)目录中。首次下载会导致第一次运行略有延迟,但幸运的是,一旦库被缓存,后续运行的速度会快得多。支持的 Whisper 基本模型包括:tiny.en
、base
、base.en
等。
接下来,readAudio()
函数通过将音频重新采样到 16kHz 来简化音频处理,这是音频质量和效率之间的平衡。这捕获了人类语音的核心频率,同时减少了要处理的数据量。
之后,transcribe()
方法获取重新采样的音频,并将其分解为具有开始和结束时间戳以及文本的片段,我们可以以所需的格式输出。
作为测试,我们使用了 Laravel News Podcast 的最新一集。如你所见,它并不完美,但做得很好。输出如下:
00:00:00,000: Hey everybody how's it going welcome to the level this podcast episode 227 today is November
00:00:05,040: 26th
00:00:06,400: 2024
00:00:07,680: Glad to have you hanging out with us and glad that Michael finally figured out his microphone...
注:在撰写本文时,仅支持 Linux 和 macOS,而 Windows 版本仍在开发中。
你可以在 GitHub 上了解有关此包的更多信息并查看源代码。