iOS 集成文档

最近更新时间:2023-06-28 09:23:05 前往 Coding 编辑

导出文档

语音转译(translation)

要开始在iOS上使用语音转译,我们建议您下载SpeechRecognition

功能介绍

SpeechRecognition 是一个语音转译应用程序,演示了如何在iOS上使用Whisper。该代码是用Swift编写。

要求

  • Xcode 12.4 or later
  • iOS 13.0或更高版本

集成步骤

1.准备模型

.bin格式模型文件保存到model文件夹。

2.导入语音转译C++文件库

将C++文件复制到项目文件夹下,


whisper.h 
whisper.cpp
ggml.h 
ggml.c

3.添加录音权限

如果开启录音时项目crash,请检查plist文件中,是否添加 Privacy - Microphone Usage Description录音权限

代码简介

在这一部分中,我们将逐步完成代码。

开启录音

通过FileManager在Documents/目录下创建并获取录音文件地址,开启录音


do {
    
    let file = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("output.wav")

    try await self.recorder.startRecording(toOutputFile: file, delegate: self)
    
    self.messageLog += "录音中...\n"
    self.isRecording = true
    self.recordedFile = file

}

获取语音流

通过 RiffWaveUtils 中的decodeWaveFile()方法 获取到文件的流信息


func decodeWaveFile(_ url: URL) throws -> [Float] {

    let data = try Data(contentsOf: url)
    let floats = data.withUnsafeBytes { (ptr: UnsafeRawBufferPointer) -> [Float] in
        let count = (data.count - 44) / 2 // 计算采样点的个数
        let buffer = UnsafeRawBufferPointer(start: ptr.baseAddress!.advanced(by: 44), count: count*2)  // 跳过 WAV 文件头
        return buffer.bindMemory(to: Int16.self).map { max(-1.0, min(Float($0) / 32767.0, 1.0)) }
    }
    return floats
}

开始转译

获取语音流之后,调用whisperContextgetTranscription()方法,返回值即为转译结果

do {

let data = try readAudioSamples(url)

await whisperContext.fullTranscribe(samples: data)

let text = await whisperContext.getTranscription()

messageLog += "识别完成: \(text)\n"

}