@callimacus/thamyr-反应-内在
反应原生(出品和裸出品)的Thamyr SDK. 包起来
@callimacus/thamyr-react,所以钩,存储,和反应类型是一样的
网络SDK所暴露的——这个软件包将它们缩小到在本地和本地
增加了本地语音录音机.
npm install @callimacus/thamyr-react-native
同伴依赖性 : react >=18, (中文(简体) ), react-native >=0.72。 。 。 .
开始
import {useInitThamyr, useThamyr, useConnection} from '@callimacus/thamyr-react-native';
function App() {
useInitThamyr({clientId: 'cal-pk-…'});
return <Chat />;
}
function Chat() {
const {history, sendEvent} = useThamyr();
const {status} = useConnection();
// …
}
和网络SDK有什么不同
这里没有列出的一切 行为都一样,因为它是完全相同的 代码.
语音记录返回字节
网络录音员给你一个 Blob这个给你 Uint8Array音频
以 inputEvent.data.file 超过 socket.io, 只有输入的数组存活
原生之行:反应原生 Blob 是进入本地的把手
BlobModule的字节在JS从不存在,所以插座。 iO不能读它,和
new File([...]) ——网络路径使用的东西——没有有用的本土等同物.
服务器将文件名降下, MIME 则以两种方式( socket. io 二进制
陷害他们,所以没有损失.
录音机需要一个适配器,您从 expo-audio数字 :
import {useMemo} from 'react';
import * as ExpoAudio from 'expo-audio';
import {
createExpoAudioAdapter,
useVoiceRecorder,
useThamyr,
SLInputEventType,
UserInteractionType,
} from '@callimacus/thamyr-react-native';
function VoiceButton() {
const {sendEvent} = useThamyr();
const adapter = useMemo(() => createExpoAudioAdapter(ExpoAudio), []);
const {state, audioLevels, startRecording, stopRecording, error} = useVoiceRecorder({
adapter,
onRecordingComplete(audio) {
sendEvent(UserInteractionType.CREATE_ROUND, {
inputEvent: {type: SLInputEventType.question, data: {value: '', file: audio}},
});
},
});
// …
}
适配器是故意通过而不是默认的. 如果这个软件包
进口 expo-audio metro会静态地解决
消费者,所以一个从不记录音频的应用程序 将无法捆绑仅仅因为没有
安装了它。 将模块移交保存 expo-audio 从这里
软件包的依赖性图表,所以它输入检查和测试时没有本地的
工具链。 对于录音机之外 expo-audio,执行
VoiceRecorderAdapter 自己来.. start编号 :stop编号 :cancel 在任何原生模块之上.
后记录自动停止 silenceDuration (默认值1800毫秒)
silenceThreshold (默认 - 45 dBFS),和硬站 maxDuration (默认)
联合国.
未再出口的钩子
| 不详 | 为什么 | 相反 |
|---|---|---|
useTtsAudio | 构造一个 HTMLAudioElement (单位:千美元)new Audio(url)(中文(简体) ) | 播放来自 extractTtsAudio(block.data) 带有 expo-audio 播放器 |
uiObserver 配置 | 快照意味着 querySelectorAll + 键 getBoundingClientRect | 尚未提供当地资料(SOL-1084) |
setConsent, (中文(简体) ), setGeo, (中文(简体) ), initIntent,, , , , , , , , | @callimacus/intent浏览器 API | @callimacus/intent/native - 见下文 |
extractTtsAudio 编辑 TtsAudio 类型 为: 导出后,您可以获取
音频 URL 出自回复, 随你喜欢播放; 只有网络播放
钩子不见了.
有意追踪
意向网页的构建完全不能在本地导入: 它读取
localStorage 财务报告和审定财务报表 document 在模块范围中, 它在赫尔墨斯之前投出
您的应用程序使。 因此,SDK在“原生反应”中解决
@callimacus/thamyr-core是因为 react-native (a) 在没有意图的情况下
函数作为警告- 即时出现, 所以共享代码不会崩溃, 但它们
什么都别做.
意取自自有出土入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入出入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入 直接拨接:
import * as RN from 'react-native';
import {MMKV} from 'react-native-mmkv';
import {createNativeAdapters, initIntentNative, mmkvStorage} from '@callimacus/intent/native';
initIntentNative({
clientId: 'cal-pk-…',
consent: true,
adapters: createNativeAdapters(RN, {storage: mmkvStorage(new MMKV())}),
});
运输, 和为什么声音还没有发挥作用
文本聊天有用 . 发送音频不,原因也不是这个软件包 也不是你的应用 —— 是TLS 不匹配将连接强制到传输上 无法在 React Industrial 上携带二进制。 细节很重要 因为症状 这是误导.
本地反应无法打开 WebSocket 到 api.callimacus.ai。 。 。 . 主持人是
TLS 1. 3 - 仅 - 它拒绝用 TLS 1.2 握手
protocol_version 警报( 已核实) openssl s_client -no_tls1_3) (中文(简体) ). 反应
本地的WebSocket以近代号1006和
OSStatus -9836,这是苹果 errSSLPeerProtocolVersion ("不良协议")
(原始内容存档于2018-09-29). version". 反应土著 HTTP 密码 堆栈与同一主机是好的,因为
穿过 NSURLSession,它的确谈判 TLS 1.3 ——符合
使用旧的安全运输路线的 WebSocket 路径没有.
SDK因此倒回了HTTP长波,而文本在它之上起作用.
但二进制无法在回放原生投票中通过. 引擎.io的民调
有效载荷是文本,所以 encodePayload 编码每个数据包
supportsBinary: false (“二进制包的强制基数64编码”),和
engine.io-parser 浏览器构建路径
encodeBlobAsBase64(new Blob([data])) – 虽然React Industrial拒绝构建
a 来自 a ArrayBuffer 完全 (“ 创建来自“ ArrayBuffer” 和
'ArrayBufferView' 不支持'). 因此,音频字节被丢入
控制台出错 . forceBase64 无法帮助:投票已经逼迫
正是建立Blob的分支.
通过启用 TLS 1.2 使 React Industrial 使用 WebSocket 迁移
在 API 主机上 (nginx: 保留) TLSv1.3 添加 TLSv1.2 带有匹配的密码
套间). 在韦伯索克特, encodePacket 运行与 supportsBinary: true 手和双手
输入的数组直接到 WebSocket.send() 没有Blob,没有基础64,所以有声
工作时没有进一步的 SDK 更改,文本作为奖金会得到更低的延迟.
在此之前,录音工作 onRecordingComplete 给您正确的字节;
只有发送失败 .
值得我们知道的事
- UUIDs (英语). 赫尔墨斯船没有全球
crypto核心回归到crypto.getRandomValues接下来Math.random(),所以没有扔,但 安装react-native-get-random-values在条目文件的顶端,您可以得到加密的随机交互标识. gatherClientInfo()返回空字符串userAgent, (中文(简体) ),language,以及screenResolution当地人——没有navigator.userAgent或者说window.screen屏幕大小Dimensions如果你需要的话.- 微机权限. 添加
NSMicrophoneUsageDescription(iOS)和RECORD_AUDIO(Android) (英语). 在博览会下,expo-audio配置插件这样做 . - 套接字认证 穿过socket.io's
auth有效载荷,不是Authorization页眉 — React Industrial's WebSocket transport 忽略extraHeaders,服务器读取handshake.auth.token无需采取行动; 人们注意到,因为被丢掉的头像木头一样令人吃惊.