본문 바로가기

앱개발

앱 개발 - flet (창의플랫폼) (2)

저번 글에서 flet의 기초 사용법을 알아봤으니 이제 창플에서 필요한 앱을 만들기 위한 기능들을 알아보고 합쳐서 간단하게 완성을 해 볼 생각이다.

기능은 크게 4개가 필요한데, 우선 버스 번호판을 찍어서 인식하고 몇번인지를 출력해야 한다. 

그리고 버스가 왼쪽에 있는지 오른쪽에 있는지도 출력해야 한다.

2번째로 음성 녹음을 하면 그 음성의 텍스트를 추출해서 출력한다.

3번째로 2번에서 추출된 텍스트를 이용해 특정 번호의 기사의 폰으로 카톡을 전송하면 된다.

그리고 마지막으로 사진을 찍었을 때 빈자리가 어디 있는지 찾아주는 기능도 있다. (이 부분은 나중에 추가되었다.)

 

당장 만들 것은 프로토타입이기 때문에 실제 카메라와 녹음 연동은 안하고 파일을 업로드하면 기능이 작동하게 만들거다.

기능적인 부분의 코드는 이미 다 짜놨기 때문에 그냥 파일 업로드, 저장만 찾아보면 된다.

 

이미지부터 보면

image_file_picker = ft.FilePicker(on_result=on_image_result)
page.overlay.append(image_file_picker)
page.add(ft.ElevatedButton("Choose image",
on_click=lambda _: image_file_picker.pick_files()))

이렇게 file picker를 이용해 구현할 수 있다.

file picker변수를 정의할 때 on_result로 사용한 on_image_result 함수는 다음과 같다.

def on_image_result(e: ft.FilePickerResultEvent):
    file = e.files[0]
    save_path = os.path.join(os.getcwd(), file.name)

    # 파일 저장
    with open(file.path, "rb") as f:
        content = f.read()
    with open(save_path, "wb") as f:
        f.write(content)

    # 저장된 이미지로 인식
    image_control.src = save_path

    image_output.value = get_plate(file.name)

    page.update()

file picker의 이벤트를 입력으로 해서 e.files[0]로 파일을 가져온다.

그 파일을 로컬에 저장을 하고, file.name으로 파일 이름을 가져와서 get_plate 함수를 이용해 번호판 인식을 한다.

get_plate 함수가 이전에 만들어 놓은 번호판 인식 함수이다.

이렇게 올린 사진이 뜨고 번호판 인식 결과와 방향이 출력된다.

 

사진을 찍었을 때 빈자리를 찾아주는 기능도 아까 만든 번호판 인식과 동일한 방법으로 하면 된다.

def on_seat_result(e: ft.FilePickerResultEvent):
    file = e.files[0]
    save_path = os.path.join(os.getcwd(), file.name)

    # 파일 저장
    with open(file.path, "rb") as f:
        content = f.read()
    with open(save_path, "wb") as f:
        f.write(content)

    # 저장된 이미지로 인식
    image_control.src = save_path

    seat_output.value = get_seat(file.name)

    page.update()


seat_file_picker = ft.FilePicker(on_result=on_seat_result)
page.overlay.append(seat_file_picker)
page.add(ft.ElevatedButton("Choose seat",
on_click=lambda _: seat_file_picker.pick_files()))

이렇게 구현하였다.

사진이 보여질 때 아래가 잘리는건 아직 안 고쳐서 저렇게 나오는데 아무튼 오른쪽 아래 자리가 비어있는 사진을 넣었더니 제대로 인식 되어서 빈자리 위치가 출력된다.

def on_audio_result(e: ft.FilePickerResultEvent):
    file = e.files[0]
    save_path = os.path.join(os.getcwd(), file.name)

    # 파일 저장
    with open(file.path, "rb") as f:
        content = f.read()
    with open(save_path, "wb") as f:
        f.write(content)

    audio_output.value = get_speech(file.name)

    page.update()
        
audio_file_picker = ft.FilePicker(on_result=on_audio_result)
page.overlay.append(audio_file_picker)
page.add(ft.ElevatedButton("Choose audio",
on_click=lambda _: audio_file_picker.pick_files()))

음성 인식으로 텍스트 변환하는 기능도 비슷하게 만들면 된다.

오디오 파일을 넣으면 텍스트로 변환해서 출력된다.

 

이제 오디오 파일에서 출력된 텍스트를 이용해 해당 번호의 기사한테 카톡을 자동 전송해주면 된다.

카톡 전송은 이전 글에서 썼던 거 그대로 함수로 만들면 되고 숫자 추출은

def findnum(text):
    numbers = re.findall(r'\d+', text)
    return int(numbers[0])

이렇게 했다. 

def on_audio_result(e: ft.FilePickerResultEvent):
    file = e.files[0]
    save_path = os.path.join(os.getcwd(), file.name)

    # 파일 저장
    with open(file.path, "rb") as f:
        content = f.read()
    with open(save_path, "wb") as f:
        f.write(content)

    recog_text = get_speech(file.name)

    print(findnum(recog_text))
    sendtalk(recog_text, findnum(recog_text))

    audio_output.value = recog_text 

    page.update()

on_audio_result 함수에 sentalk 부분을 추가해주면 된다.

실행하면 이렇게 텍스트 추출도 잘 되고 아래에 3을 잘 인식해서 출력하는 걸 확인할 수 있다.