티스토리 뷰
오늘의 영감을 준 컨텐츠 - 다시 들으니 또 다르다.
김경일 교수님의 강연은 참 좋다.
https://youtu.be/WQZWEbkSB9s?t=441
나는 fit 이라 많이 고생해야 할 거 같다. 그래도 많은 재능이 있으니까 여러 도메인과 여러 규모의 회사에서 일해 볼 수 있겠지. 20-30대 조금 고생하자. 예민한 댓가로. >직업으로 생각하면 안 된다.
오래 살 건데 맞는 일을 꼭 찾아야 한다. > 20-30대에 꼭 동떨어진 일을 해보면서 맞는 일을 찾아라.
환경을 자주 바꿔야 하는 사람.
근데 나는 왜 그게 이렇게 자주 바뀔까. 뭐 유사하긴 한데. 그냥 잘하면 재밌다.
수학이다가 프로그래밍이다가. 예전처럼 컴퓨터 공학이라면 영문이든 뭐든 너무 재밌었던 그 때로 돌아가고 싶다.
https://www.boannews.com/media/view.asp?idx=104140
피라미가 아니라 상어를 공격하는 공격 - 공급망 공격
https://www.boannews.com/media/view.asp?idx=104138
개인적으로 엄청 공감갔던 기사
https://cloud.google.com/speech-to-text/docs/basics?hl=ko#embedded-audio
공식문서
사수님 피드백
https://cloud.google.com/speech-to-text/docs/base64-encoding?hl=ko
오디오를 base64로 인코딩하기
wav 파일에 header에는 sample rate 와 format이 있다.
sample rate는 파형을 얼마나 나눌 것인가 인데 잘게 나눌수록 음질이 좋아진다.
format은 wav이고 오디오를 string 타입으로 바꾸기 위해서 base64로 인코딩하여 구글 서버로 보낸다. gcp에서는 이를 디코딩하여 오디오 파일로 변환하고 STT api를 사용하여 string 형태로 반환해준다. 나는 이를 print한다.
"encoding":"FLAC",
"sampleRateHertz":16000,
위의 링크에서 다음 코드는 순차적으로 wav 파일의 header에는 format과 sample rate에 해당된다.
*프로그래밍 마일스톤
자체 서버망 만들기
1. main()
2. wav 파일 로드
3. 로드 파일을 구글로 들고가기
4. string 값으로 반환받기
5. 반환 받은 값을 printf로 찍기
사실 간단한 거라고 사수님은 이야기하는데, 나는 뭔가 아이디어가 없어서 인지 어렵게 느껴졌다. 모든 창조는 기존의 것들에서 조금 더 발전된 것이기에 기존의 것들에 대해서 더 많이 공부해야할 거 같다.
사수님이 준 팁은 fopen으로 파일을 불러 온 후 그 상태로 구조체에 넣어서 포인터를 사용해라고 하셨는데, 개인적으로 포인터를 사용한 일반 코드는 읽을 수 있지만 뭔가 파일 시스템을 건드리는 거나 직접 포인터를 쓰는 것에는 아직 두려움이 있었던 거 같다. 나의 부족함을 느꼈고 더 열심히 정진해야 함을 느꼈다.
c/cpp에서 사실 포인터는 가장 강력한 무기인데, 그걸 사용하지 않고서 메인 언어가 cpp라고 이야기하는 것은 다소 어폐가 있다고 본다. 코테 준비를 파이썬으로 하더라도 cpp를 업무상에서 하면서 포인터와 친숙하게 만들어야겠다.
2번에서 이상하게 너무 어렵게 생각해서 내가 알고 있던 fopen을 사용을 안 하려고 했었다. 자신감 부족이라고 생각되기도 한다. 또한 좋은 구글링 키워드 선택은 야근과 고생을 줄여준다
https://stackoverflow.com/questions/13660777/c-reading-the-data-part-of-a-wav-file
이 코드를 찾기 위해서 내가 서치한 키워드: cpp wav file load
//https://stackoverflow.com/questions/13660777/c-reading-the-data-part-of-a-wav-file
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <fstream>
#include <cstdint>
using std::cin;
using std::cout;
using std::endl;
using std::fstream;
using std::string;
typedef struct WAV_HEADER
{
/* RIFF Chunk Descriptor */
uint8_t RIFF[4]; // RIFF Header Magic header
uint32_t ChunkSize; // RIFF Chunk Size
uint8_t WAVE[4]; // WAVE Header
/* "fmt" sub-chunk */
uint8_t fmt[4]; // FMT header
uint32_t Subchunk1Size; // Size of the fmt chunk
uint16_t AudioFormat; // Audio format 1=PCM,6=mulaw,7=alaw, 257=IBM Mu-Law, 258=IBM A-Law, 259=ADPCM
uint16_t NumOfChan; // Number of channels 1=Mono 2=Sterio
uint32_t SamplesPerSec; // Sampling Frequency in Hz
uint32_t bytesPerSec; // bytes per second
uint16_t blockAlign; // 2=16-bit mono, 4=16-bit stereo
uint16_t bitsPerSample; // Number of bits per sample
/* "data" sub-chunk */
uint8_t Subchunk2ID[4]; // "data" string
uint32_t Subchunk2Size; // Sampled data length
} wav_hdr;
// Function prototypes
int getFileSize(FILE* inFile);
int main(int argc, char* argv[])
{
wav_hdr wavHeader;
int headerSize = sizeof(wav_hdr), filelength = 0;
const char* filePath;
string input;
if (argc <= 1)
{
cout << "Input wave file name: ";
cin >> input;
cin.get();
filePath = input.c_str();
}
else
{
filePath = argv[1];
cout << "Input wave file name: " << filePath << endl;
}
FILE* wavFile = fopen(filePath, "r");
if (wavFile == nullptr)
{
fprintf(stderr, "Unable to open wave file: %s\n", filePath);
return 1;
}
//Read the header
size_t bytesRead = fread(&wavHeader, 1, headerSize, wavFile);
cout << "Header Read " << bytesRead << " bytes." << endl;
if (bytesRead > 0)
{
//Read the data
uint16_t bytesPerSample = wavHeader.bitsPerSample / 8; //Number of bytes per sample
uint64_t numSamples = wavHeader.ChunkSize / bytesPerSample; //How many samples are in the wav file?
static const uint16_t BUFFER_SIZE = 4096;
int8_t* buffer = new int8_t[BUFFER_SIZE];
while ((bytesRead = fread(buffer, sizeof buffer[0], BUFFER_SIZE / (sizeof buffer[0]), wavFile)) > 0)
{
/** DO SOMETHING WITH THE WAVE DATA HERE **/
cout << "Read " << bytesRead << " bytes." << endl;
}
delete[] buffer;
buffer = nullptr;
filelength = getFileSize(wavFile);
cout << "File is :" << filelength << " bytes." << endl;
cout << "RIFF header :" << wavHeader.RIFF[0] << wavHeader.RIFF[1] << wavHeader.RIFF[2] << wavHeader.RIFF[3] << endl;
cout << "WAVE header :" << wavHeader.WAVE[0] << wavHeader.WAVE[1] << wavHeader.WAVE[2] << wavHeader.WAVE[3] << endl;
cout << "FMT :" << wavHeader.fmt[0] << wavHeader.fmt[1] << wavHeader.fmt[2] << wavHeader.fmt[3] << endl;
cout << "Data size :" << wavHeader.ChunkSize << endl;
// Display the sampling Rate from the header
cout << "Sampling Rate :" << wavHeader.SamplesPerSec << endl;
cout << "Number of bits used :" << wavHeader.bitsPerSample << endl;
cout << "Number of channels :" << wavHeader.NumOfChan << endl;
cout << "Number of bytes per second :" << wavHeader.bytesPerSec << endl;
cout << "Data length :" << wavHeader.Subchunk2Size << endl;
cout << "Audio Format :" << wavHeader.AudioFormat << endl;
// Audio format 1=PCM,6=mulaw,7=alaw, 257=IBM Mu-Law, 258=IBM A-Law, 259=ADPCM
cout << "Block align :" << wavHeader.blockAlign << endl;
cout << "Data string :" << wavHeader.Subchunk2ID[0] << wavHeader.Subchunk2ID[1] << wavHeader.Subchunk2ID[2] << wavHeader.Subchunk2ID[3] << endl;
}
fclose(wavFile);
return 0;
}
// find the file size
int getFileSize(FILE* inFile)
{
int fileSize = 0;
fseek(inFile, 0, SEEK_END);
fileSize = ftell(inFile);
fseek(inFile, 0, SEEK_SET);
return fileSize;
}
프로그램이 정상적으로 실행 되었다. fopen때문에 워닝이 떠서
#define _CRT_SECURE_NO_WARNINGS
를 추가해주었다.
아무튼 파일을 불러와서 구조체에 넣었으니까. 이제 이걸 base64로 인코딩하면 된다.
모든 것은 영어로 구글링하자
오늘의 회사 생활 느낀점 끄적
난 운이 좋은 거 같다. 회사 환경이 자유로워서 좋은 거 같다.
사수님 이야기대로라면 온열기구와 가습기도 신청할 수 있을 듯
내일 해야 할 일
1. little/big endian 확인
2. 크기 단위 확인, 샘플 갯수일까, 바이트 단위일까
3. google "c++ read big file"
'신입일기(웹툰예정)' 카테고리의 다른 글
1/19 업무일지 + TIL (0) | 2022.01.19 |
---|---|
1/18 업무일지+TIL (0) | 2022.01.18 |
1/14 업무일지+TIL (0) | 2022.01.14 |
1/13 TIL + 업무일지 (0) | 2022.01.13 |
1/12 업무일지 + TIL (0) | 2022.01.12 |
- Total
- Today
- Yesterday
- 신은영대표
- CBDC
- 신입개발자일기
- 크래프톤
- 20대대통령
- 테크스펙
- IT뉴스브리핑
- 자연어처리 #TIL
- sap코리아
- 개발자일기
- 포스코 #데이터사이언스 #데이터분석
- 종만북
- 빅데이터분석 #데이터분석실무 #포스코빅데이터아카데미
- 신입일기
- 식별자오류
- 유엔여성기구성평등센터
- 주가반영
- 인공지능투명성
- IT주식
- 주가부양책
- 신은영
- 뱅샐
- 2과목 소프트웨어 개발
- 김정주이사
- 데이터분석실무 #포스코빅데이터아카데미
- 인공지능윤리성
- 빅데이터 #데이터분석
- 극단적선택
- 여성대표
- 대혐오시대
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |