はじめに
Whisper を使った文字起こしアプリを実装してみたのですが、導入や実装で時間がかかってしまったため、今回、備忘録として導入から実際に音声の文字起こしまでをまとめたいと思います。
Whisper とは
Whisperは汎用的な音声認識モデルです。多様な音声を収録した大規模なデータセットで学習されており、多言語音声認識、音声翻訳、言語識別を実行できるマルチタスクモデルでもあります。
引用:https://github.com/openai/whisper/blob/main/README.md#whisper
Whisper は MIT ライセンスになっており、無料で使用することができるようになっています。
今回、この Whisper を使って音声の文字起こしをやってみました。
実装
whiper.cpp の導入から実際に文字起こしするところまで実装します。
導入
whisper.xcframework と whisper.cpp.swift と Whisper のモデル をプロジェクトに追加します。
whisper.cpp からコードを clone またはダウンロードしてきます。
ダウンロードできたら、whisper.cpp のルートディレクトリで以下のコマンドを実行し、whisper.xcframework を作成します。
/build-xcframework.sh実行が終わると whisper.cpp/build-apple/フォルダに whisper.xcframework が作成されるので、whisper.xcframework のフォルダごと自分のプロジェクトのフォルダに移動させて、Xcode > TARGETS > General > Frameworks,Libraries, and Embedded Content で whisper.xcframework を 追加して Embed & Sign に変更すると完了です。
whisper.cpp.swift は whisper.cpp/examples/whisper.swiftui/ フォルダにあるので、whisper.cpp.swift のフォルダごと自分のプロジェクトのフォルダに移動させて、Xcode にドラッグ&ドロップで追加します。
Whisper のモデルは whisper.cpp の models ディレクトリで以下のコマンドを実行します。
今回は small-q8_0 モデルを作成しました。
./download-ggml-model.sh small-q8_0モデルの作成ができたら、自分のプロジェクトに Resources/models/ フォルダを作成し、その中に作成したモデルファイルを入れます。
参考:https://github.com/ggml-org/whisper.cpp/blob/master/examples/whisper.swiftui/README.md
画面の実装とレコーディング処理の実装
録音したデータから文字起こしを行うため、録音の処理と文字起こししたテキストを表示する画面を実装します。
録音処理は RPScreenRecorder を使用して実装しました。
録音開始のメソッドと録音停止のメソッドを準備して、録音中のフラグと文字起こししたテキストを状態として持つようにしています。
// TranscriptionRecorder.swift
import AVFoundation
import ReplayKit
@MainActor
final class TranscriptionRecorder: ObservableObject {
@Published var isRecording = false
@Published var transcriptText = "文字起こしを開始するには「Start」ボタンを押してください。"
func start() {
guard !isRecording else { return }
isRecording = true
transcriptText = ""
RPScreenRecorder.shared().isMicrophoneEnabled = true
RPScreenRecorder.shared().startCapture(handler: { [weak self] sampleBuffer, sampleBufferType, error in
guard let self = self else { return }
if let error {
print("Capture handler error:", error)
return
}
// マイク音声のみ処理
if sampleBufferType == .audioMic {
// TODO: 音声データの文字起こしをする
}
}, completionHandler: { [weak self] error in
guard let self = self else { return }
if let error {
print("completionHandler error:", error)
Task { @MainActor in
self.isRecording = false // エラー終了時もフラグをリセット
}
return
}
})
}
func stop() {
guard isRecording else { return }
RPScreenRecorder.shared().stopCapture { [weak self] error in
if let error { print("stop error:", error) }
Task { @MainActor in
guard let self = self else { return }
self.isRecording = false
}
}
}
} 画面は開始と停止ボタン、文字起こしした文字を表示するスクロールビューというシンプルな画面にしました。
開始ボタンで録音の開始メソッドを呼び出し、停止ボタンで録音の停止メソッドを呼び出します。
また、録音中のフラグでボタンの活性・非活性を切り替えるようにし、文字起こしした文字をスクロールビューに表示します。
…
記事の続きは下のURLをクリック!
https://rightcode.co.jp/blogs/54110
エンジニア積極採用中です!
現在、WEBエンジニア、モバイルエンジニア、デザイナー、営業などを積極採用中です!
採用ページはこちら:https://rightcode.co.jp/recruit
社員の声や社風などを知りたい方はこちら:https://rightcode.co.jp/blogs?category=life
フリーランスエンジニア大募集中!
現在、「WEBエンジニア」「フロントエンジニア」「データサイエンティスト」など、様々な職種のフリーランスエンジニア様を募集中です。まずは以下よりお気軽にご応募ください!
採用ページはこちら:https://itanken.com/register
社長と一杯飲みながらお話しませんか?(転職者向け)
特設ページはこちら: https://rightcode.co.jp/gohan-sake-president-talk
もっとワクワクしたいあなたへ
現在、ライトコードでは「WEBエンジニア」「モバイルエンジニア」「ゲームエンジニア」、「デザイナー」「WEBディレクター」「営業」などを積極採用中です!
ライトコードは技術力に定評のある受託開発をメインにしているIT企業です。
有名WEBサービスやアプリの受託開発などの企画、開発案件が目白押しの状況です。
- もっと大きなことに挑戦したい!
- エンジニアとしてもっと成長したい!
- モダンな技術に触れたい!
現状に満足していない方は、まずは、エンジニアとしても第一線を走り続ける弊社代表と気軽にお話してみませんか?
ネット上では、ちょっとユルそうな会社に感じると思いますが(笑)、
実は技術力に定評があり、沢山の実績を残している会社ということをお伝えしたいと思っております。
- ライトコードの魅力を知っていただきたい!
- 社風や文化なども知っていただきたい!
- 技術に対して熱意のある方に入社していただきたい!
一度、【Wantedly内の弊社ページ】や【コーポレートサイト】をのぞいてみてください。
Wantedly:https://www.wantedly.com/companies/rightcode
コーポレート:https://rightcode.co.jp/