위 챗 애플 릿 음성 동기 화 스마트 인식 실현 사례 코드 분석
작은 프로그램의 일부 응용 장면 에서 음성 문자 전환 에 대한 수요 가 있 을 수 있다.기 존의 방법 은 보통 애플 릿 의 녹음 기능 을 통 해 음성 파일 을 녹음 한 다음 에 음성 스마트 인식 WebApi(예 를 들 어 바 이 두 클 라 우 드 AI 플랫폼,과대 통신 플랫폼)를 호출 하여 음성 파일 을 문자 정보 로 전환 하 는 것 이다.이상 의 방법 은 비교적 번 거 롭 고 사용자 의 체험 성 이 떨어진다.
이 문 제 를 해결 하기 위해 위 챗 은 동시통역 플러그 인 을 직접 열 었 습 니 다.애플 릿 작성 자 는 이 플러그 인 을 직접 사용 하여 음성 동시통역 개발 을 할 수 있 습 니 다.이 글 은 앞 뒤 통합 애플 리 케 이 션 의 전체 사례 를 통 해 음성 을 실시 간 으로 변환 하고 음성 을 서버 백 엔 드 백업 에 업로드 할 예정 이다.
2.동시통역 플러그 인 소개
위 챗 동시통역 은 위 챗 지 에서 음성 팀,위 챗 번역 팀 과 공공 플랫폼 이 공동으로 내 놓 은 동시통역 개방 인터페이스 로 음성 변환 문자,텍스트 번역,음성 합성 인 터 페 이 스 를 첫 번 째 로 개방 하여 개발 자 에 게 에 너 지 를 부여 합 니 다.
1.위 챗 애플 릿 배경 에 플러그 인 추가
위 챗 애플 릿 배경 에 들 어가 기->설정 에 들 어가 기->제3자 설정->플러그 인 추가->동시통역 검색->추가 완료.
2.위 챗 애플 릿 에서 플러그 인 사용
애플 릿 app.json 파일 에 플러그 인 버 전 추가 등 정보:
"plugins": {
"WechatSI": {
"version": "0.3.3",
"provider": "wx069ba97219f66d99"
}
},
페이지 프로그램 파일 에 플러그 인 도입:
/* index.js */
const plugin = requirePlugin("WechatSI")
// ** ** **recordRecoManager**
const manager = plugin.getRecordRecognitionManager()
recordRecoManager 대상 의 방법 목록:방법.
매개 변수
설명 하 다.
start
options
식별 시작
stop
종료 식별
onStart
callback
정상적으로 녹음 인식 을 시작 할 때 이 사건 을 호출 합 니 다.
onRecognize
callback
새로운 식별 내용 이 돌아 오 면 이 사건 을 호출 합 니 다.
onStop
callback
식별 종료 이벤트
onError
callback
식별 오류 이벤트
공식 개발 문서:플러그 인의 음성 인식 관리자
3.음성 동기 화 전환 의 전단 실현
1.인터페이스 UI 와 조작
UI 는 위 챗 공식 DEMO:버튼 을 길 게 눌 러 녹음 하고 버튼 을 풀 어 실시 간 으로 녹음 을 문자 로 변환 합 니 다.
사용 자 는 동기 화 된 텍스트 를 편집 할 수 있 으 며,원본 음성 파일 과 텍스트 를 백 엔 드 서버 에 업로드 할 수 있 습 니 다.
2.코드 구현
음성 동기 화 변환 의 주요 코드:
//
const plugin = requirePlugin("WechatSI");
// ** ** **recordRecoManager**
const manager = plugin.getRecordRecognitionManager();
/**
*
*/
onLoad: function () {
//
app.getRecordAuth();
//
this.initRecord();
},
...
/**
*
*
*/
initRecord: function () {
// ,
manager.onRecognize = (res) => {
let currentData = Object.assign({}, this.data.currentTranslate, {
text: res.result,
});
this.setData({
currentTranslate: currentData,
});
this.scrollToNew();
};
//
manager.onStop = (res) => {
let text = res.result;
console.log(res.tempFilePath);
if (text == "") {
this.showRecordEmptyTip();
return;
}
let lastId = this.data.lastId + 1;
let currentData = Object.assign({}, this.data.currentTranslate, {
text: res.result,
translateText: " ",
id: lastId,
voicePath: res.tempFilePath,
duration: res.duration
});
this.setData({
currentTranslate: currentData,
recordStatus: 1,
lastId: lastId,
});
//
this.addRecordFile(currentData, this.data.dialogList.length);
//
this.scrollToNew();
};
//
manager.onError = (res) => {
this.setData({
recording: false,
bottomButtonDisabled: false,
});
};
},
/**
*
*/
streamRecord: function (e) {
let detail = e.detail || {};
let buttonItem = detail.buttonItem || {};
//
manager.start({
lang: buttonItem.lang,
});
this.setData({
recordStatus: 0,
recording: true,
currentTranslate: {
//
create: util.recordTime(new Date()),
text: " ",
lfrom: buttonItem.lang,
lto: buttonItem.lto,
},
});
//
this.scrollToNew();
},
/**
*
*/
streamRecordEnd: function (e) {
let detail = e.detail || {}; // detail
let buttonItem = detail.buttonItem || {};
// stop
if (!this.data.recording || this.data.recordStatus != 0) {
console.warn("has finished!");
return;
}
manager.stop();
this.setData({
bottomButtonDisabled: true,
});
},
텍스트 인식 을 편집 하고 업로드 한 주요 코드:
/**
*
*/
data: {
edit_text_max: 200,
remain_length: 200,
edit_text: "",
is_focus: false,
tips: "",
index: -1,
voicePath: "",
},
/**
*
*/
onLoad: function (options) {
//
this.setEditText(options.content)
this.setData({
index: index,
oldText:options.content,
voicePath: options.voicePath
})
},
/**
*
*/
editInput: function (event) {
console.log(event)
if (event.detail.value.length > this.getEditTextMax()) {
} else {
this.data.edit_text = event.detail.value
this.updateRemainLength(this.data.edit_text)
}
},
/**
*
*/
editConfirm: function (event) {
let json=this.data.edit_text
// api webApi
wx.uploadFile({
url: api.wxFileUploadUrl,
filePath: this.data.voicePath,
name: "file",
header: {
Authorization: wx.getStorageSync("loginFlag"),
"Content-Type": "multipart/form-data",
},
formData: {
openId: app.globalData.userInfo.openId,
realName: " ",
json: JSON.stringify(json),
},
success: (result) => {
console.log("success:", result);
if (result.statusCode == "200") {
let data = JSON.parse(result.data);
console.log("data", data);
if (data.success == true) {
let module = data.module;
console.log("module", module);
app.showInfo(" ");
setTimeout( ()=>{
wx.navigateBack();
}, 2000)
} else {
app.showInfo(" " + data.errMsg + ", ");
wx.navigateTo({
url: "/pages/index/index",
});
}
} else {
app.showInfo(" , ");
wx.navigateTo({
url: "/pages/index/index",
});
}
},
fail: (result) => {
console.log("fail", result);
wx.navigateTo({
url: "/pages/index/index",
});
},
complete: () => {},
});
},
4.백 엔 드 SpringBoot 음성 파일 업로드 webApi1.SpringBoot 프로젝트 API 관련 구조 트 리
2.파일 업로드 도구 류 의 실현
tools 도구 패키지 에 서 는 파일 이 통용 되 는 파일 업로드 도구 류 를 저장 합 니 다.이 도구 류 는 설정 이 지정 한 폴 더 에 파일 을 업로드 하고 파일 정 보 를 upload 에 기록 합 니 다.file 표 에 있 습 니 다.
/**
*
*
* @author zhuhuix
* @date 2020-04-20
*/
@Entity
@Getter
@Setter
@Table(name = "upload_file")
public class UploadFile {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@NotNull(groups = Update.class)
private Long id;
/**
*
*/
@Column(name = "real_name")
private String realName;
/**
*
*/
@NotNull
@Column(name = "file_name")
private String fileName;
/**
*
*/
@NotNull
@Column(name = "primary_name")
private String primaryName;
/**
*
*/
@NotNull
private String extension;
/**
*
*/
@NotNull
private String path;
/**
*
*/
private String type;
/**
*
*/
private Long size;
/**
*
*/
private String uploader;
@JsonIgnore
@Column(name = "create_time")
@CreationTimestamp
private Timestamp createTime;
public UploadFile(String realName, @NotNull String fileName, @NotNull String primaryName, @NotNull String extension, @NotNull String path, String type, Long size, String uploader) {
this.realName = realName;
this.fileName = fileName;
this.primaryName = primaryName;
this.extension = extension;
this.path = path;
this.type = type;
this.size = size;
this.uploader = uploader;
}
@Override
public String toString() {
return "UploadFile{" +
"fileName='" + fileName + '\'' +
", uploader='" + uploader + '\'' +
", createTime=" + createTime +
'}';
}
}
파일 저장 소 클래스:UploadFileRepository.java
/**
* DAO
*
* @author zhuhuix
* @date 2020-04-03
*/
public interface UploadFileRepository extends JpaRepository<UploadFile, Long>, JpaSpecificationExecutor<UploadFile> {
// JpaRepository CrudRepository , findById,save,delete CRUD
}
UploadFileRepository 인 터 페 이 스 는 JpaRepository 및 CrudRepository 인 터 페 이 스 를 계승 하여 findById,save,delete 등 CRUD 방법 을 실현 하 였 습 니 다.파일 업로드 도구 인터페이스:UploadFileTool.java
/**
*
*
* @author zhuhuix
* @date 2020-04-20
*/
public interface UploadFileTool {
/**
*
* @param multipartFile
* @return
*/
UploadFile upload(String uploader,String realName,MultipartFile multipartFile);
}
파일 업로드 도구 구현 클래스:UploadFileToolImpl.java
/**
*
*
* @author zhuhuix
* @date 2020-04-20
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class UploadFileToolImpl implements UploadFileTool {
private final UploadFileRepository uploadFileRepository;
@Value("${uploadFile.path}")
private String path;
@Value("${uploadFile.maxSize}")
private long maxSize;
public UploadFileToolImpl(UploadFileRepository uploadFileRepository) {
this.uploadFileRepository = uploadFileRepository;
}
@Override
@Transactional(rollbackFor = Exception.class)
public UploadFile upload(String uploader, String realName, MultipartFile multipartFile) {
//
if (multipartFile.getSize() > maxSize * Constant.MB) {
throw new RuntimeException(" " + maxSize + "MB");
}
//
String primaryName = FileUtil.mainName(multipartFile.getOriginalFilename());
String extension = FileUtil.extName(multipartFile.getOriginalFilename());
//
String type = getFileType(extension);
//
LocalDateTime date = LocalDateTime.now();
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyyMMddhhmmssS");
String nowStr = "-" + date.format(format);
String fileName = primaryName + nowStr + "." + extension;
try {
String filePath = path + type + File.separator + fileName;
File dest = new File(filePath).getCanonicalFile();
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
multipartFile.transferTo(dest);
if (ObjectUtil.isNull(dest)) {
throw new RuntimeException(" ");
}
UploadFile uploadFile = new UploadFile(realName, fileName, primaryName, extension, dest.getPath(), type, multipartFile.getSize(), uploader);
return uploadFileRepository.save(uploadFile);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
}
/**
*
*
* @param extension
* @return
*/
private static String getFileType(String extension) {
String document = "txt doc pdf ppt pps xlsx xls docx csv";
String music = "mp3 wav wma mpa ram ra aac aif m4a";
String video = "avi mpg mpe mpeg asf wmv mov qt rm mp4 flv m4v webm ogv ogg";
String image = "bmp dib pcp dif wmf gif jpg tif eps psd cdr iff tga pcd mpt png jpeg";
if (image.contains(extension)) {
return "image";
} else if (document.contains(extension)) {
return "document";
} else if (music.contains(extension)) {
return "music";
} else if (video.contains(extension)) {
return "video";
} else {
return "other";
}
}
}
이 프로그램 코드 에 서 는@Value 주 해 를 사용 하여 설정 파일 의 uploadFile.path 및 uploadFile.max size 인 자 를 가 져 옵 니 다.일반적으로 프로젝트 정적 설정 파일 에 다음 과 같이 쓰 입 니 다(yml 설정 파일).
#
uploadFile:
path: C:\startup\file\
# /M
maxSize: 50
3.애플 릿 업로드 파일 인터페이스의 실현wx-miniprogram 패 키 지 는 애플 릿 CRM webApi 의 인 터 페 이 스 를 정의 하고 애플 릿 은 webApi 를 호출 하여 파일 업로드 및 기타 기능 을 실현 합 니 다.
/**
* Crm webApi
*
* @author zhuhuix
* @date 2020-03-30
*/
@Slf4j
@RestController
@RequestMapping("/api/wx-mini")
@Api(tags = " Crm ")
public class WxMiniCrmController {
private final WxMiniCrm wxMiniCrm;
public WxMiniCrmController(WxMiniCrm wxMiniCrm) {
this.wxMiniCrm = wxMiniCrm;
}
@ApiOperation(value = " ")
@PostMapping(value = "/fileUpload")
public ResponseEntity fileUpload(HttpServletRequest request) {
MultipartHttpServletRequest req = (MultipartHttpServletRequest) request;
MultipartFile multipartFile = req.getFile("file");
String openId = req.getParameter("openId");
String realName = req.getParameter("realName");
String json = req.getParameter("json");
return ResponseEntity.ok(wxMiniCrm.uploadFile(json, openId,realName, multipartFile));
}
}
위 챗 애플 릿 CRM 서비스 인터페이스:WxMiniCrm.자바
/**
* CRM
*
* @author zhuhuix
* @date 2020-04-20
*/
public interface WxMiniCrm {
/**
* json ,
*
* @param json json
* @param openId
* @param realName
* @param multipartFile
* @return
*/
Result<UploadFile> uploadFile(String json, String openId, String realName,MultipartFile multipartFile);
}
위 챗 애플 릿 CRM 서비스 구현:Wx MiniCrmImpl.자바
/**
* CRM
*
* @author zhuhuix
* @date 2020-04-20
*/
@Slf4j
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class WxMiniCrmImpl implements WxMiniCrm {
private final UploadFileTool uploadFileTool;
public WxMiniCrmImpl(UploadFileTool uploadFileTool) {
this.uploadFileTool = uploadFileTool;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Result<UploadFile> uploadFile(String json, String openId,String realName, MultipartFile multipartFile) {
return new Result<UploadFile>().ok(uploadFileTool.upload(openId,realName, multipartFile));
}
}
4.애플 릿 업로드 파일 인터페이스 보기Swagger 2 를 방문 하면 이 인 터 페 이 스 를 볼 수 있 습 니 다.Swagger 2 와 SpringBoot 의 통합 은 참고 할 수 있 습 니 다SpringBoot JWT 인증 메커니즘 프로젝트 통합 Swagger 2
5.실제 테스트
음성 테스트 정상
배경 으로 파일 업로드:
업로드 한 로그 정보 보기:
총결산
위 챗 애플 릿 음성 동기 화 스마트 인식 실현 사례 코드 분석 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 위 챗 애플 릿 음성 동기 화 스마트 인식 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 지원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
애플 릿 이미지 새로 고침, nginx 재 작성 url 제거 인자이전에 nginx 로 이미지 서버 를 만 들 었 는데 전단 에 작은 프로그램 을 사 용 했 습 니 다. 작은 프로그램 이 출시 된 후에 그림 이 새로 고침 되 지 않 는 것 을 발 견 했 습 니 다. 조사 한 결과 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.