วิธีที่ง่ายที่สุดในการใช้ Whisper ใน Swift
เพิ่มการถอดรหัสลงในแอพหรือแพ็คเกจของคุณได้อย่างง่ายดาย ขับเคลื่อนโดย Whisper.cpp
เพิ่ม SwiftWhisper เป็นการพึ่งพาใน Package.swift file:
let package = Package (
...
dependencies : [
// Add the package to your dependencies
. package ( url : " https://github.com/exPHAT/SwiftWhisper.git " , branch : " master " ) ,
] ,
...
targets : [
// Add SwiftWhisper as a dependency on any target you want to use it in
. target ( name : " MyTarget " ,
dependencies : [ . byName ( name : " SwiftWhisper " ) ] )
]
...
) เพิ่ม https://github.com/exPHAT/SwiftWhisper.git ในแท็บ "Swift Package Manager"
เอกสาร API
import SwiftWhisper
let whisper = Whisper ( fromFileURL : /* Model file URL */ )
let segments = try await whisper . transcribe ( audioFrames : /* 16kHz PCM audio frames */ )
print ( " Transcribed audio: " , segments . map ( . text ) . joined ( ) ) คุณสามารถสมัครสมาชิกกลุ่มความคืบหน้าการถอดความและข้อผิดพลาดโดยการใช้งาน WhisperDelegate และการตั้งค่า whisper.delegate = ...
protocol WhisperDelegate {
// Progress updates as a percentage from 0-1
func whisper ( _ aWhisper : Whisper , didUpdateProgress progress : Double )
// Any time a new segments of text have been transcribed
func whisper ( _ aWhisper : Whisper , didProcessNewSegments segments : [ Segment ] , atIndex index : Int )
// Finished transcribing, includes all transcribed segments of text
func whisper ( _ aWhisper : Whisper , didCompleteWithSegments segments : [ Segment ] )
// Error with transcription
func whisper ( _ aWhisper : Whisper , didErrorWith error : Error )
} คุณสามารถค้นหารุ่นที่ผ่านการฝึกอบรมมาก่อนเพื่อดาวน์โหลดได้ที่นี่
ในการใช้ coreml คุณจะต้องรวมไฟล์โมเดล coreml ด้วยคำต่อท้าย -encoder.mlmodelc ภายใต้ชื่อเดียวกับรุ่น Whisper (ตัวอย่าง: tiny.bin จะนั่งข้างไฟล์ tiny-encoder.mlmodelc ) นอกเหนือจากไฟล์โมเดล additonal แล้วคุณจะต้องใช้ Whisper(fromFileURL:) Initializer คุณสามารถตรวจสอบ Coreml ได้โดยการตรวจสอบเอาต์พุตคอนโซลในระหว่างการถอดความ
วิธีที่ง่ายที่สุดในการรับเฟรมเสียงเข้าสู่ SwiftWhisper คือการใช้ Audiokit ตัวอย่างต่อไปนี้ใช้ไฟล์เสียงอินพุตแปลงและกลับมาใช้ใหม่และส่งคืนอาร์เรย์ของ 16kHz PCM ลอย
import AudioKit
func convertAudioFileToPCMArray ( fileURL : URL , completionHandler : @escaping ( Result < [ Float ] , Error > ) -> Void ) {
var options = FormatConverter . Options ( )
options . format = . wav
options . sampleRate = 16000
options . bitDepth = 16
options . channels = 1
options . isInterleaved = false
let tempURL = URL ( fileURLWithPath : NSTemporaryDirectory ( ) ) . appendingPathComponent ( UUID ( ) . uuidString )
let converter = FormatConverter ( inputURL : fileURL , outputURL : tempURL , options : options )
converter . start { error in
if let error {
completionHandler ( . failure ( error ) )
return
}
let data = try ! Data ( contentsOf : tempURL ) // Handle error here
let floats = stride ( from : 44 , to : data . count , by : 2 ) . map {
return data [ $0 ..< $0 + 2 ] . withUnsafeBytes {
let short = Int16 ( littleEndian : $0 . load ( as : Int16 . self ) )
return max ( - 1.0 , min ( Float ( short ) / 32767.0 , 1.0 ) )
}
}
try ? FileManager . default . removeItem ( at : tempURL )
completionHandler ( . success ( floats ) )
}
} คุณอาจพบว่าประสิทธิภาพของการถอดความช้าเมื่อรวบรวมแอปของคุณสำหรับการกำหนดค่าการสร้าง Debug นี่เป็นเพราะคอมไพเลอร์ไม่ได้ปรับ SwiftWhisper ให้เหมาะสมเว้นแต่ว่าการกำหนดค่าการสร้างจะถูกตั้งค่าให้ Release
คุณสามารถรับสิ่งนี้ได้โดยการติดตั้ง SwiftWhisper เวอร์ชันที่ใช้ .unsafeFlags(["-O3"]) เพื่อบังคับให้มีการเพิ่มประสิทธิภาพสูงสุด วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการใช้การกระทำล่าสุดในสาขา fast หรือคุณสามารถกำหนดค่าโครงการของคุณเพื่อสร้างในการกำหนดค่า Release
...
dependencies: [
// Using latest commit hash for `fast` branch:
. package ( url : " https://github.com/exPHAT/SwiftWhisper.git " , revision : " deb1cb6a27256c7b01f5d3d2e7dc1dcc330b5d01 " ) ,
] ,
...