La façon la plus simple d'utiliser Whisper dans Swift
Ajoutez facilement une transcription à votre application ou à votre package. Propulsé par Whisper.cpp.
Ajoutez Swiftwhisper comme dépendance dans votre fichier Package.swift :
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 " ) ] )
]
...
) Ajoutez https://github.com/exPHAT/SwiftWhisper.git dans l'onglet "Swift Package Manager".
Documentation de l'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 ( ) ) Vous pouvez vous abonner à des segments, des progrès de la transcription et des erreurs en implémentant WhisperDelegate et en définissant 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 )
} Vous pouvez trouver les modèles pré-formés ici pour le téléchargement.
Pour utiliser Coreml, vous devrez inclure un fichier de modèle CoreMl avec le suffixe -encoder.mlmodelc sous le même nom que le modèle Whisper (exemple: tiny.bin serait également assis à côté d'un fichier tiny-encoder.mlmodelc ). En plus du fichier de modèle additonal, vous devrez également utiliser le Whisper(fromFileURL:) initialiseur. Vous pouvez vérifier que CoreMl est actif en vérifiant la sortie de la console pendant la transcription.
Le moyen le plus simple d'obtenir des cadres audio dans Swiftwhisper est d'utiliser Audiokit. L'exemple suivant prend un fichier audio d'entrée, le convertit et le résume, et renvoie un tableau de flotteurs PCM 16KHz.
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 ) )
}
} Vous pouvez trouver les performances de la transcription lente lors de la compilation de votre application pour la configuration de build Debug . En Release
Vous pouvez contourner cela en installant une version de SwiftWhisper qui utilise .unsafeFlags(["-O3"]) pour forcer une optimisation maximale. La façon la plus simple de le faire est d'utiliser le dernier engagement sur la branche fast . Alternativement, vous pouvez configurer votre schéma pour construire dans la configuration Release .
...
dependencies: [
// Using latest commit hash for `fast` branch:
. package ( url : " https://github.com/exPHAT/SwiftWhisper.git " , revision : " deb1cb6a27256c7b01f5d3d2e7dc1dcc330b5d01 " ) ,
] ,
...