yongsa0221의 고물상
Yt-dlp를 사용한 라즈베리파이 프로젝트 -2- 본문
본 프로젝트는 2023년에 작성되었다. 지금의 라이브러리와는 다를 수 있음
기존 IPC로 생각했던 것을 thread단위로 나누어서 작업하는것이 맞는 것 같다.
프로젝트 명은...
CactusSpeaker4raspi
11.24
기존 IPC로 생각했던 것을 thread단위로 나누어서 작업하는것이 맞는 것 같다.
문제가 되는 것은 nltk를 사용하기 위해서 어떤 방식으로 파이썬 코드와 자바 코드를 잘 버무려야 할지가 문제.
음성인식을 자바코드로 해야 할 것 같은데… 그러면 녹음 파일을 생성하고 파이썬 코드를 통해 텍스트 변환 및 토큰 추출을 하는 방식으로 구현해야 하는 것일까?
근데 현재 파이썬 코드로 음성인식 시 input audio를 따로 저장하지 않고 바로 텍스트 추출이 가능해서 굳이 녹음 파일을 만들어서 만든 녹음파일을 통해 텍스트 추출 및 토큰화를 해야하는지 모르겠다.
근데 또 라즈베리 파이 환경에서 구동시킬려면 프로그램 구동 환경을 따로 빼놓고 관리해야 할 것 같아서
자바 사용해서 녹음파일 생성 → 생성된 녹음파일 텍스트 추출, 토큰화 → 다시 자바에서 읽어서 처리하기
순으로 해야할듯?
11.25
이상한 버그를 발견했다
현재 유튜브 영상 음악 추출 부분이 파이썬으로 짜여있는데
자바에서 Process 를 생성해서 돌리면 될때가 있고 저장이 안될때가 있음
근데 터미널에서 쌩으로 파이썬 돌리면 잘만 돌아간다.
원인을 모르겠다. 환경 변수도 다 맞춰놧음..
Adele - Hello 는 또 졸라 잘된다. 이유를 모르겟음….
다 안되는 것도 아니고 되는것도 잇고 안되는 것도 잇음
yt dlp라이브러리 말고 그냥 java 라이브러리나 쌩으 다운받는법좀 찾아봐야겠다….
11.26
드디어 방법을 찾았다
타데이터를 추출하는 곳에서 계속 오류가 났서 다운로드가 안되었던 것 같다.
메타데이터 추출 코드를 다 지우니 잘 된다.
근데 왜 아직도 터미널 환경에서는 잘 됬엇는지는 몰?루
추가
아마 stdout 관련된 오류 같다. 정확히는 모르지만
python에서 불필요하게 print하는 코드를 지웠더니 잘 동작한다
CactusSpeaker4raspi 지금까지....
비디오 제목을 검색해서 재생하는 거까지 구현 완료
남은 과제는...
- 오디오 녹음 인식
- 기능별 쓰레드 분리
- 이벤트 리스너, 핸들러 처리
- 상태 만들기
- 환경설정 코드 빼기
12.03
Appconfig 클래스를 만들었다
appconfig인 만큼 싱글톤 패턴으로 생성하려고 했다
그러다 아싸리 static에서 초기화해버리는 방식으로 구현했다
정통적 싱글톤 패턴은 아니긴 하지만…
Appconfig 메서드는 다 static 메서드로 선언했다.
static {
Properties properties = new Properties();
InputStream input = null;
try {
input = new FileInputStream(PROPERTIES_FILE_PATH);
properties.load(input);
apiKey = properties.getProperty("api.key");
musicDirectory = properties.getProperty("music.directory");
audioDirectory = properties.getProperty("audio.directory");
pythonScriptsDirectory = properties.getProperty("pythonScript.directory");
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
문제는 appconfig에서 사용하는 app.properties의 경로가 빌드 환경에 따라 달라진다는 점.
라즈비안에서 옮겨서 빌드 시 일일히 수정해주어야할 판이다
그리고 현재 파이썬 스크립트가 app.properties에서 뽑아쓰는게 아니고 하드코딩으로 환경설정 부분이 넣어져 있어서 그것도 분리해야한다
현재 테스트 코드에 쓰레드 관련 테스트가 있어서 빌드시 테스트 안돌리고 빌드하는 설정을 넣었다.
문제가 된 부분은 jar를 만드는 부분이었는데..
- main class 못찾음
- 의존성 class 못찾음
jar 실행시 오류가 났다.
1번 문제는 manifest에 현재 프로젝트의 main 함수가 있는 클래스를 직접 넣어줬고
2번 문제는 그 아래 설정을 추가해 해결했다.
gradle의 기본 빌드 옵션은 fat-jar가 아니어서 따로 현재 프로젝트의 의존성을 한번에 넣어서 컴파일 하는 옵션을 추가해야 하는 것 같다.
fat-jar란? 모든 의존성에 있는 라이브러리가 자체 포함되어 있는 JAR 파일
프로젝트를 spring프레임워크를 사용하는 방식으로 바꾸고 있다.
현재 싱글톤 패턴과 같은 객체들을 static으로 만들어 사용했는데 spring의
@component 와 @serivce를 사용해서 인스턴스 생성을 한번만 해야 하는 객체들에게 넣어주었다.
얘네는 싱글톤처럼 IOC에서 관리한다고 하더라..
처음엔 spring을 환경 설정 파일관련 객체를 외부에서 의존성을 주입하기 위해 사용했는데, 프로젝트 구조 자체가 spring framework에 맞추어 구조화되어야 했다
@Getter
@Component
@Configuration
@PropertySource("classpath:app.properties")
public class AppConfig {
@Value("${api.key}")
private String apiKey;
@Value("${music.directory}")
private String musicDirectory;
@Value("${audio.directory}")
private String audioDirectory;
@Value("${pythonScript.directory}")
private String pythonScriptsDirectory;
public AppConfig() {
// field injected via spring
}
}
appConfig 관련 코드가 훨씬 간결해지긴 했는데...
라즈베리 환경에서라면 간결한 코드 < 성능 이지 않을까 생각이 든다.
얼마나 차이나겟냐만은 아무래도 IOC를 초기화하고 객체를 주입하는 것보다야 컴파일 시 static 시점에서 초기화 하는게 빠를 것 같다. 무엇이 좋을지는 잘모르겟지만 개발 환경에서는 확실히 spring을 사용하는 것이 훨씬 편하고 유지보수가 편한 느낌이 있긴 하다.
그리고....
spring framework를 사용하면서 테스트 코드를 다 수정해야하는 불가피한 상황이 벌어졌다…
배보다 배꼽인듯
12.05
현재 알파벳을 제외한 글자 관련해서 오류가 나 재생이 안되는 것들이 있다
python에서는 글자가 깨지지 않는데 java에서는 깨진다.. 수정 필요
python에서 한글 인식 안됨….
현재까지
play “검색어”를 입력하면
검색 → 오디오 추출→ 재생
까지 가능한 코드가 만들어졌다.
이제부터는 리팩터링만 하고 추가 기능은 나중에 구현해야될듯하다.
계획은,,,,
현재 코드는
Thread1 : state생성기(provider) : 주어진 명령(현재는 command line)을 받아 수행할 동작을 큐에 삽입
Thread2: state 핸들러(consumer) : 큐를 읽고 행동(유튜브 오디오 추출, 재생)
provider를 인터페이스로 만들어놓아서 최종 목표는 음성 인식을 통해 수행할 동작를 추출하는 것.
'예토전생' 카테고리의 다른 글
Yt-dlp를 사용한 라즈베리파이 프로젝트 -완- (3) | 2024.09.02 |
---|---|
Yt-dlp를 이용한 라즈베리파이 프로젝트 -1- (1) | 2024.09.02 |