Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ad1217/python-scom7330
A tool to manipulate various data, including Audio Libraries (ex CustomAudioLib.bin) for the SCOM 7330 repeater
https://github.com/ad1217/python-scom7330
ham-radio hamradio scom scom-7330
Last synced: 3 months ago
JSON representation
A tool to manipulate various data, including Audio Libraries (ex CustomAudioLib.bin) for the SCOM 7330 repeater
- Host: GitHub
- URL: https://github.com/ad1217/python-scom7330
- Owner: ad1217
- License: mit
- Created: 2021-01-05T15:59:58.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2021-03-05T23:20:12.000Z (almost 4 years ago)
- Last Synced: 2024-09-17T05:51:21.817Z (4 months ago)
- Topics: ham-radio, hamradio, scom, scom-7330
- Language: Python
- Homepage:
- Size: 114 KB
- Stars: 0
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# SCOM 7330 Speech Library Tool
![Unit Tests](https://github.com/ad1217/SCOM7330_SpeechLib_Tool/workflows/Unit%20Tests/badge.svg)
This is a tool to manipulate Audio Libraries (such as
`CustomAudioLib.bin`) for the SCOM 7330 repeater, reverse engineered
from the provided `BuildSpeechLib.exe`.The official tool, as well as default audio libraries, manuals,
firmware, etc. can be found at
http://www.scomcontrollers.com/7330firmware .## Speech Library Format
**Remember that this is reverse engineered (so not guaranteed to be
accurate), and subject to change with firmware updates****This was derived from firmware release V1.8b,
BuildSpeechLib.exe V1.2.0 (built 5/13/2018)**The speech library file is composed of 4 sections:
- [Header](#header) (`0x100` bytes)
- [Image Header](#image-header) (`0x100` bytes)
- [Word Index](#word-index) (variable length, rounded up to the nearest `0x100`)
- [Word Data](#word-data) (variable length)The header and image header contain metadata and the word index is a
lookup table into the data. Unused space is filled with `0xff` instead
of `0x00`, for unclear reasons.In the following sections, byte ranges are presented as
`inclusive:exclusive`, like in Python. For example, `0x00:0x05`
includes the bytes `0x00`, `0x01`, `0x02`, `0x03`, and `0x04`. All
addresses in tables are relative to the start of the section, unless
stated otherwise.### Header
- Address: `0x00`
- Length: `0x100`| Byte | 0x00:0x05 | 0x05:0x15 | 0x15:0x21 | 0x21:0x38 | 0x38 | 0x39:0x3c | 0x3c:0x3d | 0x3d:0x100 |
|:------|:-----------|:----------|:----------|:----------|:-----|:----------|:----------|:-----------|
| Value | `SCOM\x00` | name | version | timestamp | mode | firstFree | zeros | (empty) |- `name`, `version`, and `timestamp` are just ASCII strings, and have
no apparent function beyond display.
- `mode` is 3 in `BuildSpeechLib.exe`'s normal mode, 2 in the extended
arguments form. I am not sure what this means, exactly.
- `firstFree` is the size of the file minus `0x100`, presumably to
account for this header's size. Unclear what this is used for, as it
also occurs (with the `0x100` included) in the [Image Header](#image-header)
- `zeros` is two two-byte arguments to the function in
`BuildSpeechLib.exe` which were passed in as literal zeros. Unclear
function.### Image Header
- Address: `0x100`
- Length: `0x100`| Byte | 0x00:0x03 | 0x03 | 0x04:0x06 | 0x06:0x09 | 0x09:0x100 |
|:------|:---------------|:---------------|:-------------|:----------|:-----------|
| Value | `\x00\x02\x00` | index_size_mid | max_word + 1 | firstFree | (empty) |- I'm not sure what the purpose of the constant in `0x00:0x03` is
- `index_size_mid` is the middle byte of the [Word Index](#word-index)
size. Since that size is rounded to `0x100`, this is just the index
size shifted down 1 byte.
- `max_word + 1` is the highest word file contained, plus one.
Not really sure why it's plus one.
- `firstFree` is the length of the file.
Seems to be redundant with the value in the [Header](#header).### Word Index
- Address: `0x200`
- Length: 4 times the maximum word code, rounded up to the nearest `0x100`| Byte | (word code * 4):(word code * 4) + 3 |
|:------|:------------------------------------|
| Value | word data address |This section is a lookup table mapping the word code to the address of
the entry in the [Word Data](#word-data) section, relative to the file
start. All un-used entries are blank (`0xff`). Each entry is 4 bytes
long, but the address is stored just in the first 3 bytes (with the
last one being `0xff`.### Word Data
- Address: `0x200` plus the the length of the [Word Index](#word-index),
as stored in the [Image Header](#image-header).
- Length: 3 times the number of files, plus the length of each fileFor each entry:
| Byte | 0x00:0x03 | 0x03:end of file |
|:------|:-------------------------|:-----------------|
| Value | end of file data address | file data |- `end of file data address` is the address of the end of the audio file data.
- `file data` is the contents of a raw file (as per
[Audio Files](#audio-files)), but with every byte greater than 127 xor'ed
with 127 for some unclear reason.## Audio Files
The input/output audio files are in the format specified in the SCOM manual:
- 8000 Hertz sampling rate
- Single channel (mono) audio
- μ-law encoding
- Raw headerless fileYou can convert wav files (for example) to this format with `sox`:
```sh
sox --type wav .wav --type ul --rate 8k .raw
```or from this format to wav:
```sh
sox --type ul --rate 8k --channels 1 .raw --type wav .wav
```## Disclaimer
I am not affiliated with S-COM in any way. I make no guarantees of the
correctness of the code. Don't break your stuff.