imx6ul蓝牙语音识别项目之6:语音格式说明以及整合与实际效果演示

前面我们准备好了所有的软件硬件,现在是时候开始正在的业务逻辑功能的实现了。 语音数据的格式 语音遥控器走的是BLE, 对于Voice Over BLE有多种方案,不同的厂家和方案商都不同的实现。下面我们使用TI的来说明,其他的也是类似的。 这里面主要是说明了各种格式,以及传递协议。 我们需要接受和decoder语音,那么就需要搞明白这些东西。 具体而言,语音的Profile如下: 交互过程如下: 注意第一包语音数据有头部: 语音数据从Gatt Notification中获取过来,我们先说一下这个压缩后的语音格式ADPCM。 具体可以参考: 简单而言,使用的是差分压缩: 下面是ADPCM的压缩与解压图: 解压后我们得到的是PCM audio data, 格式为PCM

Continue reading »

imx6ul蓝牙语音识别项目之5:BLE基础与imx6ul上的BLE外设的使用

前面我们准备好了下面这些软件: BlueZ 5.49及其运行需要的组建 百度语音识别及其运行需要的依赖库 Controller的驱动 并编译好了测试代码。 那么接下来,我们就需要和语音遥控器连接了,但是在此之前需要对BLE有所了解。 BLE VS Wifi VS ZigBee BLE属于Personal network, 工作距离近, 一般在10m内。 BLE协议架构 Core Specification 与

Continue reading »

imx6ul蓝牙语音识别项目之4:构建ARM Linux语音识别环境

语音识别的选择 前面我们准备好了BlueZ stack, 接下来就需要准备语音识别库了。对于语音识别,国内主要的提供商有: 科大讯飞 图灵机器人 思必驰信息科技有限公司 北京捷通华声科技股份有限公司 百度语音 北京云知声信息技术有限公司 哦啦语音 但是,我们是在ARM Cortex-A7单核上面跑,平台为ARM Linux,而且我们不准备跑python,而是使用C/C++, python脚本写代码会很快,但是效率较低,在这里可能不那么合适。 同时,考虑到我们需要从BlueZ那边获取音频,且音频数据量不小,为了有更好的体验,所以用C/C++会较好。 国内提到语音识别,那么大家会很可能马上想打的是科大讯飞,但是科大讯飞最新的Linux SDK库,里面有各prebuilt shared library,这个shared

Continue reading »

imx6ul蓝牙语音识别项目之3:用户态蓝牙配置

stack的划分 在前面的文章中,我们已经配置好了内核态对蓝牙的支持, 包括驱动以及内核态的stack。 Linux蓝牙的stack为BlueZ, 参考前面的文章的图片,可以知道,内核态和用户态使用的是MGMT接口来通讯。 底层主要负责和Controller数据的传输,而数据的传输接口一般为USB,SDIO以及串口。 具体而言,功能如下: 其中个人认为比较复杂的是SMP,内核态中对: 控制 数据 这两类信息通过socket接口传递到了用户态。MGMT作为控制接口,定义了大量的控制命令。同时将Controller的数据使用HCI方式传递给用户态的BlueZ daemon, 即下面图中说到的bluetoothd bluetoothd使用D-Bus保留控制和数据接口,用于应用程序与stack的交互。 还有一些工具可以用来完成对stack中信息的获取。 更新stack 现在stack的版本已经到了5.49, 这个版本开始支持mesh了。其中最为重要的是5.47版本,这个版本修正和正式使用D-Bus接口来完成绝大部分操作的接口的暴露。  同时Gatt的支持也变得比较完善,而Yocto中的版本一般都在5.43左右,属于比较老的版本。 因此我们需要做的事情是升级Yocto中的BlueZ版本。

Continue reading »

imx6ul蓝牙语音识别项目之2: 添加蓝牙Controller支持

