CoreML 을 이용하여 회의실 녹음기 기능을 구현해보려고 한다.
1. 목표
- 최대한 On-Device-AI 형태로 Speech To Text 작업을 수행한다.
- 모바일에서만 구현 가능한 기능을 만든다.
2. 이유
- 현재 Apple 에서 CoreML 을 통해 On-Device-AI 를 지원하려고 노력하고 있다.
- 이런 배경속에서 협업툴 서비스에 적용해볼만한 기능은 없을까? 실험해보고 싶었다.
3. 실행
- 매 포스트 마다 하나의 실험들을 수행해보자.
1. 실험 목표
- 회의실에서 회의록 녹음하고 텍스트로 전환한다.
2. 실험 내용
- 디바이스를 이용하여 회의 내용을 녹음하고 문서 파일로 전환한다.
실험 상세 조건
- iPhone 은 회의실 중앙에 위치시킨다.
- iPhone > 음성 메모를 이용하여 회의록을 녹음한다.
- 회의록 파일이 긴 경우 20초 내외로 잘라서 텍스트로 전환 시킨다.
- CoreML 가이드상 한 번 요청시에 10분 내외 오디오 파일을 사용하라고 한다.
- 현재 샘플앱에서는 오디오 클립 기능은 구현하지 않았으므로 임의로 20초를 자른다.
3. 코드 작성
1. 파일 접근하기
func handleFileImport(result: Result<[URL], Error>) {
do {
let selectedFileURL: URL = try result.get().first!
let fileName = selectedFileURL.lastPathComponent
print("[\(#function)] file path: \(selectedFileURL)")
let access = selectedFileURL.startAccessingSecurityScopedResource()
guard access else {
print("\(#function): 파일 접근이 불가능합니다.")
return
}
guard let copyFileURL = copyFileToDocumentsDirectory(from: selectedFileURL) else {
print("[\(#function)] 파일 복사를 실패했습니다.")
return
}
print("[\(#function)] file path: \(copyFileURL)")
let file = File(fileName: fileName, url: copyFileURL)
self.file = file
selectedFileURL.stopAccessingSecurityScopedResource()
} catch {
print("파일을 가져오는 중 오류 발생: \(error.localizedDescription)")
}
}
2. 음성 파일 텍스트 전환하기
func transcribeAudioToText() {
guard let fileURL = file?.url else {
print("\(#function): 선택된 파일이 없습니다.")
return
}
guard let recognizer = SFSpeechRecognizer(locale: Locale(identifier: "ko-KR")),
recognizer.isAvailable else {
print("\(#function): 음성 인식기 사용 불가")
return
}
let request = SFSpeechURLRecognitionRequest(url: fileURL)
recognizer.recognitionTask(with: request) { result, error in
if let error {
print("\(#function): \(error.localizedDescription)")
return
}
guard let result else {
print("\(#function): 음성 인식 결과가 없습니다.")
return
}
self.transcribe(result.bestTranscription.formattedString)
}
}
private func getAppDirectoryURL() -> URL {
return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
}
nonisolated private func transcribe(_ message: String) {
Task { @MainActor in
transcriptionText = message
}
}
- 음성파일을 가져와서 Text 로 전환시킨다.
- 영어 뿐만 아니라 한글도 지원한다. (한글이외에도 여러 언어들을 지원한다.)
4. 실험결과
- 녹음파일: 첨부파일(녹음 축소1.m4a)
- 단순 텍스트 결과
네 네 그래서 이거 내용은 일정 사실 보시면 되는데 일정이 약간 좀 크기 보기가 좀 힘들어서 그냥 회의로에다가 그냥 오늘 회의 주제는 이거 신규 에디터를 저희가 열심히 만들고 있는 있는데 그냥 모르시는 분들을 위해서 짧게만 그냥 설명을 드리면 입니다 (중략...)
- 교정된 텍스트 결과
네, 네. 그래서 이번 회의 내용은 일정에서 확인하실 수 있는데, 일정이 약간 크기 때문에 보기 불편할 수도 있어요. 그래서 회의록에다가 오늘의 회의 주제를 정리해 두었는데요. 오늘 논의할 주제는 신규 에디터 개발입니다. 저희가 현재 열심히 개발 중인데, 혹시 모르시는 분들을 위해 간략하게 설명을 드리겠습니다.
5. 결과 분석
의의
- 1차로 텍스트 전환된 내용을 llm 에 적절히 요청하게 되면, 실제로 사용할만한 회의록을 작성할 수 있었다.
한계
- iPhone 을 중앙에 놓음으로써 디바이스 마이크와 멀어지는 경우, 인식률이 떨어지는 것 같다. ( 당연한 결과 )
- 단순 텍스트 결과 에서는 이해하기 힘든 내용들이 다소 존재하였다.
- 마침표, 쉼표, 엔터와 같은 구두점이 불규칙적으로 사용되어 문맥을 이해하기 어렵다.
- 교정된 텍스트 결과 교정은 ChatGPT 를 사용하였다. ( 원래는 Apple Intelligence Text 교정을 사용하려고 했으나 한글이기 때문에 한계가 있었다. )
도전사항
- CoreML > Speech 도메인에서 화자 인식 과 관련된 기능을 제공해주고 있다. 해당 기능을 이용하여 화자를 분리하면 조금 더 깔끔한 결과를 얻을 수 있을 것으로 예상된다.
- CoreML > Speech 도메인에서 오디오 튜닝 기능을 이용하여 녹음 파일의 음질을 향상시키는 경우, 조금 더 정확한 결과를 얻을 수 있을 것으로 예상된다.
- CoreML > Speech 도메인에서 음성 번역 기능을 이용하여 다양한 언어의 결과물을 얻을 수 있을 것으로 예상된다.
4. 결과
- 실험을 해보면서 생각보다 On-Device-AI 로 유의미한 결과를 낼 수 있겠다는 확신이 들었다.
- 음성 교정, 문자 교정, 화자 교정 등의 추가 절차를 수행한다면 더욱 의미있는 결과를 얻을 수 있을 것으로 예상된다.
- 다음에는 도전사항에 작성한 내용들을 하나하나씩 적용해볼 예정이다.
PREVIOUS[AI 실험실] CoreML 도메인 기능 리스트