Самый простой способ использовать шепот в Swift
Легко добавить транскрипцию в ваше приложение или пакет. Приводятся в действие Whisper.cpp.
Добавьте SwiftWhisper в качестве зависимости в вашем 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 " ) ] )
]
...
) Добавьте 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 Model, вам также нужно будет использовать Whisper(fromFileURL:) инициализатор. Вы можете проверить, что Coreml активен, проверяя выход консоли во время транскрипции.
Самый простой способ получить аудиокадры в SwiftWhisper - это использовать Audiokit. В следующем примере принимается аудиофайл ввода, преобразует и переосмысливает его и возвращает массив поплавков PCM 16 кГц.
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 Branch. В качестве альтернативы, вы можете настроить свою схему для создания конфигурации Release .
...
dependencies: [
// Using latest commit hash for `fast` branch:
. package ( url : " https://github.com/exPHAT/SwiftWhisper.git " , revision : " deb1cb6a27256c7b01f5d3d2e7dc1dcc330b5d01 " ) ,
] ,
...