蓝牙架构 在Linux中蓝牙的stack分层如下: 从总体上看分为两层, 一个在内核态,一个在用户态,内核态。 在内核态中的部分暴露了一个特殊的Socket给用户态,然后用户态使用命令+参数的格式传递给内核态。而如果硬件有反馈信息,一般是事件,那么会有callback消息上来。 硬件说明 对于蓝牙,一般都是模组,例如有些是BT Wifi模组,即BT-Wifi为一体的模组。 这种模组一般是通过UART,SDIO,或者USB接口与SoC的某类总线连接。 而模组本身其实也带有固件,甚至里面自己跑着操作系统,这个时候可能就需要下载固件。这个固件是由内核发现设备的时候从用户态获取,然后通过总线现在到模组中。 内核态的配置 对于现在的比较新的内核一般都有蓝牙的stack支持,以及驱动。 如同前面所说,蓝牙自己在内核态创建了一种新的socket来和上面的用户态通信。我们可以看到内核态中的muenuconfig中,蓝牙位于Networking support中: 选中了Bluetooth subsystem support后就有驱动等支持。 对于通用,常用的蓝牙dongle都有对应的驱动: 可以看到支持的范围很广: USB

Continue reading »

imx6ul语音识别项目之硬件准备

硬件 在一些时间的延误后,终于收到了顺丰过来的板子,本以为需要到年后了。听说板子的延误是因为发现了一个小问题。 收到板子后打开看到的是盒子包装,看起来“高大上”的感觉: 打开,里面有一张V3 软件的BSP, 网线, OTG USB 线,以及电源线: 核心的板子看起来不错,至少做工和基本可见的布线很漂亮: 但是板子的尺寸比我想象的小。 软件 在将关盘拷贝到电脑后,发现结构和以前IoT和Industry里面是类似的: . ├── 01-Document ├── 02-Images ├── 03-Tools

Continue reading »

OpenWRT中使用无线网卡做中继器与AP热点

中继器与AP的实现 这里我们假定中继器完成下面这样的一个功能: Wired Network —> Wireless Network —> 上级无线路由器 即从外部插入一个网线,通过imx6UL上面的无线网卡将数据转发到上级的路由器上面, 当然也可以完成下面这样的传送: Wireless Network(AP mode) –> Wireless Network(Client) –> 上级无线路由器 即设立一个AP热点,相当于一个路由器,然后再将这个AP的数据通过另外一个无线网卡转发到上一级的路由器或者WLAN上面。

Continue reading »

OpenWRT中使用mpd作为音频Server及其使用

说明 MPD可以播放音乐与streaming Radio,可以用于娱乐用。其官网的说法为:

即MPD是CS架构的Daemon端。 接下来我们将在iMX6UL上面使用MPD, 并在手机与Ubuntu等上面使用其Client来控制与播放音乐。 ALSA验证声卡发声 要完成音乐的播放,首先iMX6UL需要可以播放声音。 iMX6UL使用的Codec是WM8960, 这个和TQE9使用的是一样的。 在播放之前,我们先查看声卡是哪个:

首先需要确定ALSA识别了哪些声卡,然后再确定声卡的设备Index, 例如这里面WM8960不是Card0,所以如果直接默认使用aplay来播放,那么就会出错。 当然启动的时候也有:

确定设备Index后,我们需要一个WAV文件来播放。 直接使用MP3来convert一个: 然后我们使用wavinfo查看一下wav文件的属性:

Continue reading »

OpenWRT添加无线USB网卡

说明 要完成网线网卡的驱动需要在内核中添加驱动,同时还需要将固件放入rootfs中正确的位置,如果需要固件的话。 内核驱动添加 因为内核中对常规的USB网卡均支持,所以直接添加即可, 例如下面是对9170的支持: Firmware添加 在menuconfig中直接添加: 启动确认 启动后,我们需要等待rootfs完成后再插入, 这样子可以比较容易看到log, 对于TPLink的其中一款,对应的log如下:

从log看,加载了对应的固件。配置country code。这个FW位于:

因为这个网卡具备WPS功能,有一个按键,所以有一个input设备。 对于另外一个USB网卡:

  然后就可以看到对应的网卡设备了:

Continue reading »

【IMX6UL开发板试用体验】OpenWRT有线网络的配置

在前面编译完成后,就可以烧写测试启动了。 但是启动后发现了一些问题。本次我们说明一下如何使用OpenWrt中的wired LAN。 网卡驱动问题 本身板子有两个网口,其中一个没有变压器转换器,另外一个在Uboot中使用是没有问题的,可以正常的tftp下载kernel与dtb,但是在Linux,OpenWRT启动后,如果配置网络IP地址就会出现不停的up与down的情况 udhcpc (v1.20.2) started fec 2188000.ethernet eth0: Freescale FEC PHY driver [Generic PHY] (mii_bus:phy_addr=2188000.ethernet:00, irq=-1) IPv6:

Continue reading »