50浏览
查看: 50|回复: 0

[K10教程] K10单向语音传输(传声筒)

[复制链接]
本帖最后由 PY学习笔记 于 2025-1-19 21:02 编辑

上一次看到论坛有人发了一个远程扩音器,但是不是都是K10的,于是我基于K10官方固件实现了。
1.行空板介绍
行空板K10集成ESP32-S3、摄像头、2.8寸彩色LCD、麦克风、扬声器、WiFi蓝牙模块、RGB指示灯及多种传感器和扩展接口于一体;支持图像检测、语音识别、语音合成、mind+图形化编程,MicroPython编程,是一款专为信息科技课程教学需求而研发的开发板
2.I2S介绍

I2S(Inter-IC Sound)是一种广泛应用于数字音频传输的串行接口标准,最初由飞利浦公司开发。它用于在集成电路之间传输音频数据,定义了音频数据的传输格式、时序和控制信号。

I2S基本信号

I2S接口通常由三类信号线组成:


  • 时钟线(SCK):提供同步音频数据传输的时钟信号,确定数据传输的速度和时序。SCK的频率=2x采样频率x位宽。

  • 左/右声道线(LRCK):指示当前传输的是左声道还是右声道的数据。LRCK的频率=采样频率。

  • 数据线(SD):用于传输实际的音频数据,位宽通常为16位或32位。TX方向为Serial Data Out(SDOUT),RX方向为Serial Data In(SDIN)。


主从工作模式

I2S工作模式可以是主模式(Master Mode)或从模式(Slave Mode)。在主模式下,设备提供时钟信号(SCK)和帧同步信号(LRCK);在从模式下,设备接收这些信号。

数据传输模式

I2S接口标准中存在三种数据传输模式:

  • 飞利浦标准模式(I2S mode):LRCK为低时表示左声道数据,为高时表示右声道数据。数据在SCK下降沿发送,在SCK上升沿采样。

  • 左对齐(Left Justified)模式:LRCK为高时表示左声道数据,为低时表示右声道数据。数据在SCK下降沿发送,在SCK上升沿接收。

  • 右对齐(Right Justified)模式:LRCK为高时表示右声道数据,为低时表示左声道数据。数据在SCK下降沿发送,在SCK上升沿接收。


数据位宽与位深

I2S中位宽和位深由主设备决定。位宽通常为16位或32位,位深表示音频数据量化后的精度。

I2S初始化配置

I2S的初始化配置包括时钟使能和GPIO口配置、配置为I2S模式、设置I2S时钟和采样率等。


3.测试代码

通过反复“解剖”官方的库,发现麦克风和喇叭的I2S可以使用deinit方法进行定义I2S总线(官方代码还是改一下deinit的意思是反初始化,建议使用init),就可以直接使用定义好的I2S进行使用。

发送方:

  1. from unihiker_k10 import mic,wifi
  2. import network
  3. import socket
  4. import time
  5. # Network Configuration
  6. SSID = 'ssid'
  7. PASSWORD = 'password'
  8. SERVER_IP = 'ip'
  9. SERVER_PORT = 12345
  10. def main():
  11.     wifi.connect(ssid=SSID,psd=PASSWORD,timeout=50000)
  12.     mic.reinit()
  13.     audio = mic.i2s
  14.     sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  15.     audio_buf = bytearray(1024)
  16.    
  17.     print('Starting audio capture and transmission...')
  18.    
  19.     try:
  20.         while True:
  21.          # Read audio data
  22.              num_read = audio.readinto(audio_buf)
  23.              if num_read > 0:
  24.              # Send data in smaller chunks to prevent packet loss
  25.                  chunk_size = 1024
  26.                  for i in range(0, num_read, chunk_size):
  27.                      chunk = audio_buf[i:min(i + chunk_size, num_read)]
  28.                      sock.sendto(chunk, (SERVER_IP, SERVER_PORT))
  29.                  time.sleep_ms(1)
  30.                
  31.     except Exception as e:
  32.         print('Error:', e)
  33.     finally:
  34.         audio.deinit()
  35.         sock.close()
  36. if __name__ == '__main__':
  37.     main()
复制代码

接收方:

  1. from unihiker_k10 import speaker,wifi
  2. import network
  3. import socket
  4. import time
  5. # Network Configuration
  6. SSID = 'ssid'
  7. PASSWORD = 'password'
  8. SERVER_IP = 'ip'
  9. SERVER_PORT = 12345
  10. def main():
  11.     wifi.connect(ssid=SSID,psd=PASSWORD,timeout=50000)
  12.     speaker.reinit()
  13.     audio = speaker.i2s
  14.     sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  15.    
  16.     print('Starting audio capture and transmission...')
  17.    
  18.     try:
复制代码

运行修改WiFi和IP见K10远程扩音器(对讲机) DF创客社区,效果相同。




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail