Skip to content

Commit

Permalink
feat: align the parameters of both Android and iOS
Browse files Browse the repository at this point in the history
narol1024 committed May 5, 2024
1 parent fadb792 commit f9cd8c4
Showing 12 changed files with 212 additions and 131 deletions.
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
```
在调用内置录音器时,需要提前授权
```

# react-native-tencent-asr

[![npm version](https://img.shields.io/npm/v/react-native-tencent-asr.svg?style=flat)](https://www.npmjs.com/package/react-native-tencent-asr)
Original file line number Diff line number Diff line change
@@ -19,7 +19,12 @@ public class FlashFileRecognizerModule extends ReactContextBaseJavaModule
implements QCloudFlashRecognizerListener {
public static final String NAME = "FlashFileRecognizerModule";

private String _appId;
private String _secretId;
private String _secretKey;
private String _token;
private Promise _promise;
private QCloudFlashRecognitionParams _requestParams;
private QCloudFlashRecognizer _recognizer;

public FlashFileRecognizerModule(ReactApplicationContext reactContext) {
@@ -32,72 +37,75 @@ public String getName() {
return NAME;
}

// 初始化Recognizer
private void initializeRecognizer() {
_recognizer =
_token != null
? new QCloudFlashRecognizer(_appId, _secretId, _secretKey, _token)
: new QCloudFlashRecognizer(_appId, _secretId, _secretKey);
_recognizer.setCallback(this);
}

@ReactMethod
public void configure(final ReadableMap configParams) {
Log.d("录音文件识别极速版", "配置AppID、SecretID、SecretKey, Token参数: " +
configParams.toString());

String appId = configParams.getString("appId");
String secretId = configParams.getString("secretId");
String secretKey = configParams.getString("secretKey");
String token = configParams.getString("token");
_appId = configParams.getString("appId");
_secretId = configParams.getString("secretId");
_secretKey = configParams.getString("secretKey");
_token = configParams.getString("token");

_recognizer =
token != null
? new QCloudFlashRecognizer(appId, secretId, secretKey, token)
: new QCloudFlashRecognizer(appId, secretId, secretKey);

_recognizer.setCallback(this);
_requestParams = (QCloudFlashRecognitionParams)
QCloudFlashRecognitionParams.defaultRequestParams();
// 支持传音频文件数据或者音频文件路径,如果同时调用setData和setPath,sdk内将忽略setPath的值
_requestParams.setVoiceFormat(ConfigParameterUtils.getStringOrDefault(
configParams, "voiceFormat", "aac"));
_requestParams.setEngineModelType(ConfigParameterUtils.getStringOrDefault(
configParams, "engineModelType", "16k_zh"));
_requestParams.setFilterDirty(
ConfigParameterUtils.getIntOrDefault(configParams, "filterDirty", 0));
_requestParams.setFilterModal(
ConfigParameterUtils.getIntOrDefault(configParams, "filterModal", 0));
_requestParams.setFilterPunc(
ConfigParameterUtils.getIntOrDefault(configParams, "filterPunc", 0));
_requestParams.setConvertNumMode(ConfigParameterUtils.getIntOrDefault(
configParams, "convertNumMode", 1));
_requestParams.setSpeakerDiarization(ConfigParameterUtils.getIntOrDefault(
configParams, "speakerDiarization", 0));
_requestParams.setFirstChannelOnly(ConfigParameterUtils.getIntOrDefault(
configParams, "firstChannelOnly", 1));
_requestParams.setWordInfo(
ConfigParameterUtils.getIntOrDefault(configParams, "wordInfo", 0));
_requestParams.setCustomizationID(ConfigParameterUtils.getStringOrDefault(
configParams, "customizationID", ""));
_requestParams.setHotwordID(
ConfigParameterUtils.getStringOrDefault(configParams, "hotwordID", ""));
}

@ReactMethod
public void flashFileRecognizer(ReadableMap configParams, Promise promise) {
String audioFilePath = configParams.getString("filePath");
public void recognize(ReadableMap configParams, Promise promise) {
String audioFilePath = configParams.getString("audioFilePath");

if (audioFilePath == null) {
promise.reject(new RuntimeException("Missing filePath parameter."));
promise.reject(new RuntimeException("audioFilePath参数缺失"));
return;
}
_promise = promise;

File audioFile = new File(audioFilePath);
if (!audioFile.exists()) {
promise.reject(new RuntimeException("Audio file does not exist."));
promise.reject(new RuntimeException("音频文件不存在"));
return;
}
try {
FileInputStream fs = new FileInputStream(audioFile);
byte[] audioData = new byte[fs.available()];
fs.read(audioData);
QCloudFlashRecognitionParams params =
(QCloudFlashRecognitionParams)
QCloudFlashRecognitionParams.defaultRequestParams();
// 支持传音频文件数据或者音频文件路径,如果同时调用setData和setPath,sdk内将忽略setPath的值
params.setData(audioData);
params.setVoiceFormat(ConfigParameterUtils.getStringOrDefault(
configParams, "voiceFormat", "aac"));
params.setEngineModelType(ConfigParameterUtils.getStringOrDefault(
configParams, "engineModelType", "16k_zh"));
params.setFilterDirty(
ConfigParameterUtils.getIntOrDefault(configParams, "filterDirty", 0));
params.setFilterModal(
ConfigParameterUtils.getIntOrDefault(configParams, "filterModal", 0));
params.setFilterPunc(
ConfigParameterUtils.getIntOrDefault(configParams, "filterPunc", 0));
params.setConvertNumMode(ConfigParameterUtils.getIntOrDefault(
configParams, "convertNumMode", 1));
params.setSpeakerDiarization(ConfigParameterUtils.getIntOrDefault(
configParams, "speakerDiarization", 0));
params.setFirstChannelOnly(ConfigParameterUtils.getIntOrDefault(
configParams, "firstChannelOnly", 1));
params.setWordInfo(
ConfigParameterUtils.getIntOrDefault(configParams, "wordInfo", 0));
params.setCustomizationID(ConfigParameterUtils.getStringOrDefault(
configParams, "customizationID", ""));
params.setHotwordID(ConfigParameterUtils.getStringOrDefault(
configParams, "hotwordID", ""));

_recognizer.recognize(params);
_promise = promise;
initializeRecognizer();
_requestParams.setData(audioData);
_recognizer.recognize(_requestParams);
} catch (Exception e) {
promise.reject("IOException",
"An error occurred while reading the audio file.", e);
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
// @see SDK doc: https://cloud.tencent.com/document/product/1093/35723

package com.tencentasr.module;
import android.content.pm.PackageManager;
import android.media.MediaRecorder;
import android.Manifest;
import android.app.Activity;
import android.os.Build;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
@@ -24,15 +25,22 @@
import com.tencentasr.util.ConfigParameterUtils;
import java.io.File;
import java.io.FileInputStream;
import java.util.LinkedList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;

public class OneSentenceRecognizerModule extends ReactContextBaseJavaModule
implements QCloudOneSentenceRecognizerListener {
public static final String NAME = "OneSentenceRecognizerModule";
private String _appId;
private String _secretId;
private String _secretKey;
private String _token;
private QCloudOneSentenceRecognizer _recognizer;
private ReactContext _reactContext;
private boolean _isRecording = false;
private MediaRecorder _mediaRecorder;
private QCloudOneSentenceRecognitionParams _customParams;
private QCloudOneSentenceRecognitionParams _requestParams;

public OneSentenceRecognizerModule(ReactApplicationContext reactContext) {
super(reactContext);
@@ -57,50 +65,57 @@ public String getName() {
return NAME;
}

// 初始化Recognizer
private void initializeRecognizer() {
Activity currentActivity = getCurrentActivity();

_recognizer =
_token != null
? new QCloudOneSentenceRecognizer(currentActivity, _appId,
_secretId, _secretKey, _token)
: new QCloudOneSentenceRecognizer(currentActivity, _appId,
_secretId, _secretKey);
_recognizer.setCallback(this);
}

@ReactMethod
public void configure(final ReadableMap configParams) {
Log.d("一句话识别模块", "配置AppID、SecretID、SecretKey, Token参数: " +
configParams.toString());

String appId = configParams.getString("appId");
String secretId = configParams.getString("secretId");
String secretKey = configParams.getString("secretKey");
String token = configParams.getString("token");
_appId = configParams.getString("appId");
_secretId = configParams.getString("secretId");
_secretKey = configParams.getString("secretKey");
_token = configParams.getString("token");

_customParams =
_requestParams =
(QCloudOneSentenceRecognitionParams)
QCloudOneSentenceRecognitionParams.defaultRequestParams();
_customParams.setVoiceFormat(ConfigParameterUtils.getStringOrDefault(
_requestParams.setVoiceFormat(ConfigParameterUtils.getStringOrDefault(
configParams, "voiceFormat", "aac"));
_customParams.setFilterDirty(
_requestParams.setFilterDirty(
ConfigParameterUtils.getIntOrDefault(configParams, "filterDirty", 0));
_customParams.setFilterModal(
_requestParams.setFilterModal(
ConfigParameterUtils.getIntOrDefault(configParams, "filterModal", 0));
_customParams.setFilterPunc(
_requestParams.setFilterPunc(
ConfigParameterUtils.getIntOrDefault(configParams, "filterPunc", 0));
_customParams.setConvertNumMode(ConfigParameterUtils.getIntOrDefault(
_requestParams.setConvertNumMode(ConfigParameterUtils.getIntOrDefault(
configParams, "convertNumMode", 1));
_customParams.setEngSerViceType(ConfigParameterUtils.getStringOrDefault(
_requestParams.setEngSerViceType(ConfigParameterUtils.getStringOrDefault(
configParams, "engineModelType", "16k_zh"));

_recognizer =
token != null
? new QCloudOneSentenceRecognizer(appId, secretId, secretKey, token)
: new QCloudOneSentenceRecognizer(appId, secretId, secretKey);
_recognizer.setCallback(this);
}

@ReactMethod
public void recognizeWithUrl(ReadableMap configParams) {
Log.d("一句话识别模块:", configParams.toString());
String url = configParams.getString("url");

try {
_customParams.setSourceType(
String url = configParams.getString("url");
_requestParams.setSourceType(
QCloudSourceType.QCloudSourceTypeUrl); // 调用方式:URL
_customParams.setUrl(
_requestParams.setUrl(
url); // 设置音频文件的URL下载地址(请替换为您自己的地址)
_recognizer.recognize(_customParams);
initializeRecognizer();
_recognizer.recognize(_requestParams);
} catch (Exception e) {
e.printStackTrace();
System.out.println("exception msg" + e.getMessage());
@@ -110,44 +125,38 @@ public void recognizeWithUrl(ReadableMap configParams) {
@ReactMethod
public void recognizeWithParams(ReadableMap configParams) {
Log.d("一句话识别模块, 完整参数:", configParams.toString());
String audioFilePath = configParams.getString("filePath");
String audioFilePath = configParams.getString("audioFilePath");

if (audioFilePath == null) {
System.out.println("Missing filePath parameter..");
System.out.println("audioFilePath参数缺失");
return;
}

File audioFile = new File(audioFilePath);
if (!audioFile.exists()) {
System.out.println("Audio file does not exist.");
System.out.println("音频文件不存在");
return;
}

try {
FileInputStream fs = new FileInputStream(audioFile);
byte[] audioData = new byte[fs.available()];
fs.read(audioData);
_customParams.setSourceType(QCloudSourceType.QCloudSourceTypeData);
_customParams.setData(audioData);
_recognizer.recognize(_customParams);
_requestParams.setSourceType(QCloudSourceType.QCloudSourceTypeData);
_requestParams.setData(audioData);
initializeRecognizer();
_recognizer.recognize(_requestParams);
} catch (Exception e) {
System.out.println("An error occurred while reading the audio file.");
}
}

@ReactMethod
public void startRecognizeWithRecorder(ReadableMap configParams) {
public void recognizeWithRecorder(ReadableMap configParams) {
try {
Log.d("一句话识别模块", "recognizeWithRecorder");
// TODO: 内置录音器
initializeRecognizer();
_recognizer.recognizeWithRecorder();
_recognizer.setQCloudOneSentenceRecognizerAudioPathListener(
new QCloudOneSentenceRecognizerAudioPathListener() {
public void callBackAudioPath(String audioPath) {
Log.d("一句话识别模块",
"callBackAudioPath: audioPath=" + audioPath);
}
});
} catch (Exception e) {
e.printStackTrace();
System.out.println("exception msg" + e.getMessage());
@@ -167,25 +176,36 @@ public void stopRecognizeWithRecorder() {
// 一句话识别结果回调
public void recognizeResult(QCloudOneSentenceRecognizer recognizer,
String result, Exception exception) {
try {
WritableMap params = Arguments.createMap();

JSONObject jsonObject = new JSONObject(result);
JSONObject response = jsonObject.getJSONObject("Response");

params.putString("requestId", response.getString("RequestId"));
params.putString("text", response.getString("Result"));
params.putInt("audioDuration", response.getInt("AudioDuration"));
params.putInt("wordSize", response.getInt("WordSize"));
try {
if (exception == null) {
JSONObject jsonObject = new JSONObject(result);
JSONObject response = jsonObject.getJSONObject("Response");
WritableMap resultBody = Arguments.createMap();
if (response.has("Error")) {
WritableMap errorMap = Arguments.createMap();
JSONObject errorObject = response.getJSONObject("Error");
errorMap.putString("code", errorObject.getString("Code"));
errorMap.putString("message", errorObject.getString("Message"));
resultBody.putMap("error", errorMap);
} else {
resultBody.putString("data", response.toString());
}
sendEvent(_reactContext, "DidRecognize", resultBody);
} else {
WritableMap errorMap = Arguments.createMap();
WritableMap resultBody = Arguments.createMap();
errorMap.putString("message", exception.getMessage());
resultBody.putMap("error", errorMap);
sendEvent(_reactContext, "DidRecognize", resultBody);
}

sendEvent(_reactContext, "DidRecognize", params);
} catch (Exception e) {
e.printStackTrace();
System.out.println("exception msg" + e.getMessage());
}
}

public void didStartRecord() { Log.d("一句话识别模块", "didStartRecord"); }

public void didStopRecord() { Log.d("一句话识别模块", "didStopRecord"); }
}
6 changes: 3 additions & 3 deletions example/src/App.tsx
Original file line number Diff line number Diff line change
@@ -2,7 +2,7 @@ import React from 'react';

import { StyleSheet, View, Text, SafeAreaView } from 'react-native';

import { RealTimeRecognizerApp } from './RealTimeRecognizerApp';
// import { RealTimeRecognizerApp } from './RealTimeRecognizerApp';
import { FlashFileRecognizerApp } from './FlashFileRecognizerApp';
import { OneSentenceRecognizerApp } from './OneSentenceRecognizer';

@@ -14,11 +14,11 @@ export default function App() {
<View style={styles.resultView}>
{result && <Text>识别结果: {result}</Text>}
</View>
<RealTimeRecognizerApp
{/* <RealTimeRecognizerApp
onRecognize={(result: string) => {
setResult(result);
}}
/>
/> */}
<OneSentenceRecognizerApp
onRecognize={(result: string) => {
setResult(result);
2 changes: 1 addition & 1 deletion example/src/FlashFileRecognizerApp.tsx
Original file line number Diff line number Diff line change
@@ -29,7 +29,7 @@ export function FlashFileRecognizerApp(props: any) {
'https://narol-blog.oss-cn-beijing.aliyuncs.com/blog-img/202405012158499.mp3'
);
const result = await FlashFileRecognizerModule.recognize({
filePath: dirs.DocumentDir + '/202405012158499.mp3',
audioFilePath: dirs.DocumentDir + '/202405012158499.mp3',
});
props.onRecognize(result.flashResult[0]?.text);
} catch (error) {
Loading

0 comments on commit f9cd8c4

Please sign in to comment